[Powered by Google Translate] LEXI ROSS: Tudo bem, oi, todos. Bem-vindo ao supersection CS50 primeiro. Esta será a semana de apenas supersections. Após isso, você estará indo para a seção regular com o seu atribuído TF. Mas esta semana, estamos fazendo isso em um pouco de diferente formato, embora o formato atual, como está indo para ir para a próxima hora e meia mais ou menos, vai ser muito semelhante ao que você vai estar vendo para o resto do semestre. Então, o que nós vamos fazer é começar por ultrapassar o parte seção de seu conjunto de problemas. Então, se você já leu sobre o conjunto de p, o que espero que você tem, você verá que há uma parte chamada "secção A do Perguntas ", e estes são feitos para serem ido mais em suas seções. Então, você tem uma vantagem por estar aqui em que você começa a passar por cima dessas questões mais conceituais baseados. E depois de fazer isso, nós vamos passar por cima dos dois últimos questões de seção, que são mais mergulho em questões do tipo de codificação. Então, nós estamos realmente vai ter que vocês levar alguns minutos para cada questão, tentar resolvê-los por conta própria, e então vamos nos unir usando o novo CS50 Espaços de ferramentas e vão sobre as respostas de modo que todos tenham a código correto para revisão. Assim, um par de anúncios. Não se esqueça de que há o horário de expediente, todas as noites esta semana em Annenberg 8-11, para fazer exame vantagem desses. E também, não comece a p demasiado tarde na semana. Comece hoje à noite ou amanhã à noite, o mais tardar. Você vai se arrepender se você esperar muito tempo para começar e executar em problemas. Então, ter o nosso conselho e, definitivamente, começar cedo. Esta vai ser uma boa maneira de começar com essas perguntas seção. Então, eu estou Lexi, por sinal. Eu sou um TF. E este é o Dan, que também é um TF. Dan Bradley: Ei, pessoal. LEXI ROSS: E ele vai ficar começou com as perguntas. Dan Bradley: Tudo bem. Então, eu estou indo apenas para introduzir um compilador pequeno casal questões que vamos falar e apenas passam por algum tipo de idéias conceituais que precisamos para realmente executar código, seja em um aparelho ou com o nosso tipo de falso aparelhos, Executar CS50 e Spaces. Então vamos ver se alguém na platéia tem alguma idéia sobre o que estamos falando. Então, o que é uma biblioteca no contexto do código? Alguém tem alguma idéia? Okay. Sweet. AUDIÊNCIA: Como um estoque de funções que alguém já programado que podemos construir? Dan Bradley: Exatamente. Assim, uma biblioteca é um estoque de funções que alguém já programados que não temos a re-implementar a nós mesmos. Portanto, temos coisas como o padrão biblioteca I / O, o cs50.h biblioteca, que são coisas que o mundo, a Internet, os funcionários fizeram o que torna nosso vive mais fácil como codificadores. Assim como você imprimir coisas para uma tela? Eu não tenho idéia, printf faz isso por mim. É algo que alguém já fez que é impressionante e funciona muito bem. Okay. Assim, o uso de bibliotecas, por outro lado, no entanto, tiver para realmente fazer algumas coisas extras com o seu código. Então, você tem que usar coisas como esta # include. O que isso faz? Qual é o papel que o jogo quando você tem isso em um programa? AUDIÊNCIA: Ele permite que você faça uso de todas as funções que são [Inaudível] biblioteca simplesmente usando as definições que já têm [Inaudível] biblioteca. Dan Bradley: Okay. Ele permite que você puxa funções de biblioteca no seu código, mas ele faz isso de uma maneira que não é exatamente a mesma como -Lcs50, que nós vamos chegar a um minuto. Ele apenas permite que o compilador saber que hey, há estes funções que vão surgir em seu código. Estar ciente de que, se não forem completamente descrito no código que está diante de você, há alguma função de biblioteca que vai cuidar dele. Assim, no caso de printf, que nós vamos passar por cima de um casal tempos de hoje, é a biblioteca de I / O padrão. Então, enquanto eu não definir printf em qualquer lugar no meu código nunca, o E / S padrão cuida dela para mim, e eu vou fazer # include stdio.h, e ele vai puxar nessas funções que eu não já definido. Então, qual é a diferença, então, entre esse # include e-lcs50? O que faz-lcs50 fazer quando eu passar para o compilador, como Clang? Alguém tem alguma idéia? Okay. Sim? AUDIÊNCIA: Ele permite que você acessar a biblioteca CS50? Dan Bradley: Ele permite que você acesse a biblioteca na CS50 que diz o compilador Clang, que hey, este é o lugar onde você realmente ir para obter estas funções. Assim, o # include diz que há estas funções em algum lugar. O lcs50-diz, vá a este ponto em seu computador - que é a biblioteca CS50 - e puxar para cima o código real para essas funções. Isso faz com que todos sentido,? Então, essas são todas as coisas que são para ajudar o seu compilador juntamente com a fatura o código realmente executado. Pergunta rápida. As pessoas sabem que é um compilador? Bom senso? É basicamente tendo o código escrito que você tem, convertendo-a em binário, convertendo em código de máquina, para que o seu computador pode realmente entender. E, sem mais delongas, vamos entrar em mais exercícios reais de codificação que vocês vão se divertir afundando seus dentes, e Lexi vai passar por cima disso. LEXI ROSS: Ok. Impressionante. Então, nós estamos indo ir sobre duas questões aqui. Assim, o primeiro é, na verdade, você pode ver, é um pouco pequena aqui, mas essencialmente está pedindo para você escrever um programa para tomar alguma entrada do usuário. Eu não sei por que há um quadrado negro. É misterioso. Ele deve ser bom, no entanto. Então, ele quer que você dê uma entrada do usuário em Celsius, converter esse para Fahrenheit, e depois dizer ao usuário que a temperatura da Seria em graus Fahrenheit. Assim, você pode ver uma amostra seqüência de entrada / saída aqui. As entradas do usuário - depois Celsius, o negrito refere-se a entrada do usuário. Assim, o utilizador entradas 100, e as saídas do programa Fahrenheit, 212,0. E uma distinção importante neste programa é que estamos vai ter apenas uma casa decimal, por isso vamos ver como fazer isso também. E então outra coisa a notar é que estamos usando a.out porque Clang, compilador, nomeia automaticamente o seu binário arquivos a.out menos que você especifique o com uma bandeira para dar certo que seu próprio nome, mas por enquanto estamos apenas indo para usar o a.out padrão. Então, vamos realmente tomar alguns minutos e tentar escrever algum código para esta-se. Então, é 4:15. Então, às 4:20, vamos voltar e - oh, certo. Espaços. Cool. Este é um tipo de código que chamamos de esqueleto em que é um esqueleto, mas você tem que preencher a carne do programa para realmente fazê-lo funcionar. Assim você pode ver o # include directivas até lá para incluir CS50 e stdio. Notei em um comentário a fórmula real para converter Celsius a Fahrenheit, no caso de você não se lembra de alta ciência da escola ou outros enfeites. E então este é apenas um esqueleto para a verdadeira função principal. Então, tudo que você escreve está a ir aqui. E para realmente chegar a este espaço - assim CS50 Espaços podem ser acedidas através desta URL, que Dan é vai escrever no quadro, e eu vou ditar também. Dan Bradley: cs50.net/spaces-- LEXI ROSS: / qWLc - Sinto muito, y. Dan Bradley: Y?. LEXI ROSS: Não, não, não, não. Isso é bom. qYLcYWfg. Então, eu deveria ver o tipo de todos os nomes de aparecer aqui. Impressionante. Isso parece ótimo. Isso significa que as pessoas estão a aderir ao espaço. Então, se você ainda não deu a chance de jogar em torno de Espaços ainda, este é realmente o que você está indo estar usando com seus TFs na seção de todo o semestre. Como funciona é tipo de toda a gente escreve sua própria código, e ninguém pode vê-la até que você pressione o Save botão, o que eu estou apontando para a direita agora. Então, eu estou indo para pressionar Save, e se você ir todos para o meu nome, que você deve ser capaz de vê-lo em pessoas neste Espaço, que é Lexis Beryl Ross. Então, como ele vai olhar é você clicar no meu nome, e você vai ver Revisão 5, que é a mais recente revisão. Copie apenas 5 edições em seu espaço, clicando sobre ela. Tudo bem. Então vamos passar por este problema em conjunto, e eu sou realmente vai escrever o código aqui na tela. Você pode ampliar um pouco. E então, uma vez que eu sou feito, você pode copiar a minha última revisão em seu espaço, se você quiser ver a solução final. Agora, os espaços tem capacidade para eu entrar e ver qualquer um dos o código que vocês têm escrito, mas apenas porque é uma parcela tão significativa e nós realmente não temos o mesmo tipo de capacidades de discussão como uma menor seção, nós apenas estamos indo para passar e eu só vou para escrever o código. Mas definitivamente parar-me com perguntas em qualquer ponto. Nós vamos passar por isso tipo de passo a passo para fazer certeza de que entendemos cada parte do que está acontecendo aqui. Qualquer pessoa pode ver este texto aqui? Alguém quer maior? Então, qual é a primeira coisa que vamos fazer aqui? Bem, essencialmente, uma vez que queremos obter dados do usuário e nós queremos que seja um tipo de experiência boa para o usuário, que, na verdade, quero dizer-lhes que estamos procurando. Então, vamos imprimir exatamente o que queremos formar o usuário. Então, só não se incomodam levantar sua mão, apenas sacudir-lo. Qual é o comando para imprimir algo para a tela? AUDIÊNCIA: printf. LEXI ROSS: Awesome. Ok, então printf. AUDIÊNCIA: Ei, Lexi? [Inaudível]? LEXI ROSS: Claro. Então printf, como temos visto com freqüência em aula, é o comando para imprimir algo para o fluxo de saída padrão. Então, queremos pedir ao usuário a entrada de um temperatura em graus Celsius. E agora, que realmente quer tomar a entrada que eles dão nós e armazená-lo em uma variável. Então, nós aprendemos um pouco sobre os tipos. Alguém pode lembrar o tipo que gostaria de uma variável com uma casa decimal nele? AUDIÊNCIA: Float. LEXI ROSS: Float. Sim, incrível. É uma bóia. Assim. E como é que vamos - grande dica - obter a flutuar do usuário? AUDIÊNCIA: GetFloat. LEXI ROSS: Yeah. Cool. E o usuário pode potencialmente ser dizer e tentar dar-nos uma número negativo, mas não vamos preocupar com isso para este problema agora. Você vai se preocupar com isso um pouco mais sobre o seu lição de casa sobre o conjunto de problemas. Então vamos supor que eles nos dão um bom número, e agora nós realmente tem que converter essa bóia de Celsius para Fahrenheit. Então, vamos consultar a nossa fórmula até aqui, e vamos criar uma nova variável e chamá-lo de Fahrenheit. Eu estudei a ortografia. É uma espécie de loucura, eu sei. E vamos contar com a ordem de operações do tipo de fazer seu trabalho aqui, mas vamos usar parênteses apenas para ser completamente detalhado e claro. Então Celsius vezes 9 dividido por 5. Eu estou indo para afastar um pouco assim que este pode caber em uma linha, mas vou aumentar o zoom novamente para aqueles que não podem ver, mais na parte de trás. Desculpe por isso. Estranhos problemas de cursor. Plus 32. Ok, alguém tem alguma dúvida sobre como eu coloquei a fórmula, ou quaisquer problemas com isso? Sim. AUDIÊNCIA: Não é preciso colocar printf antes do flutuador celsius, fahrenheit flutuar linhas de script? Que importa que ordem eles estão? LEXI ROSS: Então, a pergunta era, precisamos printf antes de realmente pedir a bóia? A resposta é que nós fazemos. Dessa forma, que o cursor que o usuário recebe a sua entrada flutuador irá ocorrer após o c impressa, certo? E isso faz sentido se você pensar logicamente, como você está pedindo ao usuário uma pergunta, e então você está receber uma resposta. Então ele imprime c, e então há um cursor, em seguida, o usuário pode digitar o valor, como veremos mais tarde, quando o DEMO. Sim? AUDIÊNCIA: Por que usamos um flutuador e não um casal? LEXI ROSS: Então dupla a, essencialmente, como o nome implica, nos dá o dobro da quantidade de precisão como uma bóia. Mas geralmente em C, em curso, de uma série de razões, nós vamos usar carros alegóricos. E isso é realmente toda a precisão que precisamos apenas para tipo de conversão de temperatura de base. Normalmente, duplos são mais utilizados na linguagem Java, flutuadores são mais comuns em C. Tudo bem, impressionante. Dan Bradley: Mais um. LEXI ROSS: Mais um. Sim? AUDIÊNCIA: Onde você coloca a barra de espaço? Como, [inaudível] a barra de espaço [inaudível]? Será que isso importa? LEXI ROSS: Oh, não. Por isso, não importa. Na verdade, eu deveria ter colocado outro espaço aqui. Mas o que importa é que você é consistente todo o seu código. Então, se você decidir usar um estilo de espaçamento, certifique-se de mantê-la em todo o seu código inteiro, ou você pode obter o estilo pontos deduzidos. Assim, a consistência é a chave. Dan Bradley: Eu acho que ele estava falando sobre esse espaço. LEXI ROSS: Ah, você está falando sobre esse espaço? Pelo C real? AUDIÊNCIA: É. LEXI ROSS: Ah, então isso é só para a aparência, certo? Assim maneira que quando executar o código, se não tem essa espaço aqui, se parecia que isso, o usuário teria início digitando o número e seria esmagado até certo contra o cólon após o C, e seria um pouco melhor se houvesse um espaço. E você pode ver que um pouco melhor, uma vez que, na verdade, executar esse código, quando terminá-lo. Impressionante. Sim, mais uma pergunta. AUDIÊNCIA: Eu tenho que colocar um ponto decimal após um dos [Inaudível]? LEXI ROSS: Então você não, por causa da ordem de operações. Então porque Fahrenheit já é um flutuador, como é Celsius, você não precisa converter explicitamente qualquer um destes outros números como carros alegóricos, embora em outro circunstâncias, quando você está lidando com ints, você pode tem que colocar um ponto explicitamente lançá-lo como um carro alegórico. Sim? AUDIÊNCIA: Eu só queria saber se os assuntos de capitalização em estes comandos como GetFloat? LEXI ROSS: Sim, boa pergunta. Portanto, a questão era, não importa em capitalização comandos como GetFloat? A resposta é sim, ele faz. Assim GetFloat é, como Dan descreveu anteriormente, uma biblioteca função na biblioteca CS50, e foi escrito como capital G, capital F. Portanto, se você não escrever com esses capitais lá, o compilador não vai entender o que função que você está se referindo. Okay. Sim? AUDIÊNCIA: é o argumento para sempre vazio principal? LEXI ROSS: Sim, essa é outra grande questão. Assim, o código que você copiou do meu espaço engano teve argumentos um pouco mais. Portanto, a questão era, é o argumento para a função principal sempre vazio, o que essencialmente significa nada? A resposta é não. Você pode notar que o código copiado do meu anterior revisão teve o que pode parecer nada que realmente faz sentido agora, * alguns char, argv, argc. Não se preocupe com isso agora, mas você vai descobrir mais tarde em que eles fazem a diferença. Mas se você não está usando esse tipo de funcionalidade adicionada que você vai aprender mais tarde, nula é completamente bem. Tudo bem. E temos mais um passo, o que é que nós queremos realmente mostrar ao usuário o que a temperatura é convertido. Então, novamente, nós vamos usar printf, e vamos dizer que f, apenas Por razões de coerência. E agora vamos fazer algo um pouco complicado. Então, nós estamos indo para usar uma bandeira, ou um tipo especial de notação, para dizer printf para imprimir apenas uma casa decimal. E alguém por acaso sabe o que isso vai parecer gosto, antes que eu escreva isso? Sim? AUDIÊNCIA: f 0,2%? LEXI ROSS: Sim, sim. Então, na verdade, é realmente muito próximos. 0.01F para f 0,01%, e então nós temos que lembrar de incluir o outro argumento para printf, que é a própria variável, que é n. Um último passo. Alguém pode lembrar o que está em nossa função principal? Sim, lá em cima. AUDIÊNCIA: Retorno? LEXI ROSS: Exatamente. Então, já que este é retornos principais int, queremos também retornar em int. DAN BRADLEY: Percentagem precisa estar no outro lado. LEXI ROSS: Ok. Desculpe, pessoal. Isso foi um erro. Assim, a percentagem vem antes 0,01. Então é 0,01% f. Esses são meio difícil de lembrar. Muitas pessoas, como eu, só procurá-los sempre que usá-los. Sim, lá em cima. AUDIÊNCIA: Por que é 0,01 e não 0,2 ou 0,1? LEXI ROSS: Eu não sei, na verdade. Você sabe? Dan Bradley: A razão é 0,01 em vez de 0,02, ou 0.2, ou 0.1, é bastante arbitrária para a forma que o programador originalmente projetado. AUDIÊNCIA: Não foi isso que eu quis dizer. Eu não estou pedindo a razão. Razão [inaudível] por quê. Eu tê-lo escrito como 0.2, e oferece dois - Dan Bradley: Yeah. Então nós estávamos apenas querendo um. AUDIÊNCIA: Ah, ok. Então, você poderia 0,01 então. Dan Bradley: 0,1 provavelmente também funcionam. 0,01 funciona tão bem. LEXI ROSS: Ah, o 0 pode ser o de mostrar zero, se é menor que um. Dan Bradley: Sim, eu acho que é certo. Portanto, a 0,01 mostraria um zero se ele não tem nada que iria para lá naturalmente. Então, se você fosse, digamos, colocar em 100 para Celsius, seria sair a 212 normalmente em Fahrenheit, como 212 exatamente. Se você tiver a 0,01, ele vai mostrar 212,0, como oposição a apenas 212. LEXI ROSS: Isso mesmo. Assim, a leitura que basicamente diz printf, imprimir um ponto decimal, e imprimir um 0, se necessário. Se não, imprimir a primeira posição decimal. Dan Bradley: E nós vamos explorar algumas dessas quando estamos na verdade, a execução do código. LEXI ROSS: Yeah. AUDIÊNCIA: Então eu coloquei 0,1. Ele ainda mostra sua zero. Dan Bradley: Ele ainda mostra sua zero? AUDIÊNCIA: É. Dan Bradley: Hm, ok. LEXI ROSS: Cool. Tudo bem. Mais perguntas sobre este código antes de compilar e executar? Alguém ver um erro aqui, em primeiro lugar? Qualquer pessoa ver algo que deveria estar aqui? Se este fosse o seu conjunto de problemas, o que seria aqui que não é lá agora? Sim, ótimo. Então, eu não incluir comentários, porque eu estou entregando-os por via oral, mas se eu estivesse escrevendo isso em um conjunto de problemas, eu o faria definitivamente quero colocar comentários para indicar o que eu sou fazer, no essencial, no programa. E você vai tipo de começar uma sensação para ela, como você se move através No semestre, a quantidade certa de comentar. Você não quer ser muito detalhado e linhas de venda e linhas de comentários para cada uma de suas linhas de código, mas você também não quero para não ser detalhado o suficiente e deixar o leitor a tentar descobrir o que diabos seu código está fazendo. Ok, legal. Vamos tentar executar este código. Ok, eu vou reduzir um pouco. Cool. Então, você vai perceber que há um botão Play aqui. Vamos clicar Play. Então, você vai notar aqui, assim como na especificação do problema definido, há o. / a.out. a.out é o nome do binário executável, o qual é um palavra longa para apenas um arquivo consistindo de código binário que o seu computador está executando. Assim como nós esperávamos, temos C aqui. Assim, chamar um número. AUDIÊNCIA: 23. LEXI ROSS: 23. Dan Bradley: O programa levou muito tempo para ser executado. Basta executá-lo novamente. LEXI ROSS: Oh, meu mau. Okay. Espaços é exigente, às vezes. Ele quer que você pense em seus pés. Ok, 23. Impressionante. Será que todo mundo acredita nisso? Legal, porque ele funciona. Okay. Vamos tentar mais um par. Vamos tentar um caso extremo aqui. Em ciência da computação, quando falamos sobre casos de ponta, queremos dizer casos para o seu programa para executar que são uma espécie de sobre o muito arestas de entradas razoáveis ​​ou que determinados cantos dos testes de a lógica em seu programa, e isso faz mais sentido quando fazer programas mais complicados. Vamos tentar 0. Impressionante. Nós todos sabemos isso. Cool. Mais perguntas sobre isso antes de eu passar para o programa a seguir? Tudo bem, impressionante. Então, agora, nós vamos - quer apenas usar meu computador? Dan Bradley: Sim, isso é muito fácil. Tudo bem, então indo para ir e falar sobre fazer porcentagens. Então estamos essencialmente, neste próximo exercício pouco, vai tomar duas entradas inteiras do usuário, esperando por um não negativo numerador e denominador positivo, e basicamente dividindo-os e produzir o que sai como um percentagem. Então, nós queremos que ele só aceita não-negativos e numeradores aceitar apenas denominadores positivos, e continuo a perguntar para os novos, se não tiver conseguido o que quer. Tudo bem? Então, dar um que vá. LEXI ROSS: Ah, sim, você quer fazer o - oh, talvez as pessoas devem copiar o meu código. Dan Bradley: Yeah. LEXI ROSS: [inaudível] Espaços. AUDIÊNCIA: Eu tenho uma pergunta. Se eu estou usando os espaços e quero salvar [inaudível] a Fahrenheit conversão, posso salvá-lo e depois fazer uma nova - LEXI ROSS: Nós só poderia fazer um novo espaço, ou você pode apenas deseja copiar e colá-lo em um arquivo de texto ou algo que você tem. Dan Bradley: Eu vou mudar meu nome. LEXI ROSS: Então, eu só salvou a última revisão do tofahrenheit.c, por isso, se você entrar em AAAA Lexis Beryl Ross, você pode entrar e copiar o código mais recente, e depois começar neste novo, que eu acho que Dan vai dar algum código esqueleto para bem. Okay. Dan Bradley: A última revisão que eu tenho no meu, então é no topo, desta vez, é Revisão 4, e ele vai ter o que você precisa para começar. LEXI ROSS: Tudo bem, e eu vou copiar isso em minha também. Dan Bradley: Tudo bem. Acho que estamos indo apenas para começar a ir por causa disso, se alguém estiver interessado. LEXI ROSS: Estamos todos interessados. Dan Bradley: Vamos começar apenas declarando algumas variáveis. Assim, temos um numerador, e por uma questão de agora, eu vou apenas começar com o valor -1, e então eu vou criar um laço do-while. Embora - Então, quando eu quero que ele loop? Quando é que eu quero que ele continue perguntando - sim? AUDIÊNCIA: Quando é menor ou igual a zero. Dan Bradley: Por que não pode ser igual a zero? AUDIÊNCIA: [inaudível]. Dan Bradley: Yeah. Assim, para o numerador, é só enquanto o numerador é menor do que zero. Isso faz sentido para as pessoas? Mantemos looping enquanto o numerador é menor que zero, continuamos pedindo para entrada de novo, e continuar exigindo que eles input coisas novas. Então, eu vou ter um pouco printf aqui, não negativo num -. E, então, fazer a mesma coisa de antes, exceto que fazer um GetInt, só porque queria fazê-lo como percentagens de ints. Então numerador = GetInt. Ok, agora algumas coisas. Que eu preciso disso -1 aqui? AUDIÊNCIA: [inaudível]. Dan Bradley: Não. Por que não? AUDIÊNCIA: Porque você está recebendo um valor aleatório do usuário. Dan Bradley: Exatamente. Mas eu gostaria de ter a declaração aqui? Sim. Por quê? AUDIÊNCIA: Você tem que encontrar o lado de fora do loop. Caso contrário, você não vai ter a variável para o resto do programa. Dan Bradley: Exatamente. Escopo. Sweet. Isso faz sentido para todos? AUDIÊNCIA: Você pode dizer que mais uma vez? Dan Bradley: Okay. Então, se eu fosse para declarar este numerador dentro do loop, se Eu tinha isso em vez de numerador sendo numerador int, e me livrei dessa inteiramente, numerador desapareceria. Não existiria fora desse circuito, pois tudo É no âmbito dessas chaves. Faz sentido? Okay. Assim, para denominador, fazemos algo bastante semelhante, int denominador = - e eu não preciso de igual - fazer, e por enquanto, neste caso, o que eu quero? Que condição é que eu quero que ele ainda laço em? PÚBLICO: Menos do que ou igual a 0. DAN BRADLEY: Menos do que ou igual a 0. Denominador <= 0. Não se esqueça, vírgulas crianças. Então nós fazemos a mesma coisa que antes, printf positivo denominador, e temos int daqui. Lá vamos nós. GetInt. Okay. E então, no final, queremos imprimir alguma porcentagem. Então, para fazer isso, o que deveria ser a nossa corda parece? printf. Quaisquer outras ideias do que eu posso fazer aqui? Sim? AUDIÊNCIA: Talvez 0,2% [inaudível]. Dan Bradley: Yep. Okay. Vou começar com o primeiro bit,%% 0,02%, citações vírgula. E eu vou jogar uma nova linha aqui, só porque eu como novas linhas quando eu estou fazendo as coisas. Que tipo de expressão matemática que eu deveria ter aqui? AUDIÊNCIA: Parênteses e float. Dan Bradley: Ótimo. Por que eu quero tê-lo em float? AUDIÊNCIA: [inaudível]. Dan Bradley: Bom, bom. Flutuar. AUDIÊNCIA: Numerador. Dan Bradley: Numerador? Ok, então eu faço numerador float. AUDIÊNCIA: Dividido por - Dan Bradley: Dividido por? AUDIÊNCIA: Denominador. Dan Bradley: Eu faço apenas denominador, ou eu faço flutuador denominador? AUDIÊNCIA: Apenas denominador. Dan Bradley: Okay. AUDIÊNCIA: E você pode multiplicar por 100. Dan Bradley: E eu que multiplicar por 100. AUDIÊNCIA: E então parênteses a expressão inteira. Dan Bradley: Yep. Okay. Boa aparência? Vamos tentar. -50. Bom, 50. 0 e 100, 50%. Trabalhou apenas como queríamos. Será que esse código faz sentido para as pessoas? Vou guardá-lo de modo que você pode obter uma cópia do mesmo. Sim? AUDIÊNCIA: Por que você não precisa colocar [inaudível]? Dan Bradley: Onde? AUDIÊNCIA: Como, quando você diz que é igual denominador [Inaudível]. Dan Bradley: Quando eu tenho aqui? Por que eu teria int antes? AUDIÊNCIA: Porque o outro tem int antes. Dan Bradley: Bem, de modo que não estava em um loop, certo? Então, eu declaro este denominador int acima do loop, e eu não tê-lo no circuito, porque eu seria declará-lo um monte de vezes, e não seria realmente levar até em qualquer outra parte do programa. LEXI ROSS: Sim, a coisa importante a lembrar é que variáveis ​​só precisa ser declarada uma vez. Então, imagine como é a introdução de uma nova variável para o mundo, chamando-int ou float ou outros enfeites, e uma vez que é declarado, tudo o que você precisa fazer para mudá-lo é basta chamá-lo por seu nome: denominador, ou x, ou y. Você só precisa realmente chamá-lo de um int apenas uma vez. Dan Bradley: Yeah. AUDIÊNCIA: Você pode explicar a diferença entre o% d e f% e se você declarar uma variável como um decimal? Dan Bradley: d% e% f Então aqui? LEXI ROSS: Então d verdade se refere a apenas um dígito, não decimal, que é uma espécie de confusão. Não há nenhum tipo de dados real chamado decimal, e quando você pretende imprimir um int, você se refere a ele como d%, ou % O que quer-d. F é para float, que você acha que seria eu, mas na verdade é d para int. Dan Bradley: Sim? AUDIÊNCIA: Então, no outro programa, por que não acabamos de fazer a mesma coisa quando você está dizendo Fahrenheit? Por que não colocar, como -? Dan Bradley: Na parte inferior aqui? Você poderia ter. Ele teria sido completamente legítimo. Eu gosto de fazê-lo desta forma, outras pessoas gostam separando -lo em diferentes linhas de código. De qualquer maneira funciona bem. O que há? AUDIÊNCIA: Você pode explicar o que o%% [Inaudível]? Dan Bradley: Ok, então por cento, por cento. Bem, eu estava indo para ir sobre isso. O primeiro é chamado por cento um caractere de escape, e isso só diz que a coisa por trás disso não é realmente código. Portanto, este primeiro por cento, à direita, a 0,02% f, todos aqueles f .02% significar algo para printf como uma função. %%, Eu só queria que, na verdade, apenas imprimir um por cento sinal. Então eu não estou dizendo que não há nada de importante por trás disso. Eu só estou dizendo que há um sinal de porcentagem por trás dele. Por favor, imprima um sinal de porcentagem. Assim, por cento, em seguida, uma outra por cento. AUDIÊNCIA: Você pode mostrar o que seria se você tem flutuar com base em outra linha? Dan Bradley: Ah sim, com certeza. Então, eu estou sendo convidado a mostrar o que seria se eu tinha esse numerador float, toda a matemática isso, em outra linha. Assim por cento flutuador = - e gostaria de se livrar disso e só colocar em porcentagem. E está fazendo exatamente a mesma coisa, eu só tem outra variável. AUDIÊNCIA: [inaudível]. Dan Bradley: Desça até o quê? AUDIÊNCIA: Para que eu possa ver [inaudível]. Dan Bradley: O que você não pode ver? AUDIÊNCIA: Desculpe, eu estava [inaudível]. Dan Bradley: Yeah. AUDIÊNCIA: Então, se estamos substituindo o caractere de escape, suponha que queria ter um sinal de dólar em vez disso, apenas para exemplo, um sinal de dólar por trás por cento? Dan Bradley: Nope. É apenas um dólar, apenas um sinal de dólar, porque um dólar sinal não significa nada para printf. A questão era, que eu preciso para ter um caractere de escape para símbolos como cifrões? AUDIÊNCIA: Então tipo de relacionados, existem outros casos que devemos saber de quando algo como o percentual sinal pode significar algo [inaudível]? LEXI ROSS: Sim. Não necessariamente o sinal de porcentagem, mas a barra invertida, consulte como temos folga final aqui? Vamos dizer que, na verdade, queria imprimir uma reação, teríamos escapar que - e isso vai soar confuso - com outra barra invertida. Então, se nós quiséssemos imprimir \ \, estaríamos só precisa digitar isso, ou para obter informações adicionais barra invertida, outra fuga. E outra, se queremos imprimir uma citação - de modo basicamente qualquer coisa, esse tipo de denota algo especial dentro de uma cadeia, queremos escapar. Então, vamos dizer que nós realmente queremos ter um orçamento aqui, nós o faríamos quero fazer \ ". AUDIÊNCIA: Então, é geralmente uma barra invertida? Dan Bradley: Geralmente é uma barra invertida. LEXI ROSS: Yeah. Por alguma razão, aqui, é um sinal de porcentagem. AUDIÊNCIA: [inaudível]? Dan Bradley: Esse cara? Isto é só para dizer, a coisa que está sendo dividido aqui é vai ser tratado como um flutuador para a causa da divisão. Assim, no caso de 50 dividido por 100, se eu não tinha o flutuar lá, que seria apenas 0. Isso é tudo o que iria sair, porque 50 dividido por 100, se você não está incluindo todos os decimais, é 0. - e tudo após o decimal é apenas truncada fora. AUDIÊNCIA: Hum, por que não colocá-lo antes denominador também? Dan Bradley: Então, a razão por que não colocá-lo na frente de denominador é porque quando você está dividindo algo por um número inteiro, ele funciona muito bem. Tendo um número maior no fundo não muda nada. Você pode dividir por números inteiros muito bem. Ele só não importa realmente. Você pode, isso não mudaria nada. AUDIÊNCIA: Então, se você queria três casas decimais, faria você colocar por cento 0,03? Dan Bradley: Yep. Você colocaria% 0,03, se você queria três casas decimais. Público: e fazer comandos, o que é a diferença entre isso e apenas fazendo enquanto no topo? Dan Bradley: Então, um do-while contra um loop while são dois comandos bastante semelhantes. A única diferença é que você execute o código uma vez, você corre o código dentro do tempo de ciclo anterior de fazer qualquer verificação real. Por isso, é também a razão que eu posso dizer, sem dar denominador que o número um. Então, se eu disse denominador int, e em seguida, enquanto (denominador <= 0), ele nunca poderia mesmo executar o código dentro. Ela vai fazer essa verificação antes - por isso aqui. Então se eu tivesse este laço enquanto aqui, eu teria que ter denominador é igual, por exemplo, -2 ou um número menor que ou igual a 0 até que seria realmente tentar executar o código dentro primeiro. Assim, de modo geral, você quer usar um loop do-while em vez de um loop while quando você está pedindo a entrada do usuário porque a execução do código uma vez, pedindo algo que o usuário vai lhe dar é geralmente a melhor solução, em oposição apenas confiando que você colocar para começar. AUDIÊNCIA: E fazer é sempre seguido por um tempo. Dan Bradley: Faça é seguido por algum pedaço de código que você deseja executar, e depois, enquanto alguns condição. LEXI ROSS: Pense nisso como uma espécie de comando quebrado em duas partes. É um tempo-do, não como aqui é um fazer, e então eu sou indo para adicionar um tempo, é só um tempo-do. AUDIÊNCIA: Eu entendo a razão pela qual você está usando o dois sinais de porcentagem, mas você pode me explicar por que nós temos que tem o [inaudível]? Dan Bradley: Ok, então o sinal de porcentagem se está apenas dizendo printf, aqui é um comando que eu quero que você encher com um número. Então, eu quero que você preencha-o com duas casas decimais e um flutuar, e você vai encontrar a bóia no final do comando, é esta por cento. Isso faz sentido? AUDIÊNCIA: Yep. Dan Bradley: Okay. AUDIÊNCIA: Existe algo sobre o laço do-while que se a condição não for cumprida, se você receber um número negativo para o numerador, vai apenas manter pedindo e vai continuar fazendo o usuário? Dan Bradley: Yeah. Portanto, se a condição de quando não for cumprida, no final de o não-tempo, ele vai correr de volta para o início. É apenas um loop. Então, é como um loop while que a condição não tem sido cumprida em. Ele só é executado mais uma vez. Sim. AUDIÊNCIA: Então, se você estiver fazendo isso, você pode, para o seu tempo, colocou duas condições? Dan Bradley: Você pode. Depende do que você está pedindo. Então você pode colocar duas condições em um loop while se tiver todos dentro de algum tipo de operador booleano, o que soa feio, mas é basicamente esse denominador é menor ou igual a zero, ou retorna verdadeiro ou falso, certo? Ou é menor do que ou igual a zero ou não. Assim você pode fazer outros operadores booleanos que vai dizer enquanto isso também é verdadeiro, ou enquanto este também é falso. Por isso é coisas como numerador e é maior do que zero, certo? Isso é pedir, isso só vai loop while denominador é menor que zero e você tem um numerador positivo. AUDIÊNCIA: E você faz os dois ANDs, certo? Dan Bradley: Dois ANDs. LEXI ROSS: Nós vamos cobrir que mais tarde. AUDIÊNCIA: E se alguém não colocar em um positivo denominador? Se colocar em um numerador negativo, você pode levá-los para, digamos, colocar em um numerador não-negativo e tem um comando para isso? Dan Bradley: Você poderia. AUDIÊNCIA: Agora ele só diz não negativo numerador. O que seria usado para isso? Dan Bradley: Então você tem uma condição IF, assim como se numerador é menor do que zero. LEXI ROSS: Você provavelmente só quer dividi-lo em mais passos, certo? Assim, a primeira vez que eles colocaram na entrada, que tinha acabado de dizer dar nos numerador um ou outros enfeites. E então, se eles fazem a coisa errada, isso pode ser o caso para um loop while, em vez de um do-tempo, porque temos a primeira vez que temos a GetInt, e em seguida, enquanto que a entrada é ruim, continuamos pedindo-lhes para a entrada ainda mais com um tipo diferente de texto, como o que não deu certo ou dar-nos um não negativo numerador em vez disso, esse tipo de coisa. Dan Bradley: Sim? AUDIÊNCIA: Como você limpar o material que [inaudível] o terminal? LEXI ROSS: Limpar. Dan Bradley: Sim, você não pode digitar nele. LEXI ROSS: Na verdade, este não é um terminal real. A questão era como você limpar essas coisas aí embaixo? A resposta é que não é um terminal de verdade, mas vamos dizer que você estão em um terminal real. Limpar. Ah, é um gato. Dan Bradley: [inaudível]? É que uma, certo? LEXI ROSS: Não, isso é tudo meu. Dan Bradley: [inaudível]. LEXI ROSS: Lá vamos nós. Dan Bradley: Sim? AUDIÊNCIA: O trabalho claro se você tem - como, por exemplo executar um programa [inaudível] e ele está pedindo você para alguma coisa, e você não quer. Como você - Dan Bradley: Control + C? LEXI ROSS: Yeah. Então, se você estiver executando um programa e algo não está indo a maneira que você quer e você só quer sair do todo programa, Control + C. Mesmo se você estiver em um Mac, não Apple + C, Control + C. AUDIÊNCIA: Será que você tem a versão correta no revisão em seu perfil? Dan Bradley: Eu acho que ele está salvo, não é? Sim. LEXI ROSS: Este é o espaço. Sim. Eu acho que é Revisão 11. Dan Bradley: Sim? Platéia: C fazer suposições sobre o que um variável é se você definir uma variável, mas não atribua nada para ele imediatamente? Dan Bradley: Então, ele só vai aceitar ints em que local. Então, se você declará-lo - AUDIÊNCIA: Se eu apenas fiz int denominador ponto e vírgula, não é supor que é igual a zero ou um número qualquer -? Dan Bradley: Nope. Então, se você não atribuir, por exemplo, int denominador para qualquer valor, pode ser qualquer coisa. É a memória antiga que estava no local. Assim, poderia ser negativa 2000000000, pode ser positiva 2 bilhões, e que poderia ser em qualquer lugar. Então, se você está realmente dirigir as coisas, certifique-se de que você atribuir um valor às variáveis. Isso, não importa, porque estamos imediatamente atribuindo o valor, mas de um modo geral, sim. Alguma outra pergunta? LEXI ROSS: Nós também podemos apenas tirar dúvidas gerais neste ponto no material de aula, material de p set, qualquer coisa que você se perguntando sobre, este é um bom momento para pedir aqueles. AUDIÊNCIA: Então, em orientações, Zamyla mencionado a função round. Você se importaria de elaborar sobre como implementar isso? LEXI ROSS: Claro, como implementar isso? AUDIÊNCIA: Ela disse que era redondo. LEXI ROSS: Ah, sim. Então, só assim todos nós temos o mesmo vocabulário e outras coisas, implementar geralmente significa realmente a escrever a partir do zero. E então eu não acho que ela estava falando sobre uma espécie de escrever a função round. Ela provavelmente significava apenas como usá-lo. Implementar significa uma espécie de como criar. Então, geralmente, um momento em que nós queremos usar a função round é que eu Quer dizer, de alguma forma, por exemplo, se você deseja arredondar. Você pode me dar contexto um pouco mais sobre o que o problema era? PÚBLICO: Para evitar as imprecisões de casas decimais , tornando-os um carro alegórico. LEXI ROSS: Yeah. Assim, a questão com flutuadores que nós tipo de alusão é que, devido à forma como eles são armazenados na máquina, eles não são 100% precisos no modo que você pode pensar sua calculadora seria armazená-los. É difícil para eu mostrar um exemplo sem saber o que o contexto era. Eu não sei, você pode pensar em algo, Dan? Dan Bradley: Então, se você está pedindo, por exemplo, os números de superior a 10 e que você está usando carros alegóricos, e você está adicionando um a uma bóia de cada vez, ele vai esperar até que às vezes você tem chegado a 12 antes de ele vai dizer que este é realmente um número superior a 10. Flutua ter alguns problemas graves, entre o 32 e casa decimal 33, que vai, por isso pode 9,9999999, ou pode ser 10.0000001, certo? Realmente não distinguir entre os dois, por isso, se você está esperando que as coisas maiores ou iguais a 10, você pode não chegar lá com o que você acha que é a iteração 10. Você pode chegar lá no dia 11. LEXI ROSS: Essencialmente, sim. Quando você está looping sobre um monte de carros alegóricos, que é quando o imprecisões acontecer. AUDIÊNCIA: Eu acho que, então, basicamente, é como no p definido, ele quer que você arredondar o valor float, e se você colocar em 4,24 para a quantidade de mudança que você precisa para trás, se você acabou de fazer 100 vezes, ele vai realmente mudar em 423 - Dan Bradley: Às vezes, sim. AUDIÊNCIA: Então eu acho que é como, como você usa a rodada função no código real para fazê-lo para que ele não faz isso? Dan Bradley: Então, se você é o arredondamento 424, multiplicando-se por 100 e fazê-la em um número inteiro, ele será por vezes torná-lo por causa do que 423 imprecisão. E assim as coisas que você pode fazer é apenas adicionar 0,0000003. AUDIÊNCIA: Mas eu acho que, na verdade, eles querem -nos a usar a rodada. Dan Bradley: A função rodada? Há provavelmente uma função matemática, algo no biblioteca de matemática. AUDIÊNCIA: # include matemática. Dan Bradley: # include , e não há provavelmente uma função rodada. AUDIÊNCIA: Assim como round () -? LEXI ROSS: Essencialmente, porque você quer arredondar para o cêntimo. Dan Bradley: Vamos arrancar as páginas do manual. Assim, uma ferramenta útil, se você não sabe - você puxa o terminal - é se você vai para a matemática homem. LEXI ROSS: Cool. Assim você pode ver, o homem é curto para o manual, não o homem, e ele permite que você procure mais informações sobre qualquer dado função ou biblioteca que você pode estar lidando. Então eu digitei em matemática homem. Deixe-me fazer zoom in Dan Bradley: Podemos tentar rodada homem, também. LEXI ROSS: Claro. Dan Bradley: E isso vai listar - matemática homem vai listar tudo o que está na biblioteca de matemática, que vamos incluir. Sim, nós também temos rodada. LEXI ROSS: Então eu fiz durante todo homem. Você pode ver aqui na sinopse, ele diz # include , de modo que é tipo como cs50.h, stdio.h. E parece que ele realmente está sobrecarregado, o que significa leva diferentes tipos de argumentos, para que você possa arredondar duplos ou carros alegóricos. Dan Bradley: Round contra roundf. LEXI ROSS: Roundf. Será que Zamyla mencionar roundf contra redonda? AUDIÊNCIA: No passo a passo, que era apenas uma rodada (). Dan Bradley: Ok, então provavelmente ela estava usando o dobro, em seguida, em oposição a uma bóia. Ok, então você pode multiplicar por 100 e depois volta, e que você deseja obter o número mais próximo a ele, eu acho. LEXI ROSS: Então, a função round retorna a integral valor mais próximo a arredondamento x meias casos de distância de 0, independentemente do sentido de arredondamento correntes. Então, basicamente, você iria querer só volta quando estiver no um valor inteiro, de modo que você multiplicar por 100 e depois volta. Isso faz mais sentido? PÚBLICO: Para usar essa função em um arquivo de C, que você precisa colocar bóia redonda, como se a sua variável é chamado de q, você colocar round (float) q, e então um parênteses, ou pode você acabou de colocar rodada, e depois q entre parênteses? Dan Bradley: Então, se você estava tentando usar esta função na verdade, você terá que q, q é uma bóia, ou como é que é declarada? AUDIÊNCIA: Q é um float. Dan Bradley: Então, se q é declarada como uma bóia, você faria apenas tomar rodada, e depois dar-lhe q. Você pode ter que declará-lo como um casal neste caso. LEXI ROSS: Sim, a menos que você quiser usar roundf. AUDIÊNCIA: eu poderia usar apenas roundf, e depois q entre aspas? Dan Bradley: Não, não, entre aspas, apenas q. AUDIÊNCIA: Desculpe, mas não entre aspas, entre parênteses. Dan Bradley: Em parênteses, sim. LEXI ROSS: Pena que foi um pouco confuso. Mais alguma pergunta? Dan Bradley: Sim? AUDIÊNCIA: Então redondas rodadas apenas para inteiros? LEXI ROSS: Sim. Dan Bradley: Sim, redondas rodadas apenas para números inteiros. AUDIÊNCIA: Então se você quer ter algo exato que necessária para ser [inaudível] multiplicado por 100 e depois dividido por 100 novamente se você quisesse -? LEXI ROSS: Então, se você quiser colocá-lo em uma forma decimal? AUDIÊNCIA: Bem, a exemplo, por exemplo, [inaudível] você tem 1,25, e depois [inaudível] 1,24, se você queria manter isso como 1,25, você faria que multiplicar por 100, em volta dela, e depois dividir por 100 novamente para obter 1,25? LEXI ROSS: Yeah. Então a questão é, uma vez que o arredondamento, como a página de homem diz, é arredondado para o valor inteiro mais próximo, isso significa que que alguém iria querer multiplicar por 100, faça o arredondamento, e dividir por 100 novamente para, digamos, obter a correta dólares e centavos de valor? E a resposta é -? Dan Bradley: Não. Quer dizer, se você está apenas começando um valor flutuante, se você começar com um valor flutuante de 1,25, é assim que vai ser interpretado. Então, se você multiplicar por 100 e depois dividir por 100, ela ainda vai ser interpretados como 1,25, ou possivelmente 1,249 ... .. 999. LEXI ROSS: Eu acho que a pergunta era como, faria multiplicam-se, em seguida, usar rodada, em seguida, dividir, então é como - Dan Bradley: Yeah. Eu ainda acho que não muda nada, porém. Eu acho que ainda é. LEXI ROSS: Porque rodada faz - ele usa números inteiros. Então, se você tentar arredondar 1,25, você começa apenas 1. Então eu acho que, a fim de obter como a precisão adicional, se é isso que você está falando. AUDIÊNCIA: Então, em que casos você usa redonda, então? Dan Bradley: Então, nesse caso, se você quiser, por exemplo, o número de centavos de US $ 1,25, você multiplicar por 100, rodada, começa 125, e deixá-lo como que, como centavos, em vez de tentar convertê-lo em dólares e centavos. LEXI ROSS: Ah, sim, sim, com certeza. AUDIÊNCIA: Por que você precisa para completar que [inaudível]? Dan Bradley: Então, se você multiplicar isso por 100 e, em seguida, imediatamente convertê-lo para um número inteiro, o que é o mais forma útil, que é quando você lidar com isso imprecisão, certo? Assim, pode ser 124.999999, e por isso, se você então convertê-lo em um número inteiro, só cai tudo fora que está abaixo o decimal. AUDIÊNCIA: Então vou te dar [inaudível]. Dan Bradley: Exatamente, em vez de 125, o que é por que você deseja arredondar. AUDIÊNCIA: Desculpe, poderia repetir o que você disse deve fazer ao contrário do que você não deve fazer? Dan Bradley: Okay. Então, o que você deve fazer é se você começar com 1,25, multiplique lo por 100, e depois volta que número inteiro, que 125 ou 124.9999, e conseguir que o inteiro mais próximo. AUDIÊNCIA: Então, se você volta, que coloca para o número inteiro mais próximo? Dan Bradley: Yeah. AUDIÊNCIA: Existe uma maneira de limitar, se você perguntar para um flutuador a ser introduzido, há uma maneira de limitar o número de casas decimais lugares que você pode introduzir uma bóia para? LEXI ROSS: Não utilizar a implementação do CS50. Quero dizer, você pode contar como grande entrada é dada por o usuário, mas isso exigiria uma nova implementação de GetFloat, e assim você não precisa se preocupar com isso. Dan Bradley: Então, se eles, por exemplo, a entrada de 1,256, você poderia apenas usar 1,25, ou você poderia fazer 1,26. De qualquer forma, eu acho que a implementação diz que você pode - AUDIÊNCIA: Você pode apenas ter que arredondar para - Dan Bradley: Seja o que quer, sim, desde que você faz algum tipo de arredondamento. Mais alguma coisa? Não tem que ser sobre arredondamento. LEXI ROSS: Sim? AUDIÊNCIA: Se quiser verificar para ver se o estilo do nosso código é adequado ou o melhor estilo que pode ser, é que o tipo de coisa que traria em seção, ou em horário de expediente, ou isso é o tipo de coisa podemos postar privada sobre a coisa, em discussão, e depois pedir conselhos sobre? LEXI ROSS: Então nós não, no horário de expediente ou em CS50 Discutir, nós realmente não vai conjunto p grau o seu com antecedência para o estilo, mas eu acho que provavelmente a mais útil coisa que você poderia fazer seria olhar para exemplos, e você deve ser capaz de descobrir que, em código de secção, a qual deve ser linha distribuída, bem como as lâminas de aula, há devem ser exemplos de código. Mas se você tiver dúvidas individuais sobre um certo questão de estilo, definitivamente, não hesite em pedir que a CS50 Discutir, e as horas de expediente, ou no seu próprio tempo. Mas se é mais uma olhada geral no meu código, é melhor tipo de exemplos de uso e tentar encaixar o seu código para isso. E eu acredito que há um guia de estilo em - Dan Bradley: Há o guia de estilo. O guia de estilo é incrível. Ela ensina-lhe tudo o que precisa, e cobre muito muito cada exemplo que o homem conhece, ou pelo menos conhecido para mim. Mais alguma coisa? Tudo bem. Cool, rapazes. LEXI ROSS: Tenha um ótimo dia. Dan Bradley: Obrigado por ter vindo.