DAVID Malan J: Todos dereita, de xeito que este é CS50. E esta é claramente unha venres. E este é o final dunha semana. Entón podes recordar que paramos, última vez, cun cliffhanger das sortes. En que expomos esa mentira, que non importa o que foi ensino crecente up, 1 dividido por 10 non é, en traxe, 0,1 ou 0,100 ou 0,10 mil. En realidade, se nós compilamos esta programa, como fixemos onte, con, facer imprecisión, e, a continuación, facer dot, slash, imprecisión, aprendemos que iso é o que é 1 dividido por 10 é realmente. Entón iso non é realmente así o caso. Pero iso non fai alusión a algúns limitación fundamental de ordenadores. E, de feito, entre os cousas que nós imos facer hoxe é dar un ollo porque este ten pasou, o que implicacións que ten, como a humanidade fallou de comprender isto nalgúns moi situations-- serio o resultado de que o foi bastante tráxico e e tamén expensive-- Bótalle un ollo a como nós realmente defender contra estes tipos de limitacións. Entón intuitivamente quizais por iso que está dividido por 1 10, segundo o meu ordenador aquí, non só 1/10, 0,10? Si. ¿Que pensas? PARTICIPANTE: A raíz é diferente? DAVID Malan J: Qué é? Oh, a raíz é diferente? Polo tanto, non é ben así. É realmente máis fundamental para o hardware. Outros pensamentos? Si. PARTICIPANTE: Eles representar números de forma diferente? DAVID Malan J: Entón they-- dereito. Representan números de forma diferente. Inaccurately, aparentemente. Así que é-- Ben, a diferenza do que? Ou de quen? De nós? PARTICIPANTE: Si. Eles non usan o decimal sistema para [inaudível]. DAVID Malan J: Aceptar. Así, en certo sentido, non usar o sistema decimal. Debaixo do capó, todo é, de feito, binario, e iso é relacionado, en realidade. Pero é aínda máis sinxela explicación do que iso. Si. PARTICIPANTE: Eles só ten tantas anacos. Eles só poden almacenar ata un certo extensión, como cos decimais. DAVID Malan J: Si. Isto é o que está realmente quedando para el. Acontece que os ordenadores normalmente, será sempre soa utilizar unha cantidade finita de información para representar algo. Non? Despois de todo, nós só temos un fixo cantidade de espazo no disco duro. Nós só temos unha cantidade fixa de memoria RAM, ou memoria de ordenador. E se só ten un importe fixo de algo, certamente non pode realmente contar-se ao infinito ou calquera número que sexa. Ti, tipo, ten que escoller o intervalo de valores que vai apoiar. E así, por exemplo, unha semana ou dúas atrás, cando falamos de ASCII, e nós falamos sobre 8 bits, ou un byte, por así dicir, o maior número puidésemos representar con 8 bits foi o que? 255. E podemos representar 256 valores totais pero non se pasarmos un deles en 0-- Ben, pero se nós pasar un deles en 0, a continuación, o maior número é, por suposto, 255. Así, verifícase, que se trata o caso tamén, neste contexto. Comezamos a falar, a última vez, sobre números de punto flotante, que son diferentes dos números enteiros, en que teñen un punto decimal e, esperamos, algúns números Despois diso, pero son demasiado. Un ordenador só vai tipicamente usar 32 bits, 64 bits quizais para representar un valor de punto flotante. Así, aínda que nós medran aprendizaxe da matemática e saber que pode absolutamente ter un número infinito de números despois do punto decimal, non se ten memoria finita. Ti, tipo, ten que redondear, ou seleccionar números que vai representar. E así que pode pensar, en certo sentido, sendo este o máis próximo ao ordenador aproximación ao valor que 1/10 pode obter, con só 32 ou máis anacos. E non é só 1/10. Por exemplo, se eu cambiar isto para 1/3, o que nós pensamos que é aínda máis sinxela. Entón 1 dividido por tres. Déixeme gardar o ficheiro. Deixe-me ir adiante e recompilar-lo. E déixeme re-executar-lo. Aquí tamén, ao parecer, 1/3 non é 0,3 e, a continuación, un número infinito de 3'S despois diso. Ten esa imprecisión ao final. Entón, nós, seres humanos son correctos e que aprendeu é, de feito, correcto, pero estamos esbarrando contra algunhas limitacións. E o que eu pensaba fariamos hoxe, é comezar mirando, a verdade, o tráxicas consecuencias desta ás veces, cando a humanidade non chega a aplicar para esta realidade e estas limitacións. E nós imos ver unha serie de viñetas do History Channel que leva Un ollar sobre como as cousas deron mal. É preto de 8 minutos de duración, e imos volver despois de este e dar un ollo a exactamente o que máis pode dar mal. Se puidésemos diminuír a intensidade da lights-- [REPRODUCIÓN DE VIDEO] -Computadores, Todos temos que chegou a aceptar os problemas que moitas veces frustrante ir con eles. Erros, virus e software glitches son pequenos os prezos a pagar para o barrio. Pero, en alta tecnoloxía e de alta velocidade aplicacións militares do programa espacial e, o menor problema pode ser ampliada en desastre. O 04 de xuño de 1996, os científicos preparado para lanzar un foguete non tripulado Ariane 5. Estaba cargando científica satélites deseñados para establecer con precisión o xeito no que o Interactúa campo magnético da Terra con ventos solares. O foguete foi construído para a Axencia Espacial Europea e despegou da súa instalación na costa de Guayana Francesa. -e Preto de 30 segundos en o voo, eles primeiro notado que algo estaba a suceder de malo. Que os bocais foron xiratorio de forma que non debería. Preto de 40 segundos de voo, claramente o vehículo estaba en apuros, e é aí onde fixeron a decisión de destruílo. A Safety Officer Franxa con coraxe tremendas apertou o botón, estoupou o foguete antes de que puidese ser un perigo para a seguridade pública. -Esta Foi a doncela viaxe do Ariane 5, ea súa destrución levou poñer debido a un fallo incorporado en software do foguete. -O Problema na Ariane era que hai foi un número necesario 64 bits para expresar, e el quería converter a un número de 16 bits. Eles asumiron que o número nunca ía ser moi grande, que a maioría destes números en o número de 64 bits eran de 0. Estaban equivocados. -O Incapacidade dun programa de software para aceptar o tipo de número xerado pola outra estaba na orixe do fallo. Desenvolvemento de software chegou a ser un parte moi cara de nova tecnoloxía. O Ariane 4 foguete fora moi éxito, tanto do software creado por iso tamén foi usado no Ariane 5. -O Problema básico era que o Ariane 5 foi máis rápido, máis rápido acelerada. E o software non que representaron. -A Destrución do foguete foi un enorme desastre financeiro, todo debido a un erro de software minuto. Pero este non foi o primeiro problemas de conversión de datos de cando había atormentado a tecnoloxía de foguetes moderna. -En 1991, co inicio da Primeira Guerra do Golfo, o mísil Patriot experimentaron un tipo semellante do problema de conversión de número. Como resultado, 28 persoas, 28 soldados norteamericanos morreron e preto de 100 outras resultaron feridas, cando o Patriot, que debería para protexer contra scuds recibidas, non puido disparar un misil. -Cando Iraq invadiu Kuwait e América Desert Storm lanzado a comezos de 1991, Baterías de mísiles Patriot foron implantados para protexer a Arabia Saudita e Israel de ataques de mísiles Scud iraquís. O Patriot é un norteamericano, de medio alcance superficie-aire do sistema fabricado pola empresa Raytheon. -O Tamaño do interceptor Patriot, en si, é aproximadamente, un 20 pés de longo. E pesa preto de 2000 libras. E el leva unha ogiva de about-- Creo que é máis ou menos 150 libras. E a ogiva, en si, é un explosivo, que ten fragmentos en torno a el. O invólucro da ogiva é deseñado para actuar como chumbo groso. -Os Mísiles son realizado, 4 por contedores, e son transportados por un semi-remolque. -O Sistema de mísiles anti Patriot remonta polo menos 20 anos. El foi orixinalmente deseñado como un mísil de defensa aérea para abater avións inimigos. Na Primeira Guerra do Golfo, cando esa guerra veu xunto, Exército quería usalo para abater scuds, non avións. A Forza iraquí non foi tanto dun problema, pero o Exército estaba preocupado sobre scuds. E así intentaron actualizar o Patriot. -Intercepting Un inimigo mísil viaxando a macho cinco ía ser moi difícil. Pero cando o Patriot foi levado ás présas en servizo, o Exército non tiña coñecemento dun Modificación iraquí que fixo scuds seus case imposible de bater. -O Que pasou, é que os scuds foron chegando, eran inestables, estaban bailando. A razón para isto, era os iraquís, a fin para 600 quilómetros fóra da un mísil gama 300 quilómetros, levou para fóra peso da ogiva fronte e fixo a ogiva máis lixeiro. Entón, agora, o Patriot está intentando chegar no Scud, e na maioría das veces, a esmagadora maioría da tempo, sería só voar polo Scud. -Unha Vez os operadores do sistema Patriot entender que o Patriot errou o seu obxectivo, que detonada ogiva do Patriot, para evitar posibles accidentes se Deixouse caer ao chan. -Iso Era o que a maioría da xente viu, aqueles grandes bolas de lume no ceo, e mal interpretado como intercepta de oxivas Scud. Aínda durante a noite ceos, Patriots apareceu para ser correctamente destruíndo scuds, en Dhahran, non podería haber erro sobre o seu funcionamento. Alí, sistema de radar do Patriot perdeu o control dun Scud de entrada, e nunca lanzado, debido a un fallo do software. Foron os israelís que descuberto por primeira vez que canto máis tempo o sistema foi ligado, canto maior sexa o tempo de discrepancia tornouse, debido a un reloxo incorporado no ordenador do sistema. -Cerca A dúas semanas antes a traxedia en Dhahran, os israelís informar para o Departamento de Defensa, que o sistema estaba perdendo tempo, que despois de preto de 8 horas de funcionamento, eles notaron que o sistema foi converténdose no visiblemente menos precisas. O Departamento de Defensa respondeu contando todas as baterías Patriot para non deixar os sistemas por un longo período de tempo. Nunca dixeron que hai moito tempo era. 8 horas? 10 horas? 1000 horas? Ninguén sabía. -A Batería Patriot estacionados no cuartel en Dhahran, ea súa falla interna reloxo, fora en máis de 100 horas na noite do 25 de febreiro. -É Ruta tempo cunha precisión duns 1/10 dun segundo. Agora 1/10 dun segundo é un número interesante porque non se pode expresado en binario, exactamente. O que significa, non pode ser expresado, exactamente, en calquera ordenador dixital moderno. É difícil de crer, pero usar isto como un exemplo. Imos dar o número, 1/3. 1/3 non pode ser expresada en decimal, exactamente. 1/3 é 0,333 suceder ao infinito. Non hai ningunha forma de facelo, con precisión absoluta, en decimal. Iso é o mesmo tipo de problema que aconteceu o Patriot. Canto máis tempo o sistema funciona, o converteuse en peor o erro de tempo. -Despois De 100 horas de traballo, o erro o tempo foi só preto de 1/3 de segundo. Pero en termos de segmentación un mísil viaxando a Mach 5, isto resultou nunha seguimento erro de máis de 600 metros. Sería un erro grave para os soldados en Dhahran. -O Que pasou, é un lanzamento de Scud foi detectados por satélites de alerta temperá, e novo que o Scud foi está na súa dirección xeral. Eles non sabían de onde viña. -Foi Agora ao radar compoñente do sistema Patriot, defender Dhahran, para localizar e manter o control do mísil inimigo de entrada. -O Radar era moi intelixente. Sería, de feito, visite a posición do Scud e, a continuación, prever onde probablemente sería, a próxima vez, o radar enviou un pulso para fóra. Que foi chamado ao portón intervalo. -Entón, Xa que o Patriot decide ten tempo suficiente pasado para volver e comprobar o seguinte localización para este obxecto detectado, vai volver. Así, cando se volveu para o mal lugar, a continuación, ve ningún obxecto e decide que non houbo obxecto, que era unha falsa detección, e deixa a pista. A entrada Scud desapareceu da pantalla do radar, e segundos despois, chocou contra o cuartel. O Scud matou 28 e foi a última unha despedido durante a Primeira Guerra do Golfo. Traxicamente, o software actualizado Dhahran chegou o día seguinte. O fallo de software tivo foi fixado, de peche un capítulo na conturbada historia do mísil Patriot. [FIN DE REPRODUCIÓN] DAVID Malan J: Entón imos dar un ollo algunhas limitacións semellantes en só un pouco. Pero primeiro, imos transición para algúns FYI é. Entón um-- este fin de semana, hai será seccións de super, que están destinadas a suplantar seccións regulares, que iniciarase unha semana, polo tanto. Bótalle un ollo no sitio web do CS50 para máis información sobre aqueles. Tamén será filmado e transmitido vivir para os que non poidan comparecer. Conxunto de problemas 1 é o o sitio web do curso xa, e imos dar un ollo que, en só un pouco. E o horario de oficina tamén, terá poña este luns a xoves. Polo tanto, este foi o máis canónico programa nós miramos última vez. É como o máis simple programa pode escribir en C, e mesmo que é un pouco de unha afirmación ousada. Non? Porque hai unha morea de aparente complexidade desta. Entón, imos dar un ollo rápida no o que algúns destes elementos eran e, a continuación, tentar achegar un modelo mental de como estes máis simple de programas traballar, e entón nós imos comezar mirar para as cousas cada vez máis complexo. Entón esta liña aquí, destaque agora, en amarelo, o que podemos dicir, a última vez, que este fai a nós? Cal é a finalidade a que serve? Calquera persoa de máis para atrás? Si. PARTICIPANTE: [inaudível] DAVID Malan J: Bo. Por iso, dálle acceso a comandos, ou imos chamalos de funcións, que alguén persoa escribiu, que son declaradas, por así dicir, nalgún outro ficheiro. Entón, imos ver o que un arquivo .h é contra un ficheiro .c, eventualmente. Pero, por agora, só sei printf que, por exemplo, está entre as funcións que foron declarada nalgún outro arquivo, nalgún lugar outra cousa no disco duro da nube que permítenos acceder printf e usalo sen ter que reinventar que nós mesmos roda. Mentres tanto, a principal. Cal foi o análogo do principal, a semana pasada? Si. PARTICIPANTE: Bandeira verde é premendo. DAVID Malan J: Si. Scratch, cando bandeira verde premendo. É como a peza do puzzle que xuta as cousas fóra. E así, de forma semellante, fixo o mundo decidiu hai uns anos que en C, e unha morea de outras linguas, se quere escribir un programa, súa primeira función ten que ser chamado, principal. E ten que mirar como esta. Pero imos volver, outra vez, para o que, int, e, baleiro, significa neste contexto. De momento, as claves son tipo de como a forma da parte do enigma do cero que encapsulado un determinado número de liñas. E entre as liñas aquí, é este aquí. printf é unha función cuxo propósito na a vida é para imprimir unha secuencia de caracteres formatada. E por formatada, quero dicir que pode conectar o espazo reservado valores, e pode especificar cantos decimal puntos, cantos números para imprimir despois dun punto decimal e similares. E printf, por suposto, unha toma ou máis argumentos ou parámetros, doutro xeito coñecido, máis simplemente, como entradas. Entón printf, como unha morea de funcións, leva entradas. E esas entradas son abrazados por ambos os parénteses aquí. E dentro desas é unha entrada. É unha cadea, como xa o chamou, que é só unha secuencia de caracteres, como unha palabra ou unha frase, é un todo ensaio mesmo, entre comiñas dobres. E iso é o que vai influír no comportamento printf porque, obviamente, é só unha función de impresión xenérico. Non vai saber o que para imprimir, a menos que diga a el. E, a continuación, algunhas minúcias. O que nós dicimos isto estraño secuencia de símbolos é? Si. PARTICIPANTE: Nova liña. DAVID Malan J: Nova liña. Así, verifícase, non pode simplemente bater, entrar, cando está escribindo o programa. Xeralmente, o compilador se ve un pouco confuso en canto ao que quere dicir. Pola contra, ten que, literalmente, dicir, dáme unha nova liña aquí. E así / n é o que xeralmente chamar un carácter de escape. Entón n, para a nova liña. E o compilador sabe que, cando se ve / n, debe, en realidade, inducir o ordenador, en definitiva, é printf, neste caso, para imprimir un novo real liña, como bater a, entrar, tecla no teclado. E, por último, o que fixo dicimos este anaco de sintaxe é para? O que isto supón? Si. PARTICIPANTE: [inaudível] DAVID Malan J: É só o fin da liña. É o fin da instrución. E entender que non poñelos en todas partes. Nós seguramente non poñer-los cos lados de cada liña. Por exemplo, non hai ningún en primeira liña, non hai nada na liña con, principal, non hai ningún tras as chaves, pero vai comezar a ver e obter familiarizado co lugar onde se chama a. E é case sempre despois dunha función chame ou unha declaración, algunha acción que realmente está tomando. E sei agora, sobre todo se entre os menos cómodo, estes son os tipos de cousas estúpidas que vai acabar batendo accidentalmente súa cabeza contra a parede máis. Porque vai ser loxicamente confiado en algún problema vostede resolveu a un problema set, ea maldita cousa só non compilar ou incluso realizar. E así, moitas veces, en principio, que vai ser porque perdeu un paréntese, ou perdeu un punto e coma. E entón só estar atento destes tipos de cousas, e probe non estar errado por eles, porque moi rapidamente fai chegar a ser vello sombreiro. Pero é moi fácil chegar frustrado en principio, como resultado. Entón, agora, imos dar un ollo a como esta liña está realmente traballando e despois ollar para algo unha máis complicada. Polo tanto, temos aquí, o habilidade para deseñar na pantalla. E imos supor que esta é a miña pantalla de ordenador, pero eu estou escribindo o programa Ola ,, e eu non ter aplicado, printf. Alguén máis ten aplicado, printf. Quen quere reivindicar Implementar, printf? Se podemos? Todo ben, cal é o seu nome? ESTUDANTE 1: [? Copal. ?] DAVID Malan J: Copal, imos alí cara arriba. Imos cara arriba. Todo ben. Polo tanto, temos, aquí, algunhas etiquetas de nome, xa que nós imos facer un pequeno xogo deste. E imos chamalo, printf. E se queres vir aquí, o que eu acaba deseñado na pantalla, é pura e simplemente, non son eu, iso. Todo ben, entón, Ola meu nome é, printf, se quere poñer iso diante. Todo ben. E se pode ir posto pola pantalla do ordenador como se é a función que veu con este sistema informático. E o seu propósito na vida é para realmente imprimir algo. Pero moi parecido ao programa, só tiña na pantalla, aquí, nós imos ter que realmente darlle algunha entrada. E así, a miña entrada, aquí, é Ao parecer, o que é pasado para printf, imos tipo de mofar-lo como esta. Vou escribir literalmente en un anaco de papel, "Ola, mundo" barra invertida N. E para quedar claro, o que Acaba deseñada sobre este anaco de papel, parece iso. Entón, cando executar este programa, e este liña amarela do código é executado, é como se eu, o programa Ola, estou entregando algunha entrada fóra a unha función que outra persoa escribiu. E se, co dedo, podería, en realidade, co dedo, deseñar na pantalla o que quere é vostede ser entregado, o efecto, en definitiva, é a ver o que, na pantalla. E un caso de canto pequeno aquí. E bo, non debemos ver o, nova liña, neste punto. Sería incorrecto para ti deseñar explicitamente a nova liña. Pero, se continuase a escribir palabras en pantalla, eles acaban por baixo diso. Entón, moitas grazas, pero vara por aquí por só un momento. Necesitamos agora de outro voluntario, se puidésemos, que vai ter para desempeñar o papel de-- É só a xente na orquesta agora. Como about-- Aceptar. Ben aquí. Imos cara arriba. Cal é o seu nome? ESTUDANTE 2: [? Ivay. ?] DAVID Malan J: Sentímolo? ESTUDANTE 2: [? Ivay. ?] DAVID Malan J: Ethan, imos cara arriba. Non? Eu obtiven esta mal, mesmo despois que dixo iso dúas veces? Imos cara arriba. É difícil escoitar-se aquí. Aceptar. E eu sinto moito, cal é o seu nome? ESTUDANTE 2: [? Ivay. ?] [? DAVID Malan J: Ivay. ?] Aceptar. Por agora, se non mente, está GetString. ESTUDANTE 2: Aceptar. Legal. DAVID Malan J: Entón, se quere estar aquí por só un momento, imos dar un ollo a un pouco programa máis complexo, que agora ten tres liñas de código. Polo tanto, temos un, indicar o seu nome a usar printf; dúas, unha chamada a GetString, seguido por unha asignación a unha variable chamada, corda s, ou chamado s; e, a continuación, outra chamada para, printf, pero esta vez con dúas entradas. Entón, estado que xa fixemos o seu nome, ou mellor, temos xa feito unha chamada printf. Entón eu vou escribir, Diga o seu nome. E así, o que eu vou pasar, printf, en só un momento, é pura e simplemente, este. Entón, se quere ir adiante e deseñar ese na pantalla, esa é a súa entrada agora. Todo ben. E esquecer secuencia, temos agora nosa propia liña de código aquí. Así, en, GetString, necesitamos para realmente chamar, GetString. Polo tanto, o seu propósito na vida é só andar fóra da orquestra, se puidese, e obter o nome de alguén. Pero imos darlle algo para poñelas. Se quere, vai adiante e obter unha cadea, O nome de alguén que anaco de papel, se puidese. Todo ben. E veremos, en só un momento, cuxo nome estamos recibindo. Mentres tanto, o que eu vou ter listo, é unha peza en branco de papel, no que, eu vou para almacenar o valor que é que GetString volve a min, Eu, sendo unha variable de cadea chamado, s. Todo ben. Entón o que ten aquí? Nik. Todo ben. Entón temos o nome de Nik aquí. Entón é iso que literalmente foi devolto para min, por así dicir, por GetString. Eu, agora, vou executar á esquerda de que a expresión, onde simplemente copiar abaixo, para fins de hoxe, Nik. Entón, agora, eu teño unha variable chamado, s, almacenando o nome de Nik. Eu xa entregado a printf, un argumento anterior. Pero na nosa terceira e última liña de código, realmente teño que printf man que un simple diferente-- "Ola,% s," barra invertida n. E así a última liña eu vou para send-- o último que eu son vai escribir para abaixo agora, é esta. Así, as dúas liñas de código, ou no canto da última liña de código, chamadas a dous insumos un, este, e dous, presente. Entón, se a nosa función printf agora pode toma-los como entrada, déixeme limpar a pantalla para ti. En realidade non, pode ir adiante. Imos deixalo, xa que é o mesmo programa. Debemos ver, Ola, Nik. Todo ben. Polo tanto, este foi moi poucos marcos para ir a través, só para escribir, indicar o seu nome, e, Ola, Nik. Pero esta simple idea de paso de mensaxes, do paso de entrada e saída de recepción, é o modelo que nós imos ter incluso para as funcións máis complexas. Entón, moitas grazas a vostedes dous. Temos un fermoso estrés balón aquí para vostede. E grazas ao noso GetString e voluntarios printf igual. Grazas. Todo ben. Grazas a vostedes dous. Entón, nós falamos sobre ata agora, sobre todo sobre cadeas. E parece que C realmente entender algúns tipos de datos. De feito, imos dar un ollar para estes aquí. Entón C, e unha morea de linguas, entender as cousas chamados carácteres. Un char é xeralmente un byte único, ou oito bits. E representa un único carácter, como a letra A, ou a capital letra A, ou a letra minúscula A, ou un punto de exclamación, ou calquera carácter que podes escribir en teclado, e ás veces ata máis. Tamén terá lugar a ver coches alegóricos. Un flotador é, xeralmente, unha 32 bits valor ou catro bytes porque unha vez máis, un byte ten oito bits. Así, un flotador é un valor de punto flotante, algo cun punto decimal. E, de feito, é o que a película estaba falando sobre cando falaron sobre flotante valores de punto, un número fixo de bits sendo utilizada para representar un número real. Pero hai tamén cousas chamadas dobres. Estes existen en Java, se tomou APCS, e un dobre, como o nome sorte suxire, é dúas veces tan grande como un float. Aínda é un número real, el só ten máis bits co cal a ser cada vez máis precisa, ou para almacenar un número aínda maior. int é doado. Nós falamos sobre iso da última vez. É só un número enteiro. E é xeralmente 32 de bits, ou catro bytes. E así, se ten, imos ver agora, 32 bits-- e fixemos iso a semana 0, sempre tan briefly-- se ten 32 bits, o que é o maior número pode representar como un número enteiro? Máis ou menos? É como 4 millóns, e iso é só estivermos representando só números positivos. Se tes 32 bits, e quere representar números negativos, así como, seu alcance é, esencialmente, negativo 2 millóns para positivo 2 millóns. Pero, xeralmente, imos comezar 0 ir ata 4 millóns. Non ten que saber con precisión, pero vemos que, en realidade, se eu só abrir un pouco calculadora, aquí. Podo facer 2 a 32, e iso é o quão grande, cantos valores podes representar, con 32 bits. E é máis ou menos 4 millóns. Entón, imos seguir vendo ese número nalgúns lugares diferentes. Pero se precisa de máis tempo números que iso, Acontece que hai de algo chamado un longo tempo. E un longo tempo é xeralmente 64 bits, que significa que é unha orde de magnitude aínda maior que un int. Entón, eu non podo nin pronunciar o maior número que pode representar, pero é marcadamente maior. Agora, como un aparte, historicamente, un int é de 32 bits, e un longo, longo é de 64 bits, como grande é moito, non un longo, longo? Vostede pensar que é máis que un int pero quizais menos longo que un longo, longo, pero, en realidade, depende. E así acontece que un das frustracións tamén, coa escrita de código en determinados sistemas, é que non todos estes tipos de datos teñen valores predeterminados. Ás veces iso moitos anacos. Ás veces, é que moitos bits. Entón, o que realmente ten que saber, ás veces, o hardware está executando o seu programa en. Afortunadamente, outras linguas e outros tipos de datos que xa existen, permiten que sexa máis preciso. Ben, nós vimos corda, e vimos bool, tamén, pero resulta que os vir só coa biblioteca de CS50. Polo tanto, os non son construídas C. Os no seu lugar, veñen que ficheiro chamado CS50.h, que imos finalmente pelar as capas de. Pero, de momento, só tipos de datos adicionais. Un bool é un verdadeiro ou falso, e unha cadea é unha secuencia de caracteres, como unha palabra. Agora printf, que xa vimos, ten espazos reservados,% s é un deles. E pode ser capaz, agora, inferir a partir destes exemplos, como outros podería ter un espazo reservado para os distintos tipos de datos. Por exemplo, dar un palpite, se quería imprimir un único carácter usando printf, o espazo reservado pode ser% c. E se queres imprimir un integer co espazo reservado,% i. % LLD é un valor decimal longo, longo, pero long long, de xeito que mapea para iso. E, a continuación,% f para flotante valor de punto ou unha parella, polo que ás veces son reutilizados en diferentes contextos. Entón, imos ver e usar algúns dos que co paso do tempo. E printf e outras funcións tamén secuencias de escape de apoio dos outros, e, por veces, estes son necesarios. Así barra invertida n é unha nova liña. Barra invertida t, calquera quere tomar unha facada? PARTICIPANTE: Tab. DAVID Malan J: Tab. Entón, se o quere para imprimir unha guía, non un número fixo de espazos, pero un real carácter de tabulación, non acertar o seu, guía, tecla no teclado, xeralmente, realmente fai barra invertida t. Cita dobre barra invertida, Por que eu ía querer iso? Non? Por que non podo eu só escriba un comiñas dobres no meu teclado? PARTICIPANTE: Porque, se non, é vai pensar que é o fin do gusto da súa impresión [? texto. ?] DAVID Malan J: Exactamente. Teña en conta que, coa nosa exemplos printf, cando estaban pasando para printf na entrada, na parte esquerda da cadea de entrada que e sobre o dereito de que a entrada primavera, por suposto, foi unha cita de parella. Se a súa propia entrada ten un dobre Cita no medio do que, o ordenador pode potencialmente se confunden, como a, fai comiñas dobres pertence no medio? Pertence co esquerdo? Pertence co camiño correcto? E así, se quere facelo super suposto, fai barra invertida comiñas dobres, de xeito que escapou, por así dicir, e non é confundida por algo máis. E hai algúns outros aquí, r barra invertida, aspas, 0, para que poidamos ver ao longo do tempo, tamén. E agora, o que pasa con funcións? Así, as accións que podemos tomar, ata agora, nesta lingua, C, así, nós vimos, printf, por suposto, e todos dos outros na pantalla, aquí, que imos usar para o do curso primeiras semanas só, vir cando a biblioteca CS50. E eles fan isto moito máis fácil, en C, para realmente obter a entrada do usuario. Acontece que en C, e francamente nalgunhas linguas, é unha dor real no pescozo para facer algo simple, como alerta ao usuario para o teclado, para a súa entrada. E así estas funcións facelo máis fácil. E tamén ten erro comprobando todo, de xeito que, cando recordar o mércores, nós viu a, proba de novo, aviso, cando non cooperar, e eu escriba a palabra, en vez de un número? Nós fixemos o traballo pesado inicio para asegurarse de que o usuario coopera. Pero estes son só adestramento rodas que imos finalmente, e axiña, despegar. Entón, para recapitular, entón, imos dar un ollo rápida, moi como fixemos co Scratch, en algunhas construcións canónicas en C. Este destino se a, tipo de, ser un rápido tour, só para que teña unha referencia e que xa viu as cousas en primeiro lugar. Pero, a continuación, imos ollar para codificación real usar algúns destes bloques de construción. Tanto como no scratch, cando tiñamos declaracións gusta, dicir ou, espera, en C, temos funcións, así como printf. Se queremos expresar unha condición en C, é semellante, en espírito, para que parte do enigma que mirou como este en Scratch. Pero en vez diso, literalmente só escribir, se. E, a continuación, entre parénteses, poñemos unha condición, cando esta condición é o que nós imos chamar, unha vez máis, unha expresión booleana. E unha vez máis, esta é unha especie de pseudo-código. E, de feito, o // é un comentario. É só palabras en inglés para min mesmo. Pero esta é a xeral estrutura dun si, condición. Pero imos ver formigón exemplos en só un momento. Se quere ter un garfo de dúas vías na estrada, moi como fixemos co noso voluntario Mércores, pode ter un, else if. E se quere ter unha terceira e condición final, ou situación de incumprimento, pode que só un bloque de máis, hai. E do mesmo xeito, con expresións booleanas, pode, e, Los xuntos. E vimos o mércores, que non é un único e comercial, é dous, por razóns de nivel inferior que imos finalmente ver e xogar. Ou-ing cousas xuntos é de 2 barras verticais. Nun teclado de Estados Unidos, esta é xeralmente unha tecla coa tecla Maiús riba súa chave tecla Intro ou Retorno. Despois, hai estas cousas que imos usar quizais unha ou dúas veces. Son funcionalmente equivalentes aos o que pode facer un, if, else se, else if outra cousa, construír, pero son chamados de unha chave. Eles parecen moi diferentes, pero imos ver nalgúns dos noso código de distribución, para un conxunto de problemas futuros, probablemente, que ás veces é só unha máis bonita modo de expresar un enteiro banda de condicións, sen ter unha chea de claves e un lote de parénteses e recuar. Pero non nos dan máis poder do que xa temos. E agora lazos. E este, imos dar un ollo en algo máis lentamente. Pero entón, nós imos comezar a usalos, especialmente para quen xa está familiarizado. Esta é a forma canónica, se incrible xeito misterioso, para escribir un loop en C. Agora un lazo no scratch foi moi sinxelo. Ten un, para sempre, bloque. Ten un, repetir, con bloque só un número que ten que escribir. E co, por loop, pode aplicar estas dúas ideas, pero é un pouco máis técnico. Pero, a verdade, é tamén relativamente simple. Despois de saber a orde de operacións, vostede literalmente está indo só para conectar valores e dicir ao ordenador que facer. Entón, aquí está un exemplo. Este é un circuíto que, bastante simplemente, cóntase a partir dun número a través dun outro. E só polos ollos para el, mesmo se ten ningunha experiencia previa con esta linguaxe, que número probablemente comezar a contar a? OK, 0. E eu estou supondo que é porque ver que hai un int e un i, que é unha variable. É iniciar a 0. E, a continuación, máis tarde, parece que estamos pasando printf, un valor. E, de feito, eu fixen un pequeno erro de dixitación aquí. Pero iso é facilmente modificado. Deixe-me engadir, eu aquí. Temos, agora, ser printf pasado ese valor de espazo reservado. E o que vai contar a través? Audiencia: 50. 50. 49. DAVID Malan J: 49. Entón, 50, a primeira vista, parece correcto. Pero que, ao parecer, será nosa condición que manter a verificación. E imos parar xa Xa non sexa inferior a 50. Polo tanto, este loop, por outra banda, debería executar, sempre que i é inferior a 50. Pero así que se fai 50 ou 51, ou peor, debe deixar automaticamente. Todo ben. Entón, o que realmente acontece aquí? Entón que é o fin de operacións a un loop. Un, ten a así-chamada arranque. Este anaco destaque amarelo de código execútase en primeiro lugar, e ten o efecto de que, por Mércores, probablemente imaxinar. El crea unha variable denominada i e tendas en que o valor variable 0. Entón i é 0, neste punto da historia. A seguinte cousa que acontece nesta construción, é que a condición checado. Entón eu comprobar inmediatamente, i é menos de 50? E, por suposto, a resposta polo de agora é, con certeza, si. Si, porque i é 0, e iso é certamente inferior a 50. Entón o que ocorre é que este liña de código é executado. E, de feito, se hai múltiple liñas de código nesas claves, todos eles son executados un despois do outro. E no efecto aquí, é parecer para imprimir o número de i, o que vai ser 0, e, a continuación, 1, 2 e, a continuación. Pero por que? Por que se incrementou? Ben, a cuarta cousa que pasa é que esta sintaxe corre, despois do punto e coma. i ++ é unha forma abreviada de dicir; tomar o valor de i, e engadir 1 a ela; e, a continuación, a próxima vez, engade 1 a ela; e a próxima vez, engadir 1 a ela. Entón, se esperamos que continúe, o que vai pasar ao lado é que eu non vou iniciar nunca máis. Se eu continuase o arranque I a 0, este exemplo que nunca ía acabar, porque Quere ser preso a 0. Pero o que vai pasar é que a condición verificarase, a liña de código serán executados, o i será incrementado, condición verificarase, código serán executados. E mantivo-se andar en bicicleta de novo, e unha vez máis, e de novo, ata i ++ induce a un valor de 50. A condición, a continuación, di, 50 é inferior a 50? A resposta, claro, é que non, e de xeito que o código enteiro para a execución. E se tes máis código da pantalla a continuación, isto é o que pasa a continuación. Salta para fóra destas claves e segue a imprimir máis que despois. Entón unha broma agora, dende foxtrot, que quizais agora entender. É sempre divertido. É como as risas tipo de coar, e entón entender que non debe estar rindo de humor como este. Pero hai algúns takeaway aquí, pedagoxicamente, tamén. Así, verifícase que eu son falta unha peza de sintaxe, ou Foxtrot de perder unha peza de sintaxe aquí. O que falta, que tivemos en todos os outros exemplo, ata agora? Retorno, está aí, entón iso é outra cousa, que imos volver antes de tempo. O que falta, con todo? Si. PARTICIPANTE: O inicio do [inaudível]. DAVID Malan J: Aceptar. Entón, si. Entón, en realidade, iso é-- Ben, e conta é inicializar enriba, ou mellor, declarou-se por riba. Polo tanto, esta é outra forma de facelo. Pero non en liña recta é válida aínda. E aquí? PARTICIPANTE: É as claves? DAVID Malan J: Si. Así, as claves están en falta. Pero este código, quero dicir, para o seu crédito, é, en realidade, sintaticamente válido. Acontece, non precisa das claves se ten só unha liña de código que quere realizar dentro do loop. Agora, sempre, en clase e na todo o noso código de distribución, inclúen as claves de calquera xeito, só por unha cuestión de claridade. Pero entendo que en libros de texto e exemplos en liña, pode moi ben ver rizado cintas falta algún día. E iso é OK, se o que ter recuado e destinados é só unha soa liña de código, e non varias liñas de código, potencialmente. Todo ben. Entón, en relación coa cuestión da imprecisión, é un problema de estourido, no sentido de que, de forma semellante, enteiros non teñen límites para eles así como valores de punto flotante? No mundo dun punto flotante valores, só podemos ser tan preciso, tras o que, ás veces, cousas malas poden ocorrer, e os nosos programas poden ser buggy e erro. Agora, mesmo con números enteiros, pode realizar en problemas. Agora un número enteiro non ten un punto decimal ou números tras el. É só un número natural, normalmente. Entón, o que podería dar mal con un int? Se está a usar un int para contar, o que podería dar mal? Parece moito máis simple. Si. PARTICIPANTE: O número queda [inaudível] DAVID Malan J: Si. E se contar tan alto, que Non podo expresar que realmente gran número. Non? Nalgún momento, vai a superar os límites dun valor de 32 bits ou un valor de 64 bits. Agora, de novo, eu non sei como pronuncia un valor de 64 bits, pero sei que cun enteiro de 32 bits, o maior valor que pode ser, se é só positivo valores, é de aproximadamente 4 millóns. Entón, se eu tentar contar ata 5 millóns, algo que vai ocorrer. Pero imos ver o que, de feito, pode pasar. No mundo de enteiro estourido, onde, en certo sentido, rebosar a capacidade dun enteiro, o que podería ocorrer? Entón aquí está un número binario, é un retroceso para 0. É todo 1 do e os espazos reservados alí, son potencias de 2, polo que este é binario. Entón, estas son 8, os bits 1 na pantalla. E se se lembra ou rapidamente facer a matemática, o valor que está a ser representado aquí con estes oito bits de 1? 255. E mesmo se non ben seguro da matemática, podería facelo para fóra. Ou podería só especie da razón a través del, agarde un minuto, se eu son representando un valor de 8 bits, e eu teño 256 valores posibles, pero o primeiro dos cales é 0, Eu só sei que o maior será 255, e iso é o que este podería ser. Entón supoño que eu tente engadir 1 a este valor. O que faría no grao escola cando engadir a 1, e non encaixa porque ten que levar o 1? ¿Que é este número vai para facer-se cando engadir un? Vai facer se 0. Non? Porque se tivese máis bits-- e eu vou tentar, tipo de, escriba-o para fora aqui-- se tivésemos máis bits, o que podería facer aquí é engadir a 1, e entón teriamos iso. Whoops. Teriamos un 1 bit por todo o camiño ata aquí. Pero se se trata dun finito valor, é só 8 bits, e iso é pre-determinada polo ordenador, 1 que é eficaz non existe. É só unha especie de cae dun penedo. E por iso, se engadir 1 a 255, o que valor que aparentemente chegar? 0. E así as cifras accidentalmente, e, se cadra, sen querer, acabar inclúen en torno a como este. Entón, o que pode ser a implicación diso? Así, hai algunhas cousas diferentes. Entón, un, non acaban buscando como 0, sen querer, pero pode tipo de ver, mentres que no mundo real, para mellor ou para peor, manifestacións desa idea dun límite. Por exemplo, calquera de vostedes que Xa xogou Lego Star Wars, Alguén por casualidade sabe o número máximo de moedas pode recoller en Lego Star Wars? Tomé un palpite baseado cuestións principais de hoxe. É maior que 256 ou 255. É 4 millóns. Así, ao parecer, e hai algunhas pessoas-- algúns googling confirmou última noite-- comezar 4 millóns de moedas de ouro, ou outros adornos, en Lego Star Wars. Aínda que, ao parecer, non hai unha forma de enganar o xogo, hai un erro ou recurso, que permite a vostede só acumular lotes e lotes de puntos. Pero a maior posible valor, segundo a esta captura de pantalla de alguén que eu atopados en liña, é de feito, 4 millóns. Agora, por que é isto? É precisamente 4 millóns, probablemente porque alguén decidiu, que estaba escribindo este xogo, que poderían facer 4 millóns, algo, algo, algo, como o valor engada co calculador anterior, pero é só un pouco máis limpo para o ser humano para dicir o número máximo de coins-- ou cravos, como eles chaman eles-- que pode recoller é 4 millóns. E así, por que é isto? Como é o xogo LEGO o contador de execución que está mantendo o control da número de moedas que ten? Eles están a usar o que? PARTICIPANTE: El deixa contando tras 4 millóns. DAVID Malan J: El deixa contando tras 4 millóns, que significa que pode inferir, como un programador, que son, probablemente, usando un número enteiro de 32 bits. Como o programador literalmente só ingresaran, int, no seu código, e ese é o tipo de variable que eles están a usar para almacenar o código de alguén. Polo tanto, hai outras manifestacións destes tipos de límites. Entón eu non xogar este game-- e eu estaba lendo sobre a historia para confirmar como much-- pero no versión orixinal da Civilización, onde vostede parecer interactúan uns cos outros e poden facer a guerra ou a paz, Gandhi era quere que sexa un dos os personaxes máis pacíficos, como eu comprende-lo, en primeiro versión de Civilization. E, de feito, nunha escala de 1 a 10, súa agresividade era só un 1. Entón, sempre tan lixeiramente agresivo, aparentemente. Pero nalgún momento, pode, ao parecer, instalar a democracia na súa xeografía. E se instalar a democracia na súa versión do xogo, a continuación, o seu nivel de agresión vai para abaixo. É unha cousa boa. A xente está máis tranquilo aparentemente, nesa situación. Pero, ao parecer, alguén fixo non ten unha, que, condición na versión orixinal do código. Entón nivel agresión de Gandhi pasou de positiva 1, menos 2, para un negativo, pero o xogo non fai entender os números negativos. Entón, o que pasou foi a agresión de Gandhi nivel pasou de 1 a 0, a 1 negativo, que tivo o efecto de envolvendo en torno a ser o personaxe máis agresivo no xogo, a un valor de 255, nunha escala de 1 a 10. E, desde entón, houbo máis encarnações deste xogo, e mantivéronse como unha especie de ovo de Pascua, Gandhi que é aparentemente tan terriblemente agresiva. Pero foi o resultado dun erro de programación moi simple nesa versión moi inicial do xogo. Agora, máis perturbador, máis recentemente, o Boeing 787 foi documentada como tendo unha erro, non o tipo de dispositivo vostede particularmente quero ter un erro. E os síntomas, que eu vou ler aquí, a partir dun artigo en liña, Foi este, un modelo 787 avións que foi continuamente alimentado para 248 días pode perder todo corrente alterna, AC, enerxía eléctrica, debido as unidades de control do xerador, GCUs, simultaneamente entrar no modo de fallos. Polo tanto, este foi un aviso emitido cando este problema foi detectado. Esta condición é causada por un contador de software, interno ao GCUs, así un número enteiro ou unha variable, que rebordan vontade tras 248 días de potencia continua. Boeing é o proceso de desenvolvemento dunha actualización de software que GCU vai resolver a condición insegura. Tan parecido ao mísil escenario, no que tiñan algún tipo de variable que contaba, e contando, e contar, pero transbordador gradualmente os límites da súa capacidade, fixo do mesmo xeito que o avión de maldición ter un estourido de variable despois de bastante tempo de execución. E así o camiño tongue-in-Cheek de traballar en torno a esta cuestión é, en realidade, reiniciar, o avión toda 247 días, para que a memoria é eliminada ea variable vai cara atrás a 0. Pero entender, este é un moi gran encarnación de software, pero sobre todo porque escoitamos falar sobre Apple sistemas operativos de entrar en coches, e coches de auto-condución de Google, e calquera número de encarnações de software Na nosa vida diaria, TVs e reloxos, e moito máis, entender foron cercados por software, todo o que está escrito por nós seres humanos. E, como todos nós imos descubrir en breve, é moi doado e moi típico a cometer erros ao escribir software. E se non pegá-los, algunhas cousas malas poden ocorrer. Agora, ás veces, algúns cousas divertido poden acontecer, ou, polo menos, ás veces saber esperar algunha maldade. Así 0 dividido por 0, dende o grao escola, xeralmente é unha cousa mala. É indefinida. E resulta out-- e imos ver se meu micrófono pode escoller este up-- que Apple tivo un desfrute con este pouco. Entón, eu teño un iPhone aquí. Vou falar con Siri e pedirlle para me dar a resposta a 0 dividido por 0. O que está dividido por 0 0? Siri: Imaxina que ten 0 cookies, e división las uniformemente entre 0 amigos. Cantos as cookies que cada persoa recibe? Ve? Non ten sentido. E Cookie Monster é triste que non existen galletas. E está triste que non ten amigos. DAVID Malan J: É unha especie de desagradable. Polo tanto, este é só o que se dixo alí. É indeterminado, non é definida, E de feito, moitas linguaxes de programación ou, realmente, compiladores detectar cando, nun programa, tentar dividir 0 por 0. Máis divertido do que iso, con todo, é que, ao parecer, Cookie Monster está en Twitter estes días. E el respondeu a esta, con iso, que é absolutamente encantador. Pero imos dar unha rápida ollo a un par de outras construcións, e logo poñer algunhas destas código de usar, en boas maneiras. Entón non é que, ademais de loops, hai algo chamado un loop while, que parece diferente e é aplicado un pouco e differently-- imos finalmente ver examples-- pero, en certo sentido, é máis simple porque non permite que para arrincar e actualizar dentro do límite do circuíto. Aínda pode implementar lo. Para que poida facer exactamente as mesmas cousas cun loop while, como con un loop for, pero a súa sintaxe, ultimately-- como imos finalmente see-- vai ser diferente. Hai incluso un loop Do While, que é realmente un pouco diferente, en que, mentres un loop e un loop while sempre comprobar a súa condición de primeira, se ler esa cousa de arriba abaixo, que tipo de parece que vai comprobar-lo da condición do último porque é verdadeiramente a última liña de código. E, de feito, que vai ser útil en determinados programas que escribimos, se quere só facer algo cegamente e, finalmente, comprobar a condición. Iso non é necesariamente unha cousa mala. Se queremos variables, podemos facer Lo nun par de formas diferentes. E vimos no Foxtrot debuxos animados, un xeito de facelo, onde declarar a variable, como int contador de punto e coma, e, a continuación, later-- quizais o próximo liña, quizais 10 liñas later-- realmente arrincar-lo. Así estas 2 liñas de código declarar unha variable de tipo int e chamalo de balcón, polo que dá- min abondo bits para realizar un int. E, a continuación, finalmente, el pon o valor 0 para esa variable. Ela organiza os 0 e 1 nun dos estándar, que sabemos que desde a semana pasada, representa o número que coñecemos como 0. Ou, francamente, pode facelo moi de forma máis sucinta, como esta. Agora temos tamén a capacidade de chamar funcións. E, de feito, aquí está unha liña 2 programa, ou unha parte do mesmo, que nos permite, de feito, escribir un código que recibe unha cadea do user-- moi como o noso voluntario nun momento ago-- almacenando o resultado unha variable chamada nome, e entăo-- moi parecido ao noso voluntario con estampas printf-- fóra eses valores pasando en dous argumentos, o cadea, seguida da variable chamado, nome, en si. Entón, imos dar un ollo, antes de queremos volver a Mario alí, nun par de agora, exemplos diso. Eu estou indo a ir adiante e aberto ata, imos dicir, a función-0.c. E como sempre, este código é dispoñible na páxina web do curso, para que poida tocar xunto con casa e mirar para el máis tarde. Pero aquí está o programa no que é Esencialmente, a partir da liña 17 a 22. O programa principal é onde a programa é sempre vai comezar. Este programa, ao parecer, vai para imprimir o seu nome, colon. É, a continuación, vai chamar GetString, tal como fixemos cos nosos voluntarios. E entón, iso é interesante, vai chamar PrintName. Acontece que, durante todo este tempo, non parece ser unha función chamada PrintName. Que amosa o nome de alguén. Non precisa utilizar printf de pasado, hai PrintName. Pero iso é enganoso porque non fai PrintName veñen con C. A xente non inventar lo o 40 ou 50 anos, Eu fixen, no seu lugar. E, de feito, se eu rolar aínda máis para abaixo, aviso como podo escribir o meu propio funcións en C. imos finalmente explicar por que seguimos dicindo: baleiro, nalgúns lugares, pero para hoxe, imos basta ollar para o nome. Na liña 24, se quere crear a súa propia función, vostede literalmente escribir o nome da función. Eu escollín PrintName. En parénteses, vostede a continuación, especificar que tipo de insumos, e cantos quere esta función para tirar. Neste caso, quero leva 1 variable chamada, nome, e que será de Tipo, corda, polo que vai para ser unha secuencia de caracteres. E entón, este program-- así como no scratch, pode que puzzle personalizado pieces-- vai ter ese comportamento personalizado. Vai chamar printf pasando, Ola, espazo reservado, e, a continuación, que vai liga en todo o que o usuario chamado. Polo tanto, este é un exemplo do que un científico da computación sería abstracción chamada ou funcional descomposición, que son só formas extravagantes de dizendo-- é desexa desa idea de alto nivel, como quero funcionalidade que imprime o nome de alguén, absolutamente ten Pode literalmente escribir printf e despois pasar os argumentos que quere, o programa pode funcionar, como foi desde mércores. Pero pode comezar a abstraerse a noción de impresión dun nome. Pode darlle un nome, como PrintName, e este é esa idea de capas de semana 0. De agora en diante, eu e vostede non ten que saber ou lle importa como PrintName é aplicado. Si usa printf, é posible que non, quen sabe o que usa? Quen lle importa? Agora eu estou falando aquí, en vez de baixar aquí. E, de feito, como os nosos programas de obter máis avanzada e sofisticada, imos seguir a tomar para concedida que hai máis baixas pezas do puzzle nivel. Porque escribimos los ou alguén fixo, entón que podemos, entón, construír enriba deles. Imos dar un ollo neste variante, funciona un. Entón, este é un pouco máis avanzado, pero verifícase se que na biblioteca de CS50, hai só unha función GetInt. Non pensamos que, anos atrás, para aplicar unha función GetPositiveInt. E iso é un pouco aburrido, porque se vostedes están escribindo un programa no que Quere ter un positivo número enteiro do usuario, pode perfectamente usar GetInt. E pode absolutamente comprobar a condición e quizais un loop Se é maior que int que 0 e berrar co usuario se el ou ela non dá vostede un número positivo. Pero imos construír este edificio bloquear a nós mesmos, un, peza Raspadinha costume, se quere. Vou ter un programa aquí que, en definitiva, Eu quero ser capaz de chamá- GetPositiveInt, e quero ser capaz de imprimir o que quere que é int. Pero iso é abstraída agora. El acaba de ser dado un alto nivel nome que di que fai, que é marabilloso porque é moi intuitiva agora de ler. E se eu me importa o que está por baixo o capó, déixeme rolar para abaixo. E é un pouco intimidante en primeiro lugar, especialmente se este é o seu primeiro programa, pero imos dar un ollo. Eu non estou dicindo, baleiro, pois parece que funcións, moi parecido GetString, pode voltar un valor para min. Non só teñen para imprimir en pantalla, realmente poden entregar me algo de volta. E que antes PrintName, Eu non teño nada de volta. Eu precisaba do efecto colateral de algo aparecendo na pantalla, pero eu non teño un home darme algo de volta. Aquí, con GetPositiveInt, como con GetInt, Quero ser entregado algo de volta. Entón, eu estou dicindo non, baleiro, na liña 23, pero int, que di, esta función que estou escribindo, chamado GetPositiveInt vai entregar-me de volta un enteiro, non nada, non baleiro. Mentres tanto, que vai tomar ningunha entradas, así que, tipo, inverteu-lo. Non estou dando calquera GetPositiveInt entrada, quero que me dea a súa saída. E entón o que pasa agora? Entón aquí está como eu pode declarar unha variable. Xa fixen iso fóra do loop, por razóns imos finalmente ver, pero iso só dá me 32 bits chamado, N, e eu teño pre-determinación los para almacenar enteiro. E aquí é que, facer mentres construción, e é por iso que é útil. Literalmente iso, mentres N é inferior a 1. Entón imos ver o que acontece. Eu imprimir, por favor déame un int positivo. Eu, entón, obter un int, usando de CS50 funcionar e almacenado N. E entón, o que liña de código, probablemente, corre preto, loxicamente? Cal o número da liña? Si, entón 31. Non sabería diso ata que teña se dixo ou tipo de inferir que, pero iso é verdade. Vai de arriba abaixo e, a continuación, segue a repetir. Entón, se eu ter escrito por exemplo, o número 1 negativo, é n menos do 1 negativo? Si. Porque negativa 1 é inferior a 1. Entón, o que debe ocorrer? Eu vou facelo mentres N é inferior a 1, entón eu vou volver á liña 28. E cada un tempo-- e imos correr isto-- facer a función de 1 a compilalo lo, e agora dot cortar función 1. Se eu escribir un negativo, é seguirá berrando comigo ata que eu cooperar porque cada das miñas entradas é inferior a 1 e se é inferior a 1, mentres que, Vou continuar facendo iso. Se finalmente darlle un número como 50, por sorte, el di que, grazas ao 50. Por que? Porque así que n non sexa inferior a 1, eu paro de estar preso neste loop, e esta nova contrasinal hoxe, retorno, literalmente fai iso. Entón eu acaba aplicado, nunha sentido, o equivalente a GetString, onde estou devolvendo a quen me a usar, algún valor. Non ten que ser unha corda, é un int. Así, un simple, rápido exemplo, pero nós imos en breve ver un pouco máis sofisticado versións aínda. De feito, imos dar un ollo a un un numérico, que se chama return.c. E este é, en realidade, un pouco máis simple. Así, o propósito deste programa en vida-- imos compilar e executalo, polo que asegúrese retorno, dot barra, aviso return-- o programa simplemente cubos o valor 2. É moi estúpido, é difícil código, non hai que ningún entradas, pero iso demostra outro función que me escrito. Entón aquí, eu teño declarado variable, chamado x, do tipo int, igual ao número 2, completamente arbitraria. Este é só algunha impresión gordo. Di x é agora, e tal tal, cubing dot dot dot. E a maxia está aparentemente en liña 21. Estou chamando unha función chamada, cubo, Estou entregándolle unha folla de papel co número 2 escrita nel, e que o valor que matematicamente, quero saír dela? Así como unha comprobación de sanidade? 8. Non? Quero dous cubos de volta, 2 a a potencia de 3, de xeito 8 de volta. Entón, onde está cubo aplicado? Ben, a notificación é aplicado aquí debaixo. E, así como antes, loxicamente, aínda que a sintaxe é probablemente moi novo para moitos de vós, Quero esa función para me devolver unha folla de papel cun int nel. Entón, eu teño un int, o nome é arbitrariamente, pero convenientemente denominado cubo. A entrada para el, n é de tipo enteiro, o que é Como eu pasar no número 2 nunha folla de papel. E, a continuación, comproba-se soportes C matemáticas, así que non ten x para os tempos, só usar o asterisco para a multiplicación. E iso volve n veces n veces n, o cal é simplemente un valor ao cubo. Entón, a onde estamos indo con todo isto? Este é sempre un tour lóstrego, seguro, que as seccións de super en e no conxunto de problemas 1, vai ser orientado polo todo isto aínda máis. E nun conxunto de problemas, imos transición do mundo gráfica do Scratch para algo máis na liña de comandos en C. Pero imos inspirar- a partir deste xogo aquí doutros tempos, en que usando C ea edición estándar do p set ti implementará pirámide de Mario. E na edición de hackers do p set, se así o desexan elixir, vostede implementará un pouco máis desafiando pirámide con dous picos. Tamén vai implantar un algoritmo, un algoritmo lambón. Acontece que hai algunha lóxica interesante detrás do proceso de executando unha estación de cashier e, de feito, entregando- alguén cambio de volta. Existe un algoritmo que é moi simple, que pode ata comprender intuitivamente cando lin por primeira vez ele-- entendendo que é o que eu sempre feito en calquera momento eu teño dado a alguén nalgún traseira-- diñeiro que lle permite sempre minimizar o número de notas de papel ou moedas que está entregando ao seu usuario. E iso, por suposto, é convincente porque se vai a CVS ou outros enfeites, non quere ser handed unha morea de os ou unha morea de moedas de un centavo. Quere que o menor moedas probablemente posible. Por último, tamén será reto a involucrarse no mundo da auga e realmente obter unha valoración para un mapeamento entre os tipos de fluxo, de gusto, de auga nun ducha, canta auga é usada. E a alusión nel, será este clip aquí, que imos acabar só 60 segundos, que pinta un cadro de cabezas de ducha de baixo fluxo. [REPRODUCIÓN DE VIDEO] -Está Ben. Eu teño todo aquí. Eu teño o Cyclone F series, Hydra, Jetflow, Estocolmo Supersteam, o nome del. -E O que recomenda? -O Que está a buscar? -Power Home. Potencia. -Como Silkwood. -Iso É a radiación. -É Correcto. -Agora ¿Que é iso? -Iso É o Comando 450. Non vendo aquel. -mais Iso é o que queremos. É un comandos 450. -Non Pensa en min. El só se usa no circo. É para elefantes. -Vou Pagar nada. -E Jerry? -El Non podía tratar con isto. É delicado. Oh yeah. [FIN DE REPRODUCIÓN] DAVID Malan J: Todo ben. Isto é, para CS50. Imos velo a próxima semana. COLUMNA 1: [? Scully?] [? Ian ,?] na medida en que este proxecto Outro, o que vostedes chegar a? COLUMNA 2: Ben, nós demos unha variedade de pensamento, e pensamos que a mellor maneira a-- COLUMNA 3: Podo? COLUMNA 2: Si. Por todos os medios, en realidade. COLUMNA 3: Entón eu creo que podemos resumir a nosa idea para os Outros, cunha nada word--. DAVID Malan J: Nada? COLUMNA 3: Nada. DAVID Malan J: Que significa isto? COLUMNA 3: Os Outros son sobre nada. COLUMNA 2: Ben, quero dicir, en filosofía, Quero dicir, nada é sempre algo. COLUMNA 1: Entón what's-- o que é a premisa? COLUMNA 3: Entón é como a vida. Aceptar. O que fixo hoxe? DAVID Malan J: Eu me levantei, tiven almorzo, e veu para traballar. COLUMNA 3: Isto é unha chamada outro. COLUMNA 2: Pero, quero dicir, non debería algo ocorrer con el en as-- COLUMNA 3: Non, non, non, non. Nada acontece. COLUMNA 1: Entón por que estamos asistindo? COLUMNA 3: Por é un Outro para CS50. DAVID Malan J: Aínda non.