[MÚSICA DE XOGO] DAVID J. Malan: Todo ben. Este é CS50, e este é o inicio da semana dous. Entón, imos comezar hoxe cun erro. Un erro, por suposto, é unha erro nun programa, e vai ter moito familiarizado co concepto Se nunca programou antes. pset0 e agora pset1. Pero imos considerar algo algo simple a primeira vista. Este programa aquí que eu xogou en conxunto con antelación, e eu afirmo que este debe imprimir 10 estrelas na pantalla empregando printf, pero, ao parecer, con erros de algunha maneira. Dado que a especificación que debe imprimir 10 estrelas, pero non fai parecer o que tería a pretensión é o erro? Si? Polo tanto, é un fóra por un erro, eo que quere dicir con iso? Está ben. Excelente. Entón, nós temos un determinado valor igual a cero para comezar i, e que teña indicado un valor de n de 10, pero temos usado menos que ou igual a. E a razón que este é dúas personaxes e non só un símbolo, como nun libro de matemáticas, é que non ten unha forma de expresar o un equivalente de caracteres. Entón isto significa que menos, pero se comezar a contar desde cero, pero contar todo o camiño cara arriba a través e igual a 10, está, por suposto, vai contar 11 cousas en total. E así vai imprimir 11 estrelas. Entón, o que pode ser unha solución para isto? Si? Entón, só tes que axustar a menos de ou igual a ser un pouco menos que, e hai, eu afirmo, é posible outra solución, tamén. Que pode máis que fai? Si? Entón comeza igualándose a 1, e deixar a menos que ou igual a. E, sinceramente, eu tería a pretensión que, para un ser humano típico, esta é probablemente máis simple. Comezar a contar en 1 e contarlle a 10. Esencialmente facer o que quere dicir. Pero a realidade é, en programación, como vimos, científicos da computación e programadores xeralmente non comezar a contar desde cero. E iso é bo xa se acostumar con iso. A súa condición pode xeralmente ser algo así como menos. Entón simplemente unha lóxica erro que poderiamos agora corrixir e finalmente recompilar iso e obter só 10. Así como sobre este erro aquí? Aquí, unha vez máis, afirmo que estou unha meta de impresión 10 stars-- un por liña neste momento, pero iso non acontece. Antes de propor o que a corrección é, o que o fai imprimir visualmente, se eu fose para compilar e executar este programa que pensas? Si? Star. Entón, as estrelas no mesma liña é o que escoitei, e, a continuación, o carácter de nova liña. Entón, imos tentar iso. Entón faga de buggy-1, entrar, e eu vexo a orde clang que falamos por última vez. ./buggy-1, e de feito vexo todos os 10 estrelas na mesma liña, aínda que eu reclamo na miña especificación só un comentario enriba o código que eu pretendía facer un por liña. Pero iso parece correcto. Agora liña 15 parece que eu son a impresión de unha estrela, e despois a liña 16 parece que eu son impresión un carácter de nova liña, e ambos están tan recuados Estou dentro do loop de forma clara. Entón, eu non debería estar facendo estrela, novo liña, estrela, nova liña, estrela, nova liña? Si? Si, pola contra dunha linguaxe como Python, se está familiarizado, cartela non fai importa para o ordenador. Isto só importa para o ser humano. Entón liñas mentres que aquí eu inventei 15 e 16-- parecer bonito, pero o ordenador non liga. O ordenador se preocupa realmente ter claves en torno destas liñas de código. Así que é clear-- así como en Scratch-- que estas dúas liñas de código debe ser executado. Como unha desas rompe-cero amarelo anacos de novo e de novo e de novo. Polo tanto, agora se eu re-executar esta program-- ./buggy-2-- Hm. Eu teño un erro agora. O que eu esquezo de facer? Si, entón eu non compilalo. Entón faga de buggy-2. Ningún ficheiro porque eu non fixen realmente compilar a segunda versión. Entón agora interesante non declarada non variable-- 2. Estamos facendo 1. Fai de buggy-1-- ./buggy-1-- e agora cada un deles está na mesma liña. Agora hai unha excepción para esta suposta alegación de mina que precisa destas claves. Cando é realmente ok-- se ten notado na sección ou textbooks-- omitir as claves? Si? Exactamente. Cando hai só unha liña de código que quere para ser asociado coa lazo como no noso primeiro exemplo. É perfectamente lexítimo omitir as claves só como unha especie de barrio do compilador para ti. Si? Boa pregunta. Sería considerado un erro de estilo? Queremos promote-- como en CS50 guía de estilo, a URL á que en que é sempre pset1-- utilizar as chaves. Certamente, se é novo na programación. A realidade é que non estamos vai prohibir-lo de facer estas conveniencias. Pero se está só comezando ao balance das cousas, absolutamente xusto usar o rizado claves ata incorporarse o xeito del. Boa pregunta. Todo correcto. Para que entón era un erro. Polo menos nunha cousa moi sinxelo. E aínda pode pensar que iso é moi rudimentaria, non? Esta é unha especie de primeira semana de ollar para a linguaxe como, ver os seus erros nel. Pero a realidade estes son realmente representativo dalgúns problemas moi asustado que poden xurdir no mundo real. Entón, algúns de vostedes poden lembrar se seguir de noticias de tecnoloxía, ou quizais mesmo pego vento desta en febreiro do ano pasado que Apple tiña fixo un pouco de un erro en ambos iOS, o sistema operativo en seus teléfonos, e tamén VOS, o sistema operativo nos seus escritorios e portátiles. E viu esas titulares como esta. E despois diso, Apple prometeu para corrixir este erro, e moi rapidamente fixo resolve-lo en iOS, pero, a continuación, en definitiva, fixa-lo en Mac OS ben. Agora ningunha desas titulares só realmente revelan que o problema subxacente era, pero o erro foi finalmente reducida a un erro no SSL, Secure Sockets Layer. E short longo da historia, este é o software que os nosos navegadores e outros software usado para facer o que? Se eu dixo que é SSL parte, sempre que visitar unha URL que comeza con HTTPS, entón o que pode estar relacionado con SSL? Criptografía. Entón imos falar iso nos próximos días. Criptografía, a arte de codificación de información. Pero short longo da historia, Apple hai algún tempo atrás había cometido un erro na implantación da SSL, o software que aplica, en definitiva URL como HTTPS ou max conexións alí tamén. O resultado disto é que o seu conexións podería potencialmente ser interceptado. E eran os seus contactos non necesariamente cifrada se había algún bandido no medio vostede eo sitio de destino que soubo sacar proveito diso. Agora, Apple, en definitiva posta Unha corrección para ese fin, ea descrición da súa corrección foi iso. Transporte seguro non conseguiu validar a autenticidade da conexión. A cuestión foi abordada por restaurando pasos de validación desaparecidas. Polo tanto, esta é unha explicación moi ondulado man para simplemente dicir que errou. Hai, literalmente, un liña de código que foi de buggy na implantación da SSL, e se ir en liña e investigación para este realmente pode atopar o código fonte orixinal. Por exemplo, esta é unha captura de pantalla só unha porción dun ficheiro moi grande, pero esta é unha función chamada aparentemente SSL comprobar o intercambio de chaves do servidor sinal. E ten unha morea de argumentos e insumos. E nós non estamos indo a concentrarse moito sobre a minuciosa alí, pero se concentrarse no código dentro de que no extremo superior function-- imos ampliar iso. Xa debe sospeitar que o erro pode ser mesmo se non ten idea en definitiva, o que está mirando. Hai unha especie de anomalía aquí, que é o que? Si, realmente non me gusta a mirada de dous emprendedores falla. Francamente, eu non sei realmente o que Goto falla medios, pero tendo dous deles back to back. Isto medio que me esfrega intelectualmente o camiño mal, e, de feito, se aumentar o zoom en só aquelas liñas, este é C. Entón, unha morea de código de Apple está-se escrito en C, e iso, ao parecer, é realmente equivalent-- non para que moi retirada versión, pero se recoñecer o feito que non hai chaves, o que Apple realmente escribiu foi o código que parece así. Así que grande para fóra, e eu só fixa a retirada no sentido que, se non hai chaves, que Ir á segunda falla que está amarelo vai realizar, non importa o que. Non está asociado con se a condición enriba dela. Así mesmo, de novo, se non moi entender o que iso podería estar facendo, sei que cada un deles conditions-- cada unha destas liñas é un paso moi importante no proceso de verificación se os seus datos son de feito cifrado. Así, saltando un deses pasos, non é a mellor idea. Pero por que temos este segunda emprendedores fallan en amarelo, e porque, xa que tipo de esteticamente movelo á esquerda, onde loxicamente é, no momento, o que que iso supón para a liña de código embaixo que segundo Goto deixar que pensas? El sempre será ignorada. Entón gotos son xeralmente desaprovado por razóns que non vai realmente entrar, e mesmo en CS50 non tenden para ensinar esta Goto declaración, pero pode pensar en Goto falla no sentido de ir de salto a outra parte do código. Noutras palabras saltar esta última liña completo, e de xeito que o resultado desta burro simple erro que foi só un resultado probablemente alguén copiando e pegando un tamén moitas veces é que o enteiro seguridade do IOS e Mac OS era vulnerable á interceptación por bandidos por algún tempo. Ata que Apple finalmente resolveu ese. Agora, algúns de vostedes son realmente executando versións de iOS ou Mac OS, pode ir gotofail.com que é un sitio web que alguén configurar para determinar esencialmente programaticamente Se o seu ordenador aínda está vulnerable. E, francamente, de ser, probablemente é unha boa idea para actualizar o seu teléfono ou Mac neste momento. Pero alí, só proba de quão unha apreciación destes nivel máis baixo detalles e moi ideas simples realmente traducir-se en decisións e os problemas que affected-- neste caso-- millóns de persoas. Agora, unha palabra sobre a administración. Sección terá comezo o próximo domingo. Recibirá un correo electrónico polo fin de semana sobre a sección, en que punto o proceso de ressecção comezará se ten entender que ten agora uns novos conflitos. Entón, isto ocorre todos os anos, e nós acomodará nos días que virán. Oficina horas-- facer manter un ollo nese horario aquí. Cambia un pouco esta semana, especialmente a data de inicio ea localización, así que consultar que antes de ir para o horario de expediente calquera dos próximos catro noites. E agora unha palabra sobre a avaliación, particularmente como mergullo no problema define un e alén. Así, segundo a especificación, estes son xeralmente Os eixes podemos avaliar o seu traballo. Alcance refírese ao que medida seus implementos código os recursos necesarios pola nosa especificación. Noutras palabras, como un conxunto de pezas que fixo morder. Vostede fixo un terzo do mesmo, unha metade, o 100% da mesma. Aínda que iso non é correcto, como é que tentar? Así que capta o nivel do esforzo e da cantidade para que mordeu a problemas problema do aparello. Correctness-- este, para que punto, é o código consistente coa nosa especificacións e libres de erros. Así é que funciona correctamente? Se derme algunha entrada, non é dar o resultado que esperamos? Design agora este é o primeiro de os particularmente cualitativas ou os que esixen o xuízo humano. E, de feito, é por iso que temos un equipo de tantos compañeiros de ensino e curso asistentes. Ata que punto a súa código escrito así? E unha vez máis este é un moi avaliación cualitativa que pode traballar con vostede en bidireccional nas próximas semanas. De modo que cando non pode puntuación só numérico, senón tamén un partituras escritas, ou producto ingresaran, ou feedback escrito en palabras en inglés. Iso é o que imos usar para levalo para realmente escribir un código mellor. E na charla e sección, imos tratar para apuntar out-- tan frecuentemente como nós posso-- o que fai un programa non só correcto e funcionalmente boa, pero tamén ben deseñado. O máis eficaz que se pode, ou mesmo a máis fermosa que pode ser. O que nos leva ao estilo. Estilo en definitiva é un xuízo estético. Escolleu ben nomes para as variables? Vostede recuado o código correctamente? Será que unha boa aparencia e, polo tanto, é máis fácil a outro ser humano lendo o seu respectivo da súa corrección. Agora xeralmente por o plan de estudos, marcamos isto nunha escala de cinco puntos. E déixeme martelar a punto que é de feito unha boa tres. Moi rapidamente que o persoal do comezar a facer aritmética. Cando chegar a tres de cinco na corrección por algún pset e eles pensan que nada, eu vou para 60% o cal é esencialmente un D ou un E. Esa non é a forma que nós pensar neses números. A tres é realmente bo, eo que nós en xeral esperan que ao principio do termo é que, se está a recibir unha banda de three's-- quizais un par de feiras, un par de fours-- ou un par de pares, un par de fours-- iso é un bo lugar para comezar. E mentres vemos unha traxectoria ascendente ao longo do tempo, está nun lugar particularmente bo. A fórmula que usan para cousas de peso é esencialmente este acordo co plan de estudos, o que significa só que nós dar máis peso á corrección. Porque é moi frecuentemente corrección que leva máis tempo. Confío en min agora. Vai find-- polo menos en que un pset-- gastar 90% do seu tempo traballando 10% do problema. E todo tipo de obras con excepción de un ou dous erros, e estes son os erros que mantelo ata tarde de noite. Aqueles son os que especie de escapar de ti. Pero despois de durmir sobre el, ou a participar horario de oficina ou facer preguntas en liña, é cando chegar a esa meta de 100%, e é por iso que o peso CORRECCIÓN máis. Proxecto algo menos, e estilo un pouco menos do que iso. Pero teña en estilo mente-- É quizais o máis fácil destes para morder segundo a guía de estilo. E agora, a máis grave nota na honestidade académica. CS50 ten a infeliz distinción de sendo o maior produtor de tarxeta do anuncio casos, case todos os anos historicamente. Isto non é porque os alumnos trapacear en CS50 máis do que calquera outra clase, senón porque a natureza do traballo, o feito de que é electrónico, o feito de que nós miramos para el, e o feito de que son científicos da computación, Eu podo dicir que, por desgraza, son moi bos en detectar iso. Entón, o que iso significa en termos reais? Por iso, segundo o plan de estudos, filosofía do curso realmente se reduce a ser razoable. Existe esa liña entre facendo o seu traballo por conta propia e obter un pouco de axuda razoable dun amigo, e definitivas facendo este traballo para a súa amigo, ou enviar-lle o código de xeito que el ou ela pode simplemente incorporarse ou incorporarse prestado seguro. E que cruza a liña que sacado da clase. Mira, o plan de estudos en última instancia, para as liñas que trazamos como razoable e comportamento irracional, pero realmente ferver ata a esencia do seu traballo a necesidade de ser o seu propio no final. Agora, co que dixo, hai unha heurística. Porque, como pode imagine-- do horario de expediente e os recursos visuais e os videos que mostra así far-- CS50 é de feito a intención de ser tan colaborativo e como cooperativa e como sociais como sexa posible. Como colaboración, xa que é rigorosa. Pero con isto dito, a heurística, como podes ver no currículo, é que cando está a ter algún problema. Ten algún erro no código que non pode resolver, é razoable para ti para mostrar o código para outra persoa. Un amigo ata na clase, correo sentado ao seu lado no horario de expediente, ou un membro do persoal. Pero eles non poden mostrar o seu código para ti. Noutras palabras, un responder á súa pergunta-- Necesito ajudar-- non é oh, aquí está o meu código. Bótalle un ollo neste e deducir desde ela o que quere. Agora, por suposto, non hai un xeito claramente ao xogo este sistema no que eu vou lle amosar meu código antes de ter unha causa. Vostede me amosar o meu código antes de ter unha causa. Pero mira o programa de novo ao pequenos detalles de onde esta liña é. Só agora pintar o cadro e compartir máis transparente posible onde estamos, nos últimos anos, este é o número de casos de tarxeta do anuncio CS50 que tivo máis Nos últimos sete anos. Con 14 casos neste outono última. En termos dos alumnos implicados, que era hai 20 algúns alumnos impares no outono pasado. Houbo un pico de 33 alumnos hai uns anos. Moitos dos que, por desgraza, son non está aquí no campus. Os alumnos implicados como unha porcentaxe do clase historicamente varía de 0% para 5,3%, que é só para dicir isto é, cada ano, un desafío. E para iso, o que queremos facer é poñer unha que só dd-- FYI-- comparar a unha xustiza para os alumnos que están seguindo a liña de acordo. Facemos comparar as actuais submissões contra todas as misións pasadas dos últimos moitos anos. Sabemos tamén como Google arredor e atopar repositorios de código en liña, foros de debate en liña, sitios de emprego en liña. Un alumno pode atopalo, podemos seguramente atopalo tanto como nós con pesar facer. Entón, o que vai ver no programa con todo, é esta cláusula arrepentimento. Podo certamente apreciar, e todos nós ten equipo ter feito o curso como este, é un esta-se ao longo do tempo, certamente sabe o que é como cando vida fica no camiño cando ten algúns tarde de noite deadline-- non só nesta clase, pero another-- cando está completamente exhaustos, estrés, teñen un número excesivo doutras cousas que facer. Vai facer nalgún momento da vida, certamente, un mal, quizais tarde decisión noite. Entón, por o plan de estudos, existe esta cláusula, tal que, se no prazo de 72 horas despois de facer algún pobre de decisión, tes ata el e estender a man para min e un dos cabezas do curso e imos ter unha conversa. Nós imos tratar con as cousas internamente na esperanza de facer máis un momento de ensino ou lección de vida, e non algo con ramificacións particularmente drásticas como se pode ver nestas cartas aquí. Entón, iso é un ton moi serio. Detenhamo connosco para uns poucos segundos para romper a tensión. [MÚSICA DE XOGO] DAVID J. Malan: Todo ben, Entón, como foi que a un segue? Para temas principais de hoxe. O primeiro dos cales é abstracción. Outro dos cales será o representación de datos, que, francamente, é realmente un xeito seca de dicir como podemos ir sobre como resolver problemas e pensar sobre a resolución de problemas? Entón xa viu en perigo, e ten quizais xa viu na pset1 con C que non só se pode usar funcións, como printf que outras persoas en ano pasado escribín para ti. Tamén pode escribir as súas propias funcións. E aínda que non pode ter feito isto en C, e, francamente, en pset1 realmente non precisa escribir o seu porque a propia función problema-- aínda que quizais difícil no primeiro glance-- verás en última instancia, pode ser resolto con Nin todo o que moitas liñas de código. Pero co que dixo, en termos de escribir a súa propia función, entender que dá C vostede esta capacidade. Eu estou indo a ir no código fonte de hoxe, que xa está dispoñible en liña, e eu estou indo a ir adiante e aberto un programa chamado función 0.C, e en función cero imos ver algunhas cousas. En primeiras liñas 18 a 23 é a miña función principal. E agora que estamos empezando a ler código que non está escribindo no momento, mais ao contrario diso eu teño escrito con antelación ou que nun conxunto de problemas recebêssemos ter foi escrito con antelación. Unha boa forma de comezar lectura de código de outra persoa é ollar para a función principal. Descubrir onde esta entrada obxectivo é realizar o programa, e despois seguilo loxicamente de alí. Polo tanto, este programa aparentemente impresións seu nome seguido de dous puntos. Logo usamos GetString desde a biblioteca de CS50 para obter unha cadea, ou unha palabra ou frase do usuario no teclado. E despois hai este cousa printName aqui--. Agora non é un printName función que ven con C. Non é en io.h. estándar Non é en CS50.h. É un pouco o mesmo ficheiro. Teña en conta que eu rolar para abaixo Liñas bit-- 25 para 27-- é só un xeito moi de comentar seu código empregando as estrelas e barras. Este é un sistema multi-liña comentar, e este é só miña descrición en azul de o que esta función fai. Porque nas liñas 28 a 31, Eu escribín unha función súper sinxelo cuxo nome é printName. Leva cantos argumentos que diría? Entón, un argument-- porque hai un argumento da lista dentro dos parénteses. O tipo de que é cadea. Que significa dicir printName é como esta caixa negra ou función que recibe como entrada un cadea. E o nome desa cadea convenientemente será Nome. Non é, non N, menos no nome. Entón, o que printName facer? É bo simple. Así como unha liña de código para o printf, pero, ao parecer, imprime "Ola", así e así. Onde o modo e de forma vén do argumento. Agora, iso non é unha gran innovación aquí. Realmente, eu tomei un programa que podería ser escrito cunha liña de código poñendo que aquí arriba, e trasladouse a algo que implica uns seis ou sete anos ou menos liñas de código por todo o camiño ata aquí. Pero é a práctica dun principio coñecido como abstracción. Tipo de encapsulação no interior dun novo función que ten un nome, e mellor aínda que o nome literalmente di que fai. Quero dicir printf-- iso non é particularmente descritiva. Se eu queira crear un parte do enigma, ou se eu quere crear unha función que imprime o nome de alguén, a beleza de facelo é que podo realmente dar esa función un nome que describe o que fai. Agora que leva, en que unha entrada Eu arbitrariamente chamado nome, pero iso tamén é marabillosas descritivo no canto de ser un pouco máis xenérico como S. E baleiro, por agora, só significa que esta función non entregar-me de volta nada. Non é como GetString que literalmente me dá de volta a cadea como fixemos cos anacos de papel cos seus compañeiros a semana pasada, pero no seu lugar, só ten un efecto colateral. Ela imprime algo na pantalla. Así, ao final do día, se eu fan función de 0, ./function-0, veremos que pide para o meu nome. Eu tecleo David, e tipo meu nome. Se eu fai iso de novo con Rob, vai dicir "Ola, Rob." Entón, unha idea simple, pero quizais extrapolar a partir deste mental que, como os seus programas obter un pouco máis complicado, e quere escribir unha peza de código e chamadas que code-- invoke code-- que por algún descritiva nome como printName, C fai nos proporcionar esa capacidade. Aquí está outro exemplo simple. Por exemplo, se eu abrir un ficheiro desde hoxe chamado return.c, entender o que eu fixen aquí. A maior parte desta función principal é printf. Eu primeiro arbitrariamente arrincar un variable chamada x ao número 2. Eu, entón, imprimir "x é agora % I "pasando o valor de x. Entón, eu só digo que é. Agora eu son só coraxosamente afirmando con printf. Estou cubing que o valor x, e eu son facelo, chamando unha función chamado paso cubo en x como argumento, e, a continuación, gardar a saída na propia variable, x. Entón, eu estou derrotando o valor de x. Estou substituíndo o valor de x co que o resultado da chamada esta función cubo é. E entón eu só imprimir algunhas material gordo aquí dicindo o que eu fixen. Entón, o que é cubo? Teña en conta o que é fundamentalmente diferente aquí. Eu dei a función un nome como antes. Eu especifiquei un nome para un argumento. Esta vez, el chámase n no canto de nome, pero eu podería chamalo de calquera cousa que quero. Pero isto é diferente. Esa cousa do lado esquerdo. Antes, era o que contrasinal? Rapaces. Agora é obviamente int. Entón o que é, quizais, o sacar? Considerando significa baleiros tipo de nada, e que era o caso. PrintName retornou nada. Fixo algo, pero non me devolver algo que eu podería poñer no á esquerda dun sinal de igual como eu fixen aquí en liña 22. Entón, se eu digo para a liña 30, o que é iso, probablemente, o que implica sobre o cubo fai por min? Si? El retorna un enteiro. Por iso, me pasa cara atrás, para exemplo, un anaco de papel en que se escribiu a resposta. 2 ao cubo, ou 3 ao cubo, ou 4 cubed-- todo o que eu pase en, e como eu aplicar iso? Ben, só n veces n veces n É así que eu podería un cubo de valor. Entón, de novo, super sinxelo idea, pero demostrativa agora como podemos escribir funcións que, en realidade, tiña-nos de volta valores que poidan ser de interese. Vexamos un último exemplo aquí chámase función un. Neste exemplo, comeza para obter máis atractivo. Así, en función dun, esta aviso program-- en última instancia chama unha función chamada GetPositiveInt. GetPositiveInt non é un función na biblioteca CS50, pero decidimos quere que existe. Entón, se desprazar para abaixo ao final do ficheiro, Observe como eu fun sobre a posta en marcha de obter int positivo, e eu dicir que é máis atractivo porque este é un decente Número de liñas de código. Non é só un tolo programiña xoguete. Realmente ten algunha comprobación de erros e facer algo máis útil. Entón, se non viu o paso a paso videos que temos incorporado en pset1, sei que este é un tipo de lazo en C, semellante en espírito para tipo de cousas Raspadinha pode facer. E faga di facelo. Imprimir esta fora. Entón vai adiante e obter n-- obter un int e almacena-lo en n, e continuar facendo iso de novo e de novo e de de novo, sempre que n sexa inferior a un. Así, n será menor que un só se o humano non está cooperando. Se el ou ela está escribindo en 0 ou -1 ou -50, este ciclo continuará execución de novo e de novo. E, finalmente, entender, eu simplemente devolver o valor. Entón, agora temos unha función que sería bo CS50 se aplicaría en CS50.h e CS50.c para ti, pero aquí podemos agora aplicar iso nós mesmos. Pero dous comentarios sobre algúns detalles importantes. Um-- por que eu declarar int n, pensas que, na liña 29 no canto de só facer este aquí, que é máis consistente con o que fixemos a semana pasada? Si? Un bo pensamento. Entón, se fósemos para poñelas aquí, é coma se estivésemos manter declarándose o unha e outra vez. Iso por si só é non problemática, por si só, porque nós só necesitamos o valor dunha vez e, a continuación, imos comezar un novo de calquera maneira. Pero un bo pensamento. Si? Pechar. Entón por que eu teño declarado n en A liña 29, fóra do circuíto, é accesible en todo esta función enteira. Nin as outras funcións porque n aínda está dentro destes crespos tirantes aquí. Assim-- seguro. Exactamente. Entón, iso é aínda máis directo ao punto. Se en vez declarada n aquí na liña 32, é problemático porque palpite onde máis eu ter acceder a ela? Na liña 34, e o simple regra de ouro é que só se pode usar unha variable dentro das últimas claves en que declarou. Desafortunadamente, liña 34 é unha liña moi tarde, porque eu xa pechado a chaveta na liña 33 que corresponde ao chaveta na liña 30. E por iso esta é unha forma de dicir que esta variable int ten como ámbito, por así dicir, a só dentro destas claves. El simplemente non existe fóra deles. Entón, en realidade, se eu fai iso mal, déixeme gardar o código do pois é-- incorrectamente escrito. Deixe-me ir adiante e fan función-1, e erro notice--. Utilización de identificador de n non declarado na liña 35, que está aquí. E se rolar para arriba aínda, outro. Uso de non declarado identificador n na liña 34. Así, o compilador, Clang, é de notar que el só non existe a pesar claramente que está aí visualmente. Así, unha solución simple é declaralo lo alí. Agora déixeme rolar para o inicio do proceso. O que salta á vista como ser un pouco diferente desde cousas que miramos a semana pasada? Non só eu teño nome, non só Eu teño algúns afiada inclúe encima, Eu teño algo que eu son chamando un prototipo. Agora que parece moi semellante ao que acabamos de ver hai pouco na liña 27. Entón, imos inferir a partir dunha diferente mensaxe de erro por que eu fixen iso. Deixe-me ir adiante e eliminar esas liñas alí. E así, non sabemos nada sobre prototipo. Refaça este ficheiro. Fai unha función. E agora, droga, catro erros. Imos percorrer ata o primeiro. Declaración implícita da función obter int positivo é válida no C99. C99 significa só a 1999 versión da linguaxe C, que é o que estamos de feito a usar. Entón o que significa isto? Ben C-- e máis concretamente C compilers-- son programas moi burro. Eles só saben o que ten dixo a eles, e iso é en realidade temática da semana pasada. O problema é que se eu for sobre a aplicación de nome aquí, e eu chamo unha función chamada GetPositiveInt aquí na liña 20, función que tecnicamente non fai existe ata o compilador ve a liña 27. Desafortunadamente, o compilador é facer as cousas top, abaixo, esquerda, dereita, así porque non viu o implantación de GetPositiveInt, pero velo intentando para usalo aquí, é só ir bail-- grite ti con un erro message-- quizais enigmático, e en realidade non compilar o ficheiro. Así, unha chamada prototipo ata aquí é recoñecidamente redundante. Literalmente, eu descendín aquí e eu copiei e pegado isto, e eu poñelas aquí. Baleiro sería máis adecuada, por iso imos literalmente copiar e pegalo esta vez. Eu literalmente copiado e pegado. Realmente, así como como unha migas de pan. Unha pequena pista para o compilador. Eu non sei o que iso fai aínda, pero eu estou prometendo para ti que haberá eventualmente. E é por iso que este linha-- en 16-- liña remata cun punto e coma. É redundante por deseño. Si? Se non vincular a súa biblioteca para o-- Oh, boa pregunta. Afiado inclúe inclusións de ficheiro de cabeceira. Necesita ser-- debe case estar sempre na parte superior do ficheiro a un similar-- para exactamente a mesma razón, si. Porque na norma io.h é, literalmente, unha liña deste xeito, pero coa palabra printf, e con seus argumentos eo seu tipo de retorno. E así facendo afiada inclúen-se aquí, o que está literalmente facendo está copiando e pegando o contido de alguén escribiu enriba. Dese modo cluing seu código ao feito de que as funcións existen. Si? Absolutamente. Así, un moi intelixente e correcta solución sería, xa sabe o que? Eu non sei o que é un prototipo é, pero eu sei se eu entender que C é só mudo e repensa arriba abaixo. Ben, imos dar-lle o que el quere. Imos cortar ese código, pegue-o superior, e agora empurrar principal abaixo. Isto tamén resolvería o problema. Pero pode facilmente chegar a un escenario no que un que chamar B, e quizais B chama de volta a A. Este é algo chamado recursão, e imos volver a iso. E isto pode ou non ser un bo cousa, pero pode definitivamente romper esta solución. E ademais, eu o faría afirman estilisticamente, especialmente cando os seus programas facer este paso e iso por moito tempo, é só super cómodo poñer principal na parte superior porque é a cousa máis programadores van preocuparse. E por iso é un pouco máis limpo, sen dúbida, facelo do xeito Orixinalmente, eu fixen iso mesmo cun prototipo aínda que parece un pouco redundante a primeira vista. Si? Sentímolo, pode falar máis alto? Se cambiar os lugares do implantación eo prototipo? Así que esta é unha boa pregunta. Se volver a declarar ese baixo aquí, imos ver o que acontece. Entón, se eu poñer isto para abaixo aquí, está dicindo. Oh, desculpe. Louder? Aínda máis alto. Ah, boa pregunta. Será que invalida a función? Sábese, despois de todos estes anos, eu nunca poñer un prototipo despois. Entón imos facer facer a función-1 despois de facelo. [Musitando] DAVID J. Malan: Ah, agarde. Aínda temos que poñer todo enriba. Entón, imos facelo aquí enriba, se eu son entender a pregunta correctamente. Estou poñendo todo, ata o prototipo anterior principal, pero eu estou poñendo o prototipo a seguir á aplicación. Entón se eu fai un, eu estou a recibir arredor dun error-- utilizada variable n. Oh, non. Grazas. A ver, imos nos librar diso. Isto é un erro diferente, entón imos ignorar isto. Imos moi rapidamente refacer este. OK, entón o argumento datos non utilizado polo formato de Cordas n-- Oh, iso é porque Mudei a estes aquí. Todo ben, sabemos cal é a resposta vai para-- todo ben, aquí imos nós. Ah, grazas pola positiva. Todo ben, eu vou solucionar este código depois-- ignorar este erro en particular xa que este estava-- funciona é a resposta. Por iso, non substituír o que acaba de facer. Eu sospeito que o compilador está escrito de forma que está ignorando o seu prototipo porque o corpo, por así dicir, da función xa ten foron aplicados máis arriba. Eu tería que realmente consultar a guía do compilador para entender se hai calquera outra implicación, pero a primeira vista só por probar e experimentar, parece haber ningún impacto. Boa pregunta. Entón, imos seguir adiante agora, movendo-se lonxe de efectos secundarios que son funcións que fan algo así como visualmente na pantalla con printf, pero non retorna un valor. E funcións que teñen retorno valores como a que acabamos de ver algúns dos. Xa vimos esta noción de espazo, e imos ver iso de novo e de novo. Pero, por agora, unha vez máis, use a regra de ouro unha variable que só se pode usar dentro dos máis recentemente inaugurado e claves pechadas coma nós vin nese exemplo concreto. E, como dixen, existe unha ability-- podería resolver algúns destes problemas poñendo unha variable global na parte superior de un arquivo. Pero, en case todos os casos teriamos que desaprovam, e de feito nin sequera ir en que a solución para o momento. Entón, por agora, o takeaway é que variables teñen esa noción de escopo. Pero agora imos ollar para outro vía seca de realmente ollar nalgún ben interesante detalles de implementación. Como podemos representar información. E nós xa mirou para este a primeira semana de clase. Mirando para os binarios e lembrando-nos de decimal. Pero lembre de a semana pasada que C ten distintos tipos de datos e acios máis, pero as máis útiles polo de agora se pode estes. Un char, ou carácter, o que pasa sendo un byte, ou oito bits total. E iso quere dicir que o tamaño dun char é só un byte. Un byte ten oito bits, entón isto significa que podemos representar cantos caracteres. Cantas cartas ou símbolos do teclado se temos un byte ou oito bits. Debería de volta a semana cero. Se ten oito bits, cantos valores totais pode representar con patróns de ceros e uns? Um-- máis que iso. Así, 256 total, se comece a contar desde cero. Entón se ten oito bits-- tanto, se nós tivemos nosas lámpadas binarios aquí de novo, podemos transformar esas lámpadas en e fóra en calquera dos 256 patróns únicos. Agora iso é un pouco problemático. Non tanto para inglés e linguas románicas, pero seguro cando introduce, por instancia, idiomas asiáticos, que teñen moito máis símbolos do que como 26 letras do alfabeto. De feito, é posible que sexa necesario máis que un byte. E, por sorte, en últimos anos sociedade outros estándares adoptados que usan máis que un byte por carga. Pero, de momento, en C, o patrón é só un byte ou oito bits. Un enteiro, todo, é de catro bytes, tamén coñecida como 32 bits. O que significa que é o maior posible número que pode representar cun int aparentemente? Con mil millóns. Polo tanto, é de catro millóns máis ou menos. 2 á potencia 32th, se non asumen números negativos e só usar todos positivos números, é de catro millóns máis ou menos posibilidades. Unha flotación, á súa vez, é un tipo do tipo de datos en C. Aínda é un número, pero é un número real. Algo con un punto decimal. E verifícase que C tamén utiliza catro bytes para representar valores de punto flotante. Desafortunadamente cantos flotante valores dos puntos existen no mundo? Cantos números reais existen? Hai un infinito número, e para que o asunto hai un número infinito de números enteiros. Por iso, xa é medio cavando un burato nos aquí. Polas cales ao parecer en computers-- en menos programas escritos en C en eles-- só pode contar ademais catro millóns máis ou menos, e valores de punto flotante só pode, aparentemente, ter algunha cantidade finita de precisión. Só tantos díxitos logo o punto decimal. Porque, por suposto, se só ten 32 bits, Non sei como imos proceder a representando números de reais probablemente con diferentes tipos de patróns. Pero hai certamente unha finita número de tales normas, por iso, tamén aquí, iso é problemático. Agora podemos evitar o problema un pouco. Se non usar un coche alegórico, podería usar un dobre en C, o que lle dá oito bytes, que é o xeito máis estándares posibles de ceros e uns. Pero aínda é finita, o que está a suceder a ser problemático se escribir software para gráficos ou de fantasía fórmulas matemáticas. Entón pode realmente queren contar-se maior que iso. A named-- longo long-- estupidamente tamén é de oito bytes, ou 64 bits, e este é o dobre do tempo como un int, e é por valor enteiro longo. Fact-- Fun un int é de catro bytes, canto tempo é un tempo en C normalmente? Tamén catro bytes, pero un long long é de oito bytes, e iso é por razóns históricas. Pero o takeaway agora É xusto que os datos teñen para ser representado nun Computador-- que é un dispositivo físico con electricidade, adoita conducir estes ceros e ones-- con cantidades finitas de precisión. Entón, cal é o problema, entón? Así, hai un problema de integer overflow. Non só en C, pero en ordenadores en xeral. Por exemplo, se esta é un byte a pena unha bit-- por iso, se este é de oito bit-- todo dos cales son o número un. Que número é este representando se asumirmos é todos os valores positivos en binario? 255, e non é 256, xa que cero é o número máis baixo. Así, 255 é o máis grande un, pero o problema é supoñer que eu quería incrementar esta variable que está a usar oito bits total se eu queira incrementa-lo. Ben así que eu engadir un un para todos estes, quizais poida imaxinar visually-- só como levar a un empregando decimals-- algo vai fluír cara á esquerda. E, de feito, se eu engadir o número un para iso, o que pasa en binario é que reborda de volta a cero. Entón, se só non use-- un int, pero un único byte de conta enteiros dun programa, por default-- logo comeza a 250, 251, 252, 253, 254, 255-- 0 vén despois de 255, o que probablemente non é o que se un usuario vai esperar. Agora, con todo, no mundo de punto flotante, tamén ten un problema semellante. Non tanto co maior number-- aínda que iso aínda é un problema. Pero, co valor de precisión que pode representar. Entón, imos dar un ollo neste exemplo Tamén aquí desde code-- fonte de hoxe flotar-0.c. E teña en conta que é un super programa sinxelo que debe ao parecer imprimir o valor? O que apostar que isto vai imprimir aínda que non haxa un pouco de nova sintaxe aquí? Polo tanto, agardamos que 0,1. Así, o equivalente a unha décima porque eu estou facendo 1 dividido por 10. Estou almacenando a resposta nunha variable chamada f. Esta variable é do tipo float, que é unha palabra clave que acaba de propoñer existiu. Non vimos isto antes, pero esta é unha especie de un xeito pura en printf especifique cantos díxitos ti quero ver despois dun punto decimal. Polo tanto, esta notación significa só que aquí é un espazo reservado. É a un punto flotante valor, e Oh, á mantenta, mostran que co punto decimal con un número despois do punto decimal. Entón ese é o número de algarismos significativos, por así dicir, que pode querer. Entón deixe-me ir adiante e facer facer boia-0, ./float-0, e ao parecer 1 dividido por 10 é de 0,0. Agora, por que é isto? Ben de novo, o ordenador está tomando me literalmente, e escribín un e escribín 10, e dar un palpite que é o tipo de datos asumida por aqueles dous valores? Un int, é tecnicamente algo un pouco diferente. É tipicamente un longo, pero é en definitiva, un valor integral. Non é un valor de punto flotante. Que significa dicir que, se este é un int e este é un int, o problema é que o ordenador non teñen a capacidade incluso para almacenar este punto decimal. Entón, cando fai unha dividida por 10 a usar números enteiros tanto para o numerador eo denominador, a resposta debe ser 0,1. Pero xa que o Computador-- estes son integers-- non sabe o que facer co 0.1. Entón, o que está claro que facer? É só xoga-la fóra, eo que estou a ver, en última instancia é de 0,0 só porque eu insistín que printf me amosar un punto decimal. Pero o problema é que se dividir un número enteiro de un número enteiro, vai get-- por definición C-- dun enteiro. E non vai facer algo agradable e cómodo como arredor del ata o máis próxima dun arriba ou abaixo. Vai truncar todo despois do decimal. Entón, só de forma intuitiva, o que pode ser unha corrección? Cal é a solución máis sinxela aquí? Si? Exactamente. Por que non só trata-los como valores de punto flotante de forma eficaz transformándoos en carrozas ou dobres. E agora, se fago Carrozas-0, ou se eu compilar boias-1, o cal é o mesmo que o o que estaba proposto. E agora fago Carrozas-0, agora eu teño o meu 0.1. Agora iso é incrible. Pero agora eu vou facer algo un pouco diferente. Estou curioso para ver o que é realmente pasando debaixo do capó, e eu estou indo a imprimir esta para 28 casas decimais. Quero moito ver 0.1000-- un infinite-- [Inaudível] 27 ceros despois de que 0,1. Ben, imos ver se isto é o que realmente conseguir. Fai mesmo ficheiro boias-0. ./floats-0. Imos ampliar a resposta dramática. Todo este tempo, ten pensado 1 dividido por 10 é do 10%, é 0.1. Non é. Polo menos, se o ordenador de causa. Agora why-- OK, iso é completa lie 1 10 divídese por 0,1. Pero isto non é why-- o takeaway hoxe. Entón, por que o ordenador pensa, a diferenza de todos na sala, 1 que está dividido en 10 en realidade ese valor tolo? Cal é o equipo que fai parecer? ¿Que é iso? Non é rebordar, per se. Overflow é tipicamente cando vostede participa en torno a un valor. É esa cuestión da imprecisión nun valor de punto flotante onde só ten 32 ou quizais ata 64 bits. Pero se hai un infinito número de números de reais números con puntos decimais e números thereafter-- certamente non pode representar todos eles. Así, o equipo deu nós a correspondencia máis próxima ao valor que pode representar a usar este moitos bits para o valor que realmente quero, que é de 0,1. Desafortunadamente, se comezar a facer contas, ou iniciar inclúen estes tipos de flotante valores de puntuación na programs-- importante software financeiro, militar nada software-- onde a percepción é probablemente moi importante. E comezar a engadir números como este, e comezo executando o software con realmente grandes entradas ou por moitas horas ou lotes de días ou moitos anos, eses pequenos erros pequenos certamente pode aumentar co tempo. Agora, como un aparte, se xa ver Superman 3 ou Office Space e ten que lembrar como estes faces roubaron un monte de cartos co seu ordenador usando os valores de punto flotante e engadindo-se a pouco remanentes, espero que ese filme agora fai máis sentido. Isto é o que eles estaban aludindo nese filme. O feito de que a maioría empresas non ollaría despois dun certo número de cifras decimais, pero estas son fraccións de centavos. Entón comeza a suma-los, comezar a facer unha chea de diñeiro na súa conta bancaria. Entón ese é o espazo de oficinas explicou. Agora, por desgraza, ademais de Office Space, hai son algunhas lexítimas preocupante e impactos significativos destes tipos de decisións de deseño subxacentes, e de feito unha das razóns usan C durante é por iso que realmente ten este terreo a comprensión de como funcionan os ordenadores, como o software funciona, e non tomar nada como garantido. E, de feito, por desgraza, aínda con que comprensión fundamental, nós seres humanos cometen erros. E o que eu penso que eu ía compartir é este video de oito minuto aquí feita a partir dun episodio de Modern Marvels, que é un espectáculo educativo sobre como as cousas funcionan que pinta dúas imaxes de cando un uso indebido e comprensión de valores de punto flotante levou a algunha significativo resultados infelices. Imos dar un ollo. [REPRODUCIÓN] -Nós Agora volver "Enxeñaría Desastres "na Modern Marvels. Ordenadores. Todos nós temos que chegou a aceptar a problemas moitas veces frustrantes que quedou con eles-- erros, virus, e glitches-- software para pequenos prezos para pagar a conveniencia. Pero, en alta tecnoloxía e alta velocidade aplicacións do programa espacial militar e, menor problema pode ser ampliada en desastre. O 4 de xuño de 1996, os científicos preparado para lanzar un foguete Ariane 5 non tripulado. 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 por a Axencia Espacial Europea, e despegou da súa instalación na costa da Güiana Francesa. -At Uns 37 segundos en o voo, eles primeiro notado que algo estaba a suceder de malo. Que os picos foron xiratorio dunha forma que realmente non debería. Preto de 40 segundos de voo, claramente o vehículo estaba con problemas, e é aí que fixeron a decisión de destruílo. O oficial de seguridade da escala, con coraxe tremenda, apertou o botón e explotou o foguete antes de que puidese tornar-se un perigo para a seguridade pública. -Foi A doncela viaxe do Ariane 5, ea súa destrución levou poñer por causa do fallo incorporado no software do foguete. -The Problema na Ariane foi que non foi un número que é necesaria 64 bits para expresar, e querían converterse a un número de 16 bits. Eles asumiron que o número nunca ía ser moi grande. Que a maioría dos díxitos en o número de 64 bits foron ceros. Estaban equivocados. -The Incapacidade dun programa de software para aceptar o tipo de número xerado pola outra está na raíz do fallo. O desenvolvemento de software chegou a ser unha parte moi cara de nova tecnoloxía. O Ariane 4 foguete tiña foi moi exitosa. Así, gran parte do software creado para Tamén foi usado no Ariane 5. -The Problema básico era que o Ariane 5. Foi faster-- acelerou máis rápido, e o software non tiña contabilizado iso. -The 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 tempo había atormentado a tecnoloxía de foguetes moderna. -En 1991, co inicio da primeira Guerra do Golfo, o mísil Patriot experimentou un tipo similar conversión dun problema número. E, como resultado 28 pessoas-- 28 Soldiers-- americanos foron mortos, e preto de cen resultaron feridas. Cando o Patriot, que debería para protexer contra Scuds recibidas, non conseguiu disparar un misil. -Cando Iraq invadiu Kuwait, e en América lanzou Desert Storm a principios 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 medio alcance US superficie-aire do sistema fabricado pola empresa Raytheon. -The Tamaño do Patriot interceptor itself-- é preto de preto de 20 metros de longo, e pesa preto de 2000 libras. E el leva unha ogiva de preto, Creo que é preto de 150 quilos. E a propia ogiva é un alto explosivo, que ten fragmentos en torno a el. Así, o invólucro da ogiva deseñado para actuar como un chumbo groso. -As Mísiles realízanse catro por recipiente, e son transportados por un semi-remolque. -O Sistema Patriot anti-mísil remóntase, polo menos, 20 anos. Foi orixinalmente deseñado como un mísil de defensa aérea para abater avións inimigos. Na primeira Guerra do Golfo cando que a guerra veu, o Exército quería usalo para abater Scuds, e non avións. A Forza Aérea iraquí foi non tanto dun problema, pero o Exército estaba preocupado Scuds. E así intentaron actualizar o Patriot. -Intercepting Un inimigo mísil viaxando a Mach 5 ía ser moi difícil. Pero cando o Patriot foi levado ás présas en servizo, o Exército non tiña coñecemento de unha modificación do Iraq, que fixeron súas scuds case imposible a el. Que pasou é que os Scuds estaban chegando eran inestables. Estaban bambas. A razón para iso foi a Iraqis-- a fin de obter 600 millas para fóra dunha gama missile-- 300 quilómetros levou peso de ogiva fronte, e feitos a ogiva chisqueiro. Polo tanto, agora o Patriot está intentando chegar no Scud, e na maioría das tempo-- a esmagadora maioría do tempo-- sería só voar polo Scud. -Despois Os operadores do sistema Patriot entender que o Patriot errou seu destino, eles detonaron ogiva do Patriot para evitar posibles accidentes se Deixouse caer ao chan. Iso foi o que a maioría da xente viu como grandes bolas de lume no ceo, e entendido como intercepta de oxivas Scud. -aínda Nos ceos nocturnos, Patriots parecía estar a destruír éxito Scuds, en Dhahran podería haber Non se engane sobre o seu funcionamento. Hai sistema de radar do Patriot perdeu o control dun Scud entrada e nunca lanzado debido a un fallo de software. Foron os israelís que descubriron que canto maior sexa o sistema foi ligado, canto maior sexa a discrepancia de tempo se fixo. Debido a un reloxo incorporado no ordenador do sistema. -Acerca Dúas semanas antes a traxedia en Dhahran, os israelís informaron a o Departamento de Defensa que o sistema estaba perdendo tempo. Despois de preto de oito horas corredeiras, eles notaron que facer-se o sistema de visiblemente menos preciso. O Departamento de Defensa respondeu contando 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, de mil horas. Ninguén sabía. -The Batería Patriot estacionada no cuartel en Dhahran e súa falla interna reloxo estaba con máis de 100 horas na noite do 25 de febreiro. -It Monitores tempo cunha precisión de preto dun décimo de segundo. Agora, unha décima de segundo é un número interesante , Por que non pode ser expresada en binario exactamente, o que , Significa que 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 de un terzo. Un terceiro non se pode expresada en decimal exactamente. Un terzo é 0,333 pasa ao infinito. Non hai ningunha forma de facelo con precisión absoluta nun decimal. Ese é o tipo de problema que pasou o Patriot. Canto máis tempo o sistema funcionou, o converteuse en peor erro de tempo. -Despois 100 horas de funcionamento, o erro no tempo foi só preto dun terzo dun segundo. Pero en termos de direcionamento dun mísil viaxando a Mach 5, que resultou nun seguimento de erro de máis de 600 metros. Sería un erro grave para os soldados en Dhahran. Que pasou é o lanzamento dun Scud foi detectada por satélites de alerta temperá, e sabían que un Scud estaba chegando na súa dirección xeral. Eles non sabían de onde viña. Era agora ao radar compoñente do sistema Patriot defender Dhahran para atopar e manter o control do mísil inimigo de entrada. -The Radar era moi intelixente. Sería realmente visite a posición do Scud e, a continuación, prever onde probablemente sería a próxima vez que o radar enviou un pulso para fóra. Isto foi chamado ao portón intervalo. Entón Xa que o Patriot decide ten tempo suficiente pasado para volver e comprobar a próxima 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 había ningún obxecto. Que había unha falsa detección e cae na pista. -The Entrada Scud desaparecido da pantalla do radar, e segundos máis tarde, el chocou contra o cuartel. O Scud matou 28. Foi o último despedido durante a primeira Guerra do Golfo. Traxicamente, o software actualizado chegou na madrugada do día seguinte. O fallo de software tivo foi fixado, o peche un capítulo na conturbada historia do mísil Patriot. [FIN REPRODUCIÓN DE VIDEO] DAVID J. Malan: Isto é todo para CS50. Imos velo na Mércores. [MÚSICA DE XOGO]