[Música tocando] DAVID MALAN: Olá, todos. Este é supersection de CS50. Seções atribuídas não vai começar por mais uma semana. E assim, hoje, estou aqui com-- MARIA: Maria. DAVID MALAN: --to realmente Dê uma olhada problema definir um, o curso de primeiras semanas de material, se você orientado com CS50 IDE, um pouco do Linux, o sistema operacional que é rodando em IDE, bem como olhar para alguns da transição a partir do zero para C liderança até um conjunto de problemas. Assim, sem mais delongas, em um conjunto de problemas, você vai ser CS50 apresentou a IDE, que é esta programação baseada em web ambiente que nós usamos em ordem para escrever programas. Ele foi projetado para olhar muito reminiscente de um computador típico sistema executando uma operação sistema chamado Linux. Mas é na chamada nuvem, o que significa que todos na classe pode realmente ter o seu própria conta e usá-lo, também. Assim, a maioria de vocês provavelmente nunca usou um ambiente Linux antes ou talvez até mesmo um ambiente de linha de comando. E uma linha de comando ambiente é diferente. É tudo textual. É todos os comandos do teclado. E não é mousing, há ícones, sem janelas de diálogo, não há menus. É puramente texto. Assim, num primeiro momento, que tipo de se sente como um passo para trás em termos de sofisticação. Mas ele acaba sendo muito mais poderoso, certamente, para um cientista da computação, em última instância. Então, vamos dar uma olhada. Aqui estou a CS50.io, através do qual você pode entrar em CS50 IDE. E bem como no Scratch, há três áreas principais para essa tela. Assim, no lado esquerdo, temos o que vai ser o navegador de arquivos. E há essa pasta no top, que é agora vazia desde que eu me livrei de toda a minha arquivos antes supersection. E é aí que nós vamos salvar arquivos C que escrevemos. No canto superior direito, temos um lugar onde todo o nosso código vai ficar escrito. E, de fato, se eu clicar este plus, esta vai permitir que eu escolha Novo arquivo. E aqui eu posso começar a escrever código C ou, realmente, qualquer número de outras línguas. E, em seguida, na parte inferior, onde ela diz jharvard @ ide50-- e vocês vão dizer algo um pouco diferente-- o que foi este chamado? Janela de terminal. Sim. Assim, a janela de terminal é a linha de comando chamada interface através da qual você pode interagir com o sistema operacional subjacente. E, por agora, vamos fazem muito pouco uso de isto-- apenas para compilar, para olhar mensagens de erro que vemos, e para executar os nossos programas. Mas, afinal, vamos a fazê-lo muito mais, também. E você ainda pode instalar o software e administrar seu espaço de trabalho dentro CS50 IDE, bem. Mas mais sobre isso em outro momento. Então, vamos em frente e escrever um programa muito simples apenas que passar por um warm-up de ola.c, que é talvez o programa mais simples que podemos escrever. Eu já abriu uma nova guia. Eu estou indo para ir em frente e dizem incluem io.h. padrão Em seguida, int main (void). E então printf ("Olá, mundo" barra invertida n, citações perto, fechar parênteses, e-vírgula. Tudo certo. Então agora perceber minha janela é sem título. Então, eu estou indo muito rapidamente para ir até Arquivo, Salvar. E é importante que Eu chamo isso não "Olá". Assim, um erro muito comum, especialmente em um conjunto de problemas, é acidentalmente basta ligar para o seu programa "água" ou "ganancioso" ou "Mario" ou "crédito" ou semelhante. Mas você realmente quer fazer se você tem a extensão de arquivo porque esta é a única maneira que o compilador e também o editor de código sabe que você é realmente escrevendo código C. Então deixe-me ir em frente e clique em Salvar. E agora, também, o que CS50 IDE tem feito por nós é também é sintaxe destaque tudo. Então, ele é feito tudo muito colorido. E todo o propósito de que não é funcional. É só para desenhar os olhos para o conceitualmente diferentes peças deste programa. Então, vamos em frente e compilar isso. E eu posso compilar este em um par de formas. E em uma semana, o maneira old-school que fizemos era literalmente no comando linha-- "hello.c clang". E então eu pressione Enter. E nada parece acontecer na janela do terminal. Mas o que fez a mudança no IDE? Onde, novamente, apenas significa IDE Ambiente de desenvolvimento integrado. É uma maneira elegante de dizer este desenvolvimento integrado ambiente para o desenvolvimento de software. Então, o que mudou na interface do usuário? O que você notou que é diferente, Maria? MARIA: Eu notei algo sob a IDE50 pasta aqui. DAVID MALAN: Yeah. Então, aqui em cima, não só nós temos "hello.c". Nós também temos "a.out", que é tipo de nome mudo para um programa. Mas, na verdade, é o nome padrão para um programa quando você acabou de compilar o código e não dizer o compilador o arquivo de saída. Então, se eu quiser executar isso, eu precisa dizer ao compiler-- ou melhor, eu preciso dizer o espaço de trabalho que eu deseja executar o programa chamado "a.out". Enter. E não há "Olá, mundo ". Agora, o" ./ ". é realmente importante. Embora normalmente temos apenas escrever os nomes dos comandos, quando é um programa que você escrito, você quer dizer "./" porque que diz explicitamente Linux que você deseja executar um programa chamado "a.out" que está neste, onde dot significa que este directório que eu estou atualmente in, que passa a ser chamado de espaço de trabalho, "a.out. Porque se eu apenas disse: "a.out", Enter, Eu estou indo para obter "a.out comando não encontrado "porque o Computador-- porque eu inventei "a.out"; ele não veio com o Computador-- não sabe para onde olhar para ele, mesmo que seja à direita debaixo do meu nariz, por assim dizer. ESTÁ BEM. Assim nós poderíamos mudar isso para ser "clang -o Olá hello.c". E se eu pressione Enter, o programa é que isto vai saída para mim? Qual é o nome do arquivo? Sim, na parte de trás. Está certo. "Olá." Assim, "Olá" vai ser o nome do programa porque nós usamos um chamado argumento de linha de comando, que é apenas um modo de alterar o comportamento de o compilador para realmente saída um nome de arquivo específico. E, de fato, se eu aumentar para fora e olhar para cima aqui, agora eu tenho não só "a.out" e "hello.c", mas também "Olá", como bem. Então agora eu posso fazer "./hello," Enter. E não há "Olá, mundo". Mas lastly-- e esta agora será a convenção usamos todo o semestre, typically-- é você também pode simplesmente dizer "fazer Olá". E, de fato, ele está dizendo que é para cima a data porque ele já existe. Deixe-me ir em frente e remover, com o comando rm, tanto "a.out" - e dizer "remover a.out arquivo regular?" Isso significa apenas que, é você certeza de que deseja apagá-lo? Eu vou dizer que sim. E então eu estou indo para remover "Olá", mas não "hello.c". Eu estou indo para dizer "sim" explicitamente, mas de "y" é suficiente, como bem. E agora perceber se eu escreva ls-- que, recall, significa lista-- ele lista todos dos arquivos na minha pasta. E, de fato, se eu aumentar para fora e olhe no canto superior esquerdo, confirma que o que é nesta pasta, mesmo embora seja rotulado como IDE50-se aqui e não espaço de trabalho, é apenas "hello.c". Então agora aqui em baixo, se eu que "fazer Olá," Enter, agora eu vejo um comando muito mais tempo, mas um comando mais sofisticado que está acontecendo para ser útil nas semanas que virão. E agora eu posso dizer "./hello." Então, vamos dar um rápido passeio Comandos de algum outro Linux. Então por que não damos um passo para trás e realmente olhar para C mais geralmente, a transição a partir do zero a C, e, em seguida, concluir com um olhar no primeiro problema definido em C. Tudo bem. Então, eu estou indo para ir em frente e apenas limpa o meu espaço de trabalho com Control-L apenas para manter a tela limpa. Mas isso não tem funcional impacto de outra forma. Lembre-se que temos visto alguns comandos agora. Então nós vimos clang, que geralmente você não terá que executar manualmente mais. Nós em vez vou usar make. Mas vimos também ls, que mostra uma Lista dos arquivos no meu diretório. E agora porque é que existem duas há-- arquivos agora, "Olá" e "hello.c". Por que há uma estrela ou um asterisco após "Olá"? O que isso significa, com base no que vimos em uma semana? O que você acha? O que a estrela significa? MARIA: For-- o programa "Olá"? DAVID MALAN: "Olá *". Sim. Oh sim? Oh, executável. Está certo. Então isso significa que "Olá" é executável. Então, na verdade, é por isso Eu posso fazer "./hello." Tudo certo. Então, o que mais eu posso fazer aqui? Bem, acontece que eu puder também criar diretórios. Então deixe-me ir em frente e criar, por exemplo, um diretório "pset1". E o problema especificação definida terá que fazer exatamente isso, assim você não tem que se lembrar hoje. Mas "pset1 mkdir" parece não ter nenhum impacto. Mas, novamente, nenhuma mensagem de erro geralmente é uma coisa boa. Então, se eu digitar "ls" agora-- ah, agora Eu tenho um arquivo executável chamado "Olá", um arquivo C chamado "hello.c". E, em seguida, a barra final, por assim falar, significa que este é um diretório. Então, na verdade, agora eu quero abri-lo. E eu não clicar duas vezes sobre ele como em uma GUI, um ambiente gráfico. I em vez dizer "cd pset1." Enter. Nada de interessante parece ter aconteceu, exceto meu pequeno alerta aqui-- esta é a maneira de Linux de lembrar me onde estou, então o que pasta é aberta. É só me dizer explicitamente em oposição a graficamente. E se eu digitar "ls", por que vejo outro solicitar imediatamente, você acha que, quando eu listar o conteúdo de pset1? MARIA: Você provavelmente não fazer tem alguma coisa lá dentro. DAVID MALAN: Yeah. Então nós não temos, obviamente, criado alguma coisa lá dentro porque eu só criou o diretório. Agora, se eu queria criar um file-- para exemplo, eu poderia criar um novo arquivo. E então eu poderia ir para Salvar e salve-o como, como, "mario.c" se você está fazendo a edição padrão do pset um. E então, como qualquer Mac ou PC, apenas escolher o "pset1 pasta, Salvar. E agora o arquivo está vazio. Mas vamos fazer zoom novamente para um segundo. Vamos fazer ls aqui. Agora vemos "mario.c". Portanto, há alguns outros comandos que vale a pena manter em mente ao longo do tempo-- claro, ou Control-L é o que eu tenho foi bater; mkdir temos visto; rm vimos, também, o que é para remover ou apagar um arquivo. Cuidado você pode Também-- e se você olhar em tutoriais on-line, você vai rm-rf é uma forma muito comum de dizer excluir uma pasta que tem coisas nele. Basta ser super, super cuidadosa. rf significa de forma recursiva eliminar tudo o que é você está tentando excluir e forçosamente excluí-lo. Então recursiva meios se é uma pasta com uma pasta com uma pasta com uma pasta, eliminar todos eles. E forçosamente significa nem sequer me perguntar sim ou não, estou certo? Portanto, é uma maneira super perigosa de apagar um monte de coisas rapidamente. Mas beware-- demasiado frequentemente faz um intrépido estudante apagar acidentalmente, digamos, pset um, por exemplo. MARIA: E se eles apenas fazer -r, eles vão para perguntar-lhes sobre cada arquivo único. DAVID MALAN: Qual é moderadamente irritante. MARIA: Sim. DAVID MALAN: Então é por isso muitos de nós, a auto incluído, tenho o hábito de usar o -rf. Mas é perigoso. Assim, o comprador tem cuidado. E então mv é uma espécie de curiosamente chamado. Então este é o comando de movimento, que se sente um pouco estranho porque você pode realmente usá-lo para mover arquivos de um lugar para outro. Por exemplo, suponha que eu errei. Suponha que eu criei um novo arquivo para o pset. E eu salva-lo como "greedy.c." Mas suponha que eu acidentalmente salve- em IDE50-- assim no meu próprio espaço de trabalho e não em pset1. Você pode ver tanto no canto superior esquerdo. Há "greedy.c." E há algumas soluções. Então, um, eu posso usar o forma amigável super- de apenas arrastando e soltando-o. E isso, na verdade, corrigir esse problema. Mas hoje, estamos tentando olhar para as formas mais misteriosas, mas poderosas de fazer isso. Então deixe-me tomar "ls" no pset1. E eu só vejo "mario.c." Deixe-me ir em frente e fazer "cd ..". Então CD novo é alterar diretório. ".." Significa que, embora? Da última vez eu disse "cd pset1 "para entrar em pset1. Portanto, quando digo "cd ..", o que estou fazendo? Para trás. Sim. Então ele vai para o pai chamada. Ir um nível acima, como sair de uma pasta. Então Enter. E, de fato, olhe o que ele fez. Ele me mudou apenas no espaço de trabalho, em vez de em pset1, que é em espaço de trabalho. E agora, se eu digitar "ls", há um monte de coisas. No existe "greedy.c". Então, agora deixe-me usar mv para, literalmente, mover "greedy.c" em pset1. E então um monte de comandos Linux funcionam exatamente como este. Eles não têm argumentos ou eles tomam uma argumento ou eles tomam dois linha de comando argumentos e assim por diante. E, neste caso, é literalmente fazendo o que ele diz que, embora succinctly-- mover greedy.c em pset1. Enter. Nada parece acontecer. Mas se eu fizer um ls novamente, ganancioso está desaparecido. E se eu fizer "cd pset1", Enter e, em seguida, ls novamente, agora é no lugar certo. Como um aparte, para se alguma razăo especial se você tiver intermitente conectividade de rede ou você está andando por aí campus com a sua tampa do laptop fechada e, em seguida, abri-lo de novo e de seu espaço de trabalho parece um pouco fora de sincronia, não é grande coisa. Apenas recarregar seu navegador janela, e que deveria resync de modo que o lado esquerdo navegador de arquivos parece exatamente como a janela do terminal. Não se preocupe. Em caso de dúvida, recarregar a página, assim desde que você salvou os arquivos já. ESTÁ BEM. Então mv também pode ser usado para renomear arquivos. E vamos dar uma olhada este comando final aqui. Assim suppose-- e esta é Super comum, também, desde o início. Alguns estudantes, ocasionalmente, criar um arquivo chamado, vamos dizer-- o que é mais uma? Como "WATER.C." Então eu vou gritar, para nenhuma razão, em todos os tampões. Mas isto não é o nome correto para o arquivo se somente porque nosso conjunto de problemas especificação não lhe disse para salvar o arquivo como todas as tampas "WATER.C." Em vez disso, esperamos "water.c" em letras minúsculas. E, de fato, este é problemático porque check50, um programa que você está indo reunir-se em problema definir um que testa automaticamente a correção do seu código vai gritar com você se não puder encontrar "water.c" em todas as minúsculas. Então, eu preciso consertar isso. Tantos caminhos diferentes para fazer isso, a primeira das quais seria a de Controle clique com o botão direito do mouse ou o nome do arquivo e apenas mudar Renomear. Totalmente bem para fazer isso. Mas, novamente, hoje, vamos fazê-lo um pouco mais extravagante. Vamos usar mv para mudar "WATER.C" a "water.c." Então, você também pode usar o primeiro argumento renomeá-lo para o segundo argumento se o segundo argumento não, está em verdade, uma pasta ou um nome de diretório. Tudo certo. E, por último, um pouco trick-- por isso estou em meu diretório do espaço de trabalho no momento. Se eu quiser entrar em um pset, Eu certamente posso digitar "cd pset1." Mas é tão tedioso para digitar "pset1" ou mais nomes de arquivos ou nomes de diretório ainda. Então, muitas vezes em Linux, o que você pode fazer é começar a digitar "PSE" e apenas se cansar, Tab bater, e deixá- a figura de computador para fora para você. Super útil para entrar na esse hábito. O único problema é se você tiver vários arquivos ou pastas a partir com a letra "P" ou "ps", você pode ter para digitar um pouco mais antes do computador sabe o que fazer. MARIA: Nós gostamos de atalhos. DAVID MALAN: Esta vontade poupar muito tempo. E também, como dissemos na aula, você pode rolar para cima na história, para cima e para baixo, para encontrar recentemente executada comandos, como bem. Tudo certo. Então, agora, vamos voltar nossa atenção de volta para um programa simples, Olá mundo. Então, nós compilamos esta exatamente. E agora, por que não tomamos um olhar para os tipos de dados e, em seguida, a transição de alguma correspondente blocos zero para C. MARIA: Awesome. Portanto, agora que você começou escrever programas em C, vamos começar a falar sobre tipos de dados e variáveis. Assim, alguns tipos de dados que você gostaria de saber a partir de agora são aqueles que são destacada em azul. Portanto, temos int em primeiro lugar, que significa inteiro. E que mantém inteiros, como você pode ter guessed-- de modo 1, 2, 3, e quaisquer outros inteiros que você pode pensar. DAVID MALAN: E também negativo. MARIA: E também os negativos, sim. E 0. Então nós temos carros alegóricos, que são números de ponto flutuante. Então, isso é todos os números reais que têm pontos decimais. Então, 5.0, 5.2, e ainda mais dígitos depois do ponto decimal, bem, e também os negativos. Então nós temos de char que é um personagem. Então eu acho que nós falamos sobre isso em palestra hoje. Mas nós temos cartas, para example-- A, B, C-- que pode ser armazenado como um char. Mas, então, nós temos muito mais símbolos que pode ser armazenado como um char. E aqueles são armazenados como ASCII. E então nós temos bool, que são Booleans. E aqueles avaliar como True ou Falso ou 1 e 0, respectivamente. DAVID MALAN: E lembre-se que boleano vem a partir da biblioteca CS50. Portanto, não é construído em C, mas é super útil para ter a noção de verdadeiro e falso. E mesmo que você pode penso-- fato divertido. Um bool tecnicamente precisa de quantos bits, verdadeiramente, para representar verdadeiro contra Falso? Quantos bits você acha você precisaria de, no máximo? Sim, apenas um. Assim, verifica-se que C não pode dar-lhe apenas um pouco. A menor unidade de medida você pode obter é oito. Então é um pouco um desperdício que você é utilizando um byte de toda, ou oito bits, para representar Verdadeiro ou Falso. Mas isso é apenas a maneira que é implementado em C na biblioteca de CS50. MARIA: E então os que estamos não vai falar sobre como extensivamente agora-- direito duplo, isso é para carros alegóricos maiores. Longo longo e curto são também para números inteiros. DAVID MALAN: De fato. Na edição de hackers de pset um, nós realmente usar longo, longo. Mas para a edição padrão, que não devem ser necessárias. MARIA: Cool. ESTÁ BEM. Então você deve ser operators-- provavelmente está familiarizado com a maioria destes. Adicionalmente, +; subtração, -. Para a multiplicação, temos a *. Portanto, não o X que costumamos usar. Divisão, temos a barra invertida. E módulo é o nosso último operador que vamos falar sobre agora. É um operador que nos permite levar o resto de uma divisão. Então, se temos 4% 2, 4 dividido por 2 é 2 com um resto de 0. Assim 4% 2? 0. 4% 3 é 1. 4% 5 é de 4, como você poderia ter imaginado. E lembre-se quando se utiliza todos estes os operadores a utilizarem as regras PEMDAS. DAVID MALAN: Então, para ser claro, se você fazer 2 a 4%, por que é que 0, exatamente? MARIA: Porque 4 dividido por 2 é 2 com um resto de 0. Então modulo nos dá essa restante como oposição ao resultado da divisão. DAVID MALAN: E, de fato, o que vamos encontrar este útil para é que em alguns problemas isso não é necessariamente um, se você quiser ter o efeito restringir-se para uma gama de números como 0 a alguma coisa, você pode usar o módulo para embrulhar ao redor mais cedo do que como a 2 mil milhões ou o valor de 4 bilhões que nós falamos sobre a palestra. MARIA: Sim. E mesmo em "gananciosos", poderíamos. DAVID MALAN: Sim, em um conjunto de problemas, também. MARIA: Sim, bom. DAVID MALAN: Boa dica. MARIA: Desculpe. Boolean expressions-- assim para os operadores booleanos, vamos falar sobre tudo desses que você vê aqui. Então, agora, temos dois sinais de igual coletados para iguais. Portanto, estas são para comparação. Até agora, nós só vi um sinal de igual. Isso é quando nós atribuímos um valor a uma variável. Então, se nós vimos int n = 5, em seguida, temos atribuído 5 para a variável n. Mas, se nós queremos usar == para comparação, podemos verificar se n == 5. E se n == 5, em seguida, isso é verdade. Assim, os operadores booleanos permitem-nos, basicamente, para avaliar booleano expressões como True ou False. Portanto, não temos a equals-- ponto de exclamação e iguais. Então, nós também poderia verificar se n não é igual a 5-- assim n! = 5. Menos do que, a menos que ou igual a, maior que, maior do que ou igual a, e, em seguida, temos a lógica AND e OR lógico. E aqueles nos permitem avaliar múltiplas expressões booleanas juntos para vir junto como basicamente Toda uma expressão booleana. Portanto, se queremos encontrar um número, digamos, que é maior do que 5 mas menor do que 15 ao mesmo tempo, gostaríamos de usar o E lógico operador para ver se n é maior do que 5 && n inferior a 15. DAVID MALAN: E aqui, também, é realmente fácil no início para acidentalmente usar apenas um único e comercial ou uma única barra vertical. E espero que o compilador gritar com você, porque eles realmente tem um significado muito diferente. Para os curiosos, eles são usado para operações bit a bit, operando em pedaços individuais. Mas você quer que o par deles aqui. E super importante é que primeiro, o sinal de igual, que é o operador de igualdade como oposição ao operador de atribuição. MARIA: E a barra vertical é localizado entre o Apagar e Retorno. DAVID MALAN: Sim. Em um teclado típico dos EUA. MARIA: Sim. Então, vamos pular direto para instruções condicionais. Em risco, você tem já visto, provavelmente, se as declarações que lhe permitem verificar se algo é verdadeiro, então fazer outra coisa. Então você pode ter querido para verificar se seu sprite é tocar alguma outra entidade gráfica ou a borda da tela. E então você poderia querer terminar o jogo ou fazer outra coisa. Assim, para que a sintaxe é "if (condição)." Portanto, se seu sprite está tocando algo, então não é dentro das chaves. Então nós temos declarações if-else. Else nos permite fazer algo Se a condição de que verificar se há no início não é verdade. Portanto, se o sprite está tocando o border fazer isso, senão fazer outra coisa. Assim, caso contrário, fazer outra coisa. Então, temos um pequeno exemplo para isto. Assim, se (military_time <12), nós quer printf "Bom dia!" Else vamos printf "Boa noite!" Exemplo básico. DAVID MALAN: Good. MARIA: Cool. Portanto, agora temos instruções switch. Alterne declarações em lata geral permitem-nos fazer um monte de a mesma coisa que acabamos de falar sobre com se declarações. Por exemplo, agora temos a forma geral da instrução switch que nos permite tomar uma variável chamada n e compará-lo com um monte de valores diferentes, que aqui nós ter chamado CONSTANT1, constant2. Podemos ter muito mais. E aqueles são chamados casos. Então, se temos um interruptor statement-- e isso funciona apenas para integers-- temos um variável, neste caso, que é n. Se a variável n é igual a CONSTANT1, nós executará algum trecho de código ou algo que nós queremos fazer. E então nós iria quebrar. Portanto, a pausa significa que a instrução switch irá parar a execução se n é igual a CONSTANT1, e, em seguida, o programa irá continuar. Ele irá sair para fora da alternar declaração e vai continuar a fazer outra coisa. Se, no entanto, n não é igual CONSTANT1, então caso para constant2 será verificada. Assim, se n é igual a constant2, que outra trecho de código será executado. E então ele vai quebrar se que é igual a ele. E então nós podemos ter Também-- não necessariamente, embora-- um caso padrão, que vai acontecer se n não é igual a qualquer um dos casos que você listou. E, no caso padrão, nós também não necessariamente precisa de uma pausa porque a instrução switch vai saber que ele precisa para terminar após o default caso se esse for o caso. DAVID MALAN: Mas estilisticamente, nós sempre colocá-lo lá. MARIA: Sim. DAVID MALAN: Yeah. Então, especialmente quando se inicia, especialmente se nos menores confortável, eu pessoalmente apenas recomendo ficar com o ifs ifs e elses e-if-else-if-elses e assim por diante que apenas porque eles são um pouco mais simples. Este é um bom optimization, ou às vezes até mesmo esteticamente torna o código mais legível. E, de facto, provavelmente meio do semestre nós vamos ver um problema definir onde ele só fica melhor e mais fácil de ler para os humanos usando uma instrução switch. Mas não se preocupe agarrando-se a esta muito cedo. MARIA: Sim. Se você tem um monte de if, não pode ser apenas muito legível. Pode não ser muito rápido para que você possa passar por isso. Assim, as declarações podem mudar ser muito útil, bem. E também, não recorde-- não fazer se esqueça de colocar as quebras de lá. DAVID MALAN: Não lembrar disso. MARIA: Porque então você pode cair através de um caso para outro. Então, vamos dizer que caso CONSTANT1 não tem uma instrução break nele. Então nós podemos cair caso constant2 dentro. E nós não queremos fazer isso se que já chegou a caso CONSTANT1 e é igual a n. Assim, por exemplo, se temos uma variável n que contém um número de classe, e queremos ver o que que classe é-- Se n é igual a 50, nós estamos indo para imprimir "é CS50 Introdução à Ciência da Computação I. " Então vamos quebrar. E é isso. Se, no entanto, n é igual para 51, nós vamos imprimir "CS51 é Introdução a Ciência da Computação II. " Então, novamente, nós vamos quebrar. No entanto, se, em seguida, nós colocamos 124, 61, qualquer outro número que você pode pensar, ou programa não vai de reconhecer que. Então, ele vai dizer: "Desculpe, eu sou não familiarizados com essa classe. " E ele vai quebrar. DAVID MALAN: Então você pode realmente ver o if, else if, else idéia aqui. É apenas sintaxe diferente para expressando a mesma idéia exata. MARIA: Exatamente. Agora temos os nossos operadores ternários. Assim, os operadores têm ternários três parts-- uma condição, algo para fazer se essa condição for verdadeira, e, em seguida, algo a ver se essa condição for falsa. Então você vê, basicamente, a sintaxe do que aqui. Nós temos o ponto de interrogação, e as-- então o que nós chamamos isso? DAVID MALAN: O cólon. MARIA: Colon. Obrigado. Desculpa. Então, vamos olhar para o nosso exemplo para ver se podemos dar sentido a isto-- class_num == 50. Então, aqui vemos o nosso operador booleano == que compara a class_num variável a 50. Lojas Então class_num um inteiro. E se esse inteiro é igual a 50, então nós estamos indo para armazenar "David Malan" no interior do professor de string. Se o número de classe não faz igual a 50, "não David Malan" vai ser o professor. DAVID MALAN: Obrigado. E assim, este parece equivalente a o que, você diria que, à primeira vista? MARIA: Para mim parece como if-else declarações. DAVID MALAN: Yeah. E, de fato, este é o tipo de uma linda um forro, por assim dizer, para a implementação de exatamente a lógica de if-else mas fazendo tudo em uma única etapa. MARIA: Exatamente. Sim. Portanto, se as declarações mais pode- pegar um monte de espaço. Eles podem ser muito longo para algo tão simples como isso. Então, isso pode ser muito sucinta e muito agradável. Então, agora nós estamos indo em olhar execução de algo novo e de novo, portanto, a verificação por um condicionar várias vezes e, em seguida, continuar a fazer algo enquanto que a condição é verdadeira. Então, isso nos traz muito bem em loops de tempo. À esquerda, temos nosso primeiro loop while. Assim, enquanto algo é verdadeiro, fazer algo de novo e de novo. Então certifique-se notar que a nossa condição aqui é validado no topo. Considerando que, com a nossa segunda loop-- chamamos que um do-while loop-- fazemos algo, então nós verificar se há uma condição. E se essa condição continua a ser verdade, Vamos voltar e fazer a coisa novamente. Assim, a principal diferença é o lugar onde a condição é verificada para. E o código não pode ser executado se a condição não é verdadeiro com o loop while. Considerando que, com o do-while loop, temos o código que é sempre executado pelo menos uma vez. E, em seguida, enquanto a condição continua a ser verdade, podemos voltar e fazer uma iteração novamente dentro. Então, por que você acha que nós usaríamos um do-while loop sobre um loop while? Certo. Portanto, se queremos para solicitar ao usuário para algum tipo de entrada, se queremos pedir-lhes para inserir seu nome, queremos pedir-lhes, pelo menos, uma vez. E se eles entrar esse nome, nós não somos vamos pedir-los novamente porque nós já conhecemos. Mas se eles não entrarem seu nome, ou se eles digite algo que é obviamente, não um nome, nós ainda queremos continuar pedindo-lhes para em seu nome. DAVID MALAN: E em palestra tivemos um assim com a obter int positivo exemplo, onde não há nada para verificar no início, porque você não tem mesmo obtido um int. Por isso, queremos fazer isto-- obter um int do user-- em seguida, verificar que, talvez, de novo e de novo e de novo. MARIA: Exatamente. Para loops-- OK. Para loops podem nos permitem fazer quase exatamente a mesma coisa, também. Na verdade, é exatamente a mesma coisa. Então não há nada que você pode fazer com loops que você não seria capaz a ver com loops de tempo. Mas para loops pode parecer um pouco pouco mais complicado sintaticamente porque eles têm três partes dentro do que era antes apenas o condição com loops de tempo. Assim, a primeira parte que você mar, o mais à esquerda, temos "int anões = 0." Portanto, este é o lugar onde nós inicializar nossa variável. Então nós temos um ponto e vírgula e "anões <7." Portanto, este é o lugar onde fora condição realmente é. Então é isso que teríamos colocar apenas no enquanto loop-- "enquanto anões <7." Aqui, que vai no meio do nosso loop for. Assim, "dwaves <7." E então nossa última parte é "anões ++" que é onde nós atualizamos nossa variável. Então, o importante para perceber é que esta vai passar por este loop for sete vezes e executar sete vezes. Portanto, temos sete anões, e eles estão todos vai dizer: "Eu estou aqui para ajudá-lo, Branca de Neve " porque eles estão prontos para ajudar a Branca de Neve. Com enquanto loops, teríamos feito a inicialização ea atualização não dentro da condição, uma vez mais, mas antes ou dentro do loop while para se certificar de que nós-- porque precisamos sempre essas peças. Então, para se certificar de que nós temos eles, teria ainda adicionou-los em, não apenas dentro dos parênteses. DAVID MALAN: E assim parece como-- na palestra, por exemplo, Eu quase sempre uso, como, eu e n variáveis ​​e muito chato. Parece que você pode usar mais inteligentemente chamado variáveis, também. MARIA: Sim, é realmente muito bom usar variáveis ​​um pouco mais descritivos porque especialmente se alguém está ler o seu code-- talvez você esteja motoniveladora ou se você estiver colaborando com somebody-- você quer ter certeza de que eles entender o que você está fazendo. ESTÁ BEM. Então, isso é algo muito funky-- loop dentro de um loop for. Eu não sei se já vi isso antes. Provavelmente não. Mas nós podemos realmente ter isto-- assim ciclos em vez de laços. Então, alguém quer andar talvez me com o que está acontecendo aqui? DAVID MALAN: Eu vou tomar uma facada. MARIA: Cool. DAVID MALAN: OK. Então, spoiler-- queremos imprimir o material que está no canto inferior direito há. MARIA: Certo. Sim sim. DAVID MALAN: Então nós temos apenas colocar esse exemplo de saída lá. Então eu posso inferir a partir da superior loop que você é iteração sobre as linhas laço mais externo, por assim dizer. E você está interagindo sobre colunas com o laço mais interno. E intuitiva, este deve esperançosamente faz sentido porque, por natureza de cada programa que temos visto antes, printf, que é a função que estamos usando, em última análise, tem a capacidade de imprimir material out essencialmente linha por linha. Como, uma vez que você emitido uma nova linha, há não dobrando para trás e imprimir algo superior no ecrã, pelo menos não usar printf como este. E assim, a este respeito, faz sentido em que o circuito externo deve estar se referindo às linhas porque para cada dada linha, você vai querer imprimir XXXXX, e, em seguida, passar para a próxima linha, XXXXX. Assim, as linhas vêm em primeiro lugar. E, em seguida, dentro de cada fileira, você imprime colunas. Se você tentou fazê-lo da oposto, ele provavelmente não faria sair como você pretende. MARIA: Sim. Nós apenas não poderia voltar para a linha anterior com printf. DAVID MALAN: E o que é interessante por bate-papo de hoje sobre o escopo, na verdade, é que linha é um int que está declarado no circuito de nível superior. Mas note que ainda é dentro de, por assim dizer, as chaves que siga imediatamente, mesmo que ele não é tecnicamente dentro dessas chaves. Então linha está no escopo para o totalidade do trecho de código, tanto dentro do exterior para o laço e no interior do interior para loop. Mas por outro lado, onde é a coluna no escopo? A coluna variável? É, apenas no loop interno. E isso é OK porque nós não acessar fora de suas chaves. Tudo o que fazemos é imprimir um novo linha no final lá. De modo que, de fato, é OK. Então, isso tem o efeito, parece que, de fazer três linhas e quatro colunas. MARIA: Certo. Então, primeiro vamos nós através de nossa primeira linha. E apenas em nossa primeira linha, nós fazemos o quatro colunas dentro a primeira linha. Então, nós imprimir quatro Xs. E então nós podemos sair do loop, uma vez que nós já impressos quatro Xs. E nós imprimir uma nova linha. E então passamos a mesmo processo por mais duas linhas para perfazer um total de três. DAVID MALAN: E é interessante notar que é apenas um artefato do tipo de letra, o fato que a saída de exemplo parece muito mais alto, como se houvesse mais linhas do que colunas. Mas é só porque o X é mais alto do que largo. Isso é tudo o que está acontecendo lá, mais o espaço em branco entre as linhas. MARIA: Certo. Frio. DAVID MALAN: Tudo bem. Assim, uma rápida olhada em um conjunto de problemas, tirar alguma dúvida, e depois adiar? Tudo certo. Assim, em um conjunto de problemas, há três desafios principais, em última análise. Mas, primeiro, você vai encontrar que o conjunto de problemas especificação, como acontece com muitos o Série de Exercícios esta queda, vai orientá-lo através de alguns exercícios de aquecimento, apontá-lo para fora alguns recursos que você pode ou não vimos já. Por exemplo, CS50 tem um conjunto de shorts, que são pequenos vídeos, Não ao contrário deste, mas que são muito specific-- tópico talvez cinco minutos, 10 minutos de duração em laços ou ou em condições em algoritmos ou posterior no mais tópicos avançados, bem. E nós geralmente incorporar aqueles em o problema conjuntos para que os alunos tem um recurso com os quais a avaliar material que pode ter já chegar na palestra ou seção. Mas desta forma é mais focado e mais na ponta dos dedos. Nós também tendem a incorporar no problema define coisas chamadas orientações. Assim, quase todos os exemplos que eu faço em palestra, no palco aqui, nós também ter atirado na câmera em avançar um mais lento, um passo a passo mais íntimo por mim em meu laptop do mesmo código, linha por linha de modo que em sala de aula, vamos muitas vezes folhear algo ou alguém vai interpor com um responder a uma pergunta. Mas isso não significa necessariamente afundar por todos na platéia. Então você vai encontrar o código orientações para a maioria dos exemplos o que fazemos aqui em palestra para que você pode atravessá-la no seu próprio ritmo e retroceder ou avançar rapidamente ou ignore por completo, se você gostaria. Há muitas vezes um pouco perguntas warm-up que pedir-lhe que tipo de reforçar este material e certifique-se que você é confortável antes de prosseguir com o resto do pset. E então, é claro, há o próprio pset. E uma das coisas nós deliberadamente fazer em CS50 é quase todo desinteressante ou intelectualmente desinteressante passo que mecânica você pode ter que fazer é quase sempre muito bem documentada. Ao longo do termo, nós vamos começar a fazer perguntas mais retóricas como se lembrar de como fazer isto ou aquilo? Mas, geralmente, você encontrará que os conjuntos de problemas que você obtenha através da mecânica de algo para que os desafios intelectuais interessantes, são em última análise, cabe a você o aluno. Com isso dito, Zamyla, a quem nós mantidos referindo hoje em palestra, é um de nossos funcionários de longa data membro que também detém orientações sobre os problemas específicos como PSet mario e gananciosos, embora não regar este ano. E é naqueles orientações que muitas vezes ela oferece algumas dicas e truques para como proceder, nunca te dizendo exatamente o que fazer, mas rather-- como uma condição, se você will-- dando-lhe, pelo menos, um par de ideias para que cabe a você, em última análise, para decidir como abordá-los. MARIA: como uma espécie de alto nível compreensão da lógica do que estamos lhe pedindo para fazer. DAVID MALAN: Exatamente. E, de fato, de Zamyla orientações são destinadas para responder à freqüência pergunta de onde Comecei a fazer, especialmente quando estas especificações são longos um pouco assustador dado todo o texto e as imagens que eles têm em si. Então water.c, você encontrará depois de ter concluído que, é, na verdade relativamente simples. Absolutamente são um bando de que você vai bater suas cabeças contra a parede tentando para descobrir por que ele não está compilando ou por que ele não está funcionando corretamente. Mas uma vez que você está feito com ele e uma vez que você passou algum tempo lutando com qualquer dos erros que você possa ter, você vai descobrir que ele é um programa muito curto. Ele pode ser feito em apenas alguns linhas de código, a maioria dos quais temos visto aqui em palestra já, se você monta os blocos de construção certas. E, como sugerimos aqui, ele vai pedir que você especifique quantos minutos alguém está tomando banho no campus. Nós especificar no problema definir a taxa de fluxo de água em, tipo, um chuveiro de baixo fluxo cabeça, muito parecido com o clipe de Seinfeld vimos ontem ou o oposto do mesmo. E então você apenas tem para fazer um pouco de matemática, realmente-- aritmética usando C para contar nos como muitos, grosso modo, garrafas de água é equivalente a que se nós somos tomar um duche n minutos. Agora, em mario.c, isso vai um programa para ser ligeiramente mais longo. Ele ainda não vai ser tanto tempo. Apenas algumas linhas mais longas do que water.c. Mas vai ser oportunidade para recriar a velha escola Mario pirâmide de Super Mario Irmãos ou algum follow-on. Não vai parecer tão mais bonita ou tão coloridas como aquele lá. Nós apenas estamos indo para usar pequenos hashtags como nós temos aqui na tela usando texto ASCII. Mas vai aproximar a mesma idéia. E vai ser um exercer que à primeira vista parece bastante simple-- apenas imprimir uma pirâmide simples. Mas há algumas características aqui que são interessantes. Note-se que a aresta mais à direita de pirâmide, na verdade, tem dois largura. Portanto, não há dois iguais colunas de altura, os quais torna-lo exigir um pouco pouco de pensamento para fazer certeza de obter exatamente o que a direita, como oposição a apenas um perfeitamente angulado linha. Então, isso é um pouco de um caso de canto mas coincide com o jogo real. E também é não-óbvio à primeira vista vista como imprimir o espaço em branco. Então, quando eu olhar para o amostra aqui-- saída e é também no spec---lo tipo dos olhares como um retângulo, mas uma diagonal do retângulo foi cortada, e é apenas espaços em branco, por assim dizer. E assim um pediu freqüentemente questão aqui é sempre, bem, como faço para mover as hashtags para a direita? Ou como posso imprimir os espaços em branco? E é realmente mais fácil que a maioria dos estudantes pensam. Certo? Você pode aproximar-lo visualmente por apenas bater a barra de espaço uma ou duas vezes ou três vezes. E por isso mesmo que nós quase com printf sempre imprimir uma string ou um int ou uma palavra como "Olá, mundo "ou série de palavras, você também pode imprimir apenas Citação, espaço, fecha aspas. E isso vai realmente dar- lhe um espaço em branco lá. Portanto, manter isso em mente e não overthink este. Você realmente tem que decidir linha por linha por linha, não ao contrário de seu exemplo, um há pouco, quantos desses colunas devem ser espaços em branco e quantos deles devem ser hashtags. Vai levar um pouco de tempo, mas é em última análise, um quebra-cabeça lógica das sortes. MARIA: Sim. Mas a lógica de ir linha por linha vai ser muito útil aqui. DAVID MALAN: Yeah. Eu acho que o código de exemplo que você mesmo gave-- embora não fosse um programa completo. Você ainda precisa int e principal e stdio.h vazio e #include, um monte de coisas a partir de palestra. Mas os blocos de construção parecem estar lá. E então, finalmente é algo um pouco mais algorítmica. Assim, verifica-se que a qualquer momento você entrar em CVS ou qualquer loja de conveniência e alguém lhe entrega no contas de caixa ou moedas como mudança, verifica-se que eles, os seres humanos, ou não sabe ou não, são, provavelmente, usando o que é chamado um algoritmo guloso, pelo que se você estiver em dívida, dizem, $ 21 em mudança, porque, por algum motivo você comprou algo muito barato com um grande projeto de lei no CVS, que seria muito chato se o cashier deu-lhe 21 quartos individuais ou, pior ainda assim, um monte de moedas. Em vez disso, o que uma pessoa razoável é provavelmente vai fazer é que eles vão para pegar um US $ 20 e, em seguida, um projeto de lei de US $ 1, e entregar-lhe apenas duas contas nesse caso. MARIA: Então eles estão procurando minimizar a mudança que eles dão de volta para você. DAVID MALAN: Exatamente. E mesmo negócio com moedas, também. Se você estiver em dívida, digamos, US $ 0,50, espero que você não quer 50 moedas de um centavo. Você não quer dois trimestres, por exemplo. Agora, isso faz supor que o caixa tem suficiente de todas as denominações que ele ou ela pode querer dar-lhe. Mas nós lhe permitem assumir tanto no problema. E o objetivo, em última análise, é a implementar em código C um algoritmo guloso. Assim, o usuário tem permissão para digitar o quanto mudar ele ou ela está em dívida com dólares e centavos, uma espécie de ponto flutuante valor provavelmente. E então você tem que fazer as contas e descobrir através de algoritmos, bem, quantas moedas eu posso dar você minimamente para lhe dar exatamente essa quantidade de mudança. Mas não vai ser um algumas partes difíceis aqui, certo? Como há a todo questão imprecisão. MARIA: Exatamente. Assim ponto flutuante valores têm imprecisão. Será que vamos conversar sobre isso na aula hoje? DAVID MALAN: Nós fizemos a última vez em palestra. Nós conversamos sobre imprecisão. E você não quer enganar o usuário de quanta mudança que ele ou ela é devido. E assim o passo a passo, em a especificação conjunto de problemas, dar algum pensamento, em última análise, como a como você pode atenuar os imprecisão erros, potencialmente. É evitável, certamente, para as entradas que estamos falando. E, de fato, pennies-- talvez nós vamos adiar para Zamyla, Eu acho que, para os truques lá. Então, finalmente, você vai encontrar um progressão de problemas esta semana, o primeiro dos quais é muito pequena, em seguida, médio, em seguida, um pouco maior. Mas todos eles utilizam o edifício quarteirões na semana passada, a partir deste supersection, conjunto de problemas especificação coloca em inúmeros recursos. Mas, ainda assim, se em todos lutando, especialmente entre aqueles menos confortável sem fundo anterior, vir para o horário de expediente na segunda-feira e terça-feira e Quarta-feira e quinta-feira. Ir para CS50 via Discutir o site do curso, através do qual você pode conversar com funcionários e colegas. Mas, afinal, eu acho que o melhor conselho é simplesmente começar cedo. Não é o tipo de classe que você Série de Exercícios deve estar começando na quarta-feira noite, ou pior noite quinta-feira. MARIA: Meu melhor conselho é ter começado na segunda-feira. DAVID MALAN: segunda-feira. Então, se você ainda não começou já-- não. Mas mesmo que não segunda-feira, em seguida, terça-feira. Quanto mais cedo, melhor. E essa é a razão pela qual o curso tem tantos dias de atraso é para dar-lhe um pouco de pressão psicológica começar mais cedo, mas ainda deixá coisas escorregar quando as coisas demoram mais do que você espera. MARIA: E você quiser fazer uso de o horário de expediente, tanto quanto você pode, também. DAVID MALAN: Alguma pergunta? Tudo certo. Bem, por que não podemos adiar aqui?