[REPRODUCCIÓ DE MÚSICA] DAVID J. Malan: Molt bé. Això és CS50, i això és el començament de la setmana dues. Comencem, doncs, avui amb un error. Un error, per descomptat, és un error en un programa, i obtindrà molt familiaritzats amb aquest concepte si mai has programat abans. pset0 i ara pset1. Però considerarem alguna cosa una mica simple al principi. Aquest programa aquí que jo tirar junts per avançat, i afirmo que això ha d'imprimir 10 estrelles de la pantalla utilitzant printf, però està aparentment Buggy en alguna manera. Atès que especificació que ha d'imprimir 10 estrelles, però no és així, aparentment, el que vostè reclamar és l'error? Sí? Així que és un fora per un error, i què vols dir amb això? Okay. Excel · lent. Així que hem creat un valor inicial de zero per a i, i hem especificat un valor de n de 10, però nosaltres hem fet servir menor o igual a. I la raó que això és de dos personatges i no només un símbol, com en un llibre de matemàtiques, és que no té una forma d'expressar la un equivalent de caràcters. Així que això significa menys d', però si vostè comença a comptar des de zero, però es compta fins al final a través d'e igual a 10, vostè és, per descomptat, va a comptar 11 coses en total. I pel que anem a imprimir 11 estrelles. Llavors, què podria ser una solució per això? Sí? Així que ajustar el menys o igual a només ser menor que, i hi ha, reclam, potser una altra solució, també. Què pot ser que una altra cosa que fer? Sí? Així que comença a igualar a 1, i deixar el menor que o igual a. I, francament, m'agradaria reclamar que, per a un humà típic, Això és probablement més senzill. Comença a comptar a 1 i comptar fins a 10. Bàsicament fa el que vol dir. Però la realitat és en programació, com hem vist, els informàtics i programadors generalment no començar a comptar des de zero. I així està bé una vegada t'acostumes a ell. El seu estat de salut general una mena menys. Així que simplement una lògica error que podríem ara fixar i finalment tornar a compilar això i aconseguir tot just 10. Bé què tal aquest error aquí? Aquí, una altra vegada, reclamar que tinc un objectiu d'imprimir 10 stars-- un per línia aquesta vegada, però no és així. Abans que ens proposem ho la solució és, el que fa aquest imprimeixo visualment si jo fos a compilar i executar aquest programa què et sembla? Sí? Estrella. Així que totes les estrelles al mateixa línia és el que he sentit, i després el caràcter de nova línia. Així que anem a tractar d'això. Així fan amb errors-1, entrar, i veig la comanda Clang que parlem l'última vegada. ./buggy-1, i de fet veig totes les 10 estrelles en la mateixa línia tot i que jo reclam En la meva especificació només un comentari al cim el codi que tenia la intenció de fer una per línia. Però això es veu bé. Ara la línia 15 es veu com si estigués la impressió d'una estrella, i després la línia 16 sembla com si jo fos la impressió un caràcter de nova línia, i els dos estan tan sagnia Jo estic dins del bucle clarament. Així que no hauria d'estar fent l'estrella, nova línia, estrella, nova línia, estrella, nova línia? Sí? Sí, a diferència d'un llenguatge com Python, si vostè està familiaritzat, indentació no importa a l'equip. L'únic que importa a la humana. Així les línies mentre que aquí m'he inventat 15 i 16-- que es veu bonica, però l'ordinador no li importa. L'equip es preocupa per realment tenir claus al voltant d'aquestes línies de codi. Així que és clear-- igual que en Scratch-- que aquestes dues línies de codi ha de ser executat. Com un dels trencaclosques groc de Scratch peces una i altra vegada i una altra. Així que ara si puc tornar a executar aquest program-- ./buggy-2-- Hm. Tinc un error ara. El que em vaig oblidar de fer? Sí, així que no em compilar. Així que amb errors-2. No existeix el fitxer perquè no ho vaig fer realment compilar la segona versió. Així que ara interessant no declarat no variable-- 2. Estem fent 1. Fer ./buggy-1-- buggy 1-- i ara cada un d'ells està en la mateixa línia. Ara hi ha una excepció a aquesta suposada afirmació meva que necessiteu aquestes claus. Quan és en realitat AUTORIZACIÓN-- si has notat en la secció o textbooks-- ometre les claus? Sí? Exactament. Quan només hi ha una línia de codi que volen ser associats amb el bucle com en el nostre primer exemple. És perfectament legítim ometre les claus només com una espècie de conveniència del compilador per a vostè. Sí? Bona pregunta. Es consideraria un error d'estil? Ens promote-- com en CS50 guia d'estil, l'URL per al qual està en pset1-- que sempre utilitzar les claus. Certament, si sou nou en la programació. La realitat és que no som va a prohibir que de fer aquestes comoditats. Però si vostè és només el en el ritme de les coses, absolutament sol utilitzeu sempre l'arrissat suports fins que arribi la caiguda d'ella. Bona pregunta. Bé. Així que llavors era un error. Almenys en una cosa bastant simple. I no obstant això, vostè podria pensar que això és bastant rudimentària, oi? Aquesta és una espècie de la primera setmana de veure el llenguatge com, veure els seus errors en el mateix. Però la realitat aquests són realment representativa d'alguns problemes bastant aterridores que poden sorgir en el món real. Així que alguns de vostès poden recordar si vostè segueix de notícies de tecnologia, o potser fins i tot atrapats vent de l'est al febrer d'aquest últim any que Apple tenia comès un petit error en ambdues iOS, el sistema operatiu en seus telèfons, i també Mac OS, el sistema operatiu en els seus ordinadors d'escriptori i portàtils. I vas veure titulars com aquest. I a partir de llavors, Apple promès corregir aquest error, i molt ràpidament va fer fixar en iOS, però en última instància, fixa en Mac OS també. Ara cap d'aquests titulars sola realitat revelar el que era el problema de fons, però l'error es redueix en última instància a una errada en SSL, Secure Sockets Layer. I conte llarg, aquest és el programari que els nostres navegadors i altres programari utilitzat per fer què? Si digués que SSL és involucrats, cada vegada que visiti un URL que comenci amb HTTPS, el que llavors podria estar relacionat amb SSL? Xifrat. Així que anem a parlar de això en els pròxims dies. Xifrat, l'art de la aleatorització informació. Però conte llarg, Apple Fa algun temps havia comès un error en la implementació de SSL, l' programari que implementa en última instància URL com HTTPS o màxim connexions allà també. El resultat de tot això és que el seu connexions podria potencialment ser interceptat. I les seves connexions eren no necessàriament xifrat si has tingut algun tipus dolent en el medi vostè i el lloc web de destinació que sabia com prendre avantatge d'això. Ara Apple finalment va publicar una solució per a aquest últim, i la descripció de la seva arranjament era això. Transport segur no per validar l'autenticitat de la connexió. El tema va ser abordat per restauració que falten etapes de validació. Així que aquesta és una explicació molt ondulat mà per simplement dir que vam ficar la pota. Hi ha, literalment, un línia de codi que va ser amb errors en la implementació de SSL, i si vostè va en línia i la recerca d'aquest vostè pot trobar realment el codi font original. Per exemple, aquesta és una captura de pantalla només una part d'un arxiu bastant gran, però aquesta és una funció aparentment anomenat SSL verificar intercanvi de claus del servidor de subscripció. I es necessita un munt de arguments i insumos. I no ens centrarem massa en els petits detalls que hi ha, però si vostè es centra en el codi dins d'aquest superior function-- anem zoom sobre això. És possible que ja sospitar el que l'error podria encara si no tens ni idea en última instància, el que estem veient. Hi ha una espècie d'anomalia aquí, que és el que? Sí, no m'agrada la mirada de dos Goto falla. Francament, no sé ben bé què Goto FALLADA significa, però tenir dos d'ells esquena amb esquena. Això com que em frega intel·lectualment pel camí equivocat, i, de fet, si ens acostem a només aquestes línies, és a dir C. Així que una gran quantitat de codi d'Apple està al seu torn està escrit en C, i això pel que sembla és realment equivalent-- no que prou indentació versió, però si reconeix el fet que no hi ha claus, el que Apple realment va escriure era el codi que veu com aquest. Així que he has allunyat i jo fixa la indentació en el sentit que si no hi claus, que segon Goto fallen és en groc es va a executar independentment del. No està associat amb la condició if per sobre d'ella. Així que fins i tot més, si no prou entendre el que això podria possiblement estar fent, saber que cada un d'aquests conditions-- cadascuna d'aquestes línies és un pas molt important en el procés de comprovar si les seves dades són en realitat xifrada. Així saltar un d'ells passos, no és la millor idea. Però perquè tenim aquesta Anar a segona falla en groc, i perquè una vegada que tipus de estèticament moure a l'esquerra on es lògicament és en aquest moment, el que Què significa això per a la línia de codi de sota que Goto segon falles pensaria vostè? Sempre serà omès. Així gotos estan generalment mal vist per raons que no entrarem a realment, i de fet en CS50 no tendim per ensenyar aquesta Goto declaració, però es pot pensar en Goto fallar en el sentit d'anar salt a alguna altra part del codi. En altres paraules saltar per sobre aquesta última línia per complet, i així el resultat d'aquesta estúpida simple error que s'acaba resultat d'algú probablement copiar i enganxar un també moltes vegades era que tot el la seguretat de iOS i Mac OS era vulnerable a la intercepció per mals des de fa força temps. Fins que Apple finalment fixa això. Ara bé, si alguns de vostès són en realitat corrent versions antigues de iOS o Mac OS, vostè pot anar a gotofail.com que és un lloc web que algú va crear per determinar essencialment mitjançant programació si l'equip segueix sent vulnerable. I, francament, si ho és, és probablement una bona idea per actualitzar el telèfon o el teu Mac en aquest moment. Però allà, just testimoni de com una apreciació d'aquestes nivell inferior detalls i bastant idees simples pot realment traduir-se en decisions i els problemes que affected-- en aquest cas-- milions de persones. Ara una paraula sobre l'administració. Secció començarà diumenge que ve. Vostè rebrà un correu electrònic pel cap de setmana de la secció, i en aquest moment el procés de resecció s'iniciarà si no tens es va adonar que ara tenen alguns dels nous conflictes. Així que això succeeix tots els anys, i ens s'acomoda en els dies per venir. Oficina hores-- fan mantenir un ull en aquesta programació aquí. Canvia una mica aquesta setmana, en particular el temps d'inici i la ubicació, així que consulti amb que abans de dirigir-se a les hores d'oficina qualsevol de les quatre nits. I ara unes paraules sobre l'avaluació, especialment pel que et submergeixis en un problema estableix un i més enllà. Així per l'especificació, aquests són en general els eixos al llarg de la qual avaluem la seva feina. L'abast es refereix al que mesura les seves implements de codi les característiques necessàries per la nostra especificació. En altres paraules, la quantitat de un conjunt peça va fer mossegar fora. Vas fer un terç d'ella, un mitjà d'això, el 100% de la mateixa. Encara que no és correcta, la quantitat que va aconseguir? Així que captura el nivell d'esforç i de la quantitat a la qual poc allunyat de la els problemes del conjunt de problemes. Correctness-- aquest, a En quina mesura, és el seu codi coherent amb la nostra especificacions i lliure d'errors. Així funciona correctament? Si li donem una mica d'entrada, ho fa ens donen el resultat que esperem? Design-- ara aquesta és la primera de particularment els qualitatius, o els que requereixen el judici humà. I, de fet, és per això que comptem amb un personal de tants companys d'ensenyament i curs ajudants. ¿Fins a quin punt és la seva codi ben escrit? I de nou es tracta d'una molt avaluació qualitativa que treballarà amb vostè en bidireccionalment en les setmanes per venir. Així que quan vostè no rep només en els resultats numèrics, sinó també unes partitures escrites, o retroalimentació mecanografiat, o comentaris per escrit en les paraules en anglès. Això és el que utilitzarem per conduir que cap realment escriure un millor codi. I a la conferència ia la secció, tractarem assenyalar sortir-- tan sovint com ens puedes-- el que fa que un programa no només correcta i funcionalment bo, sinó també ben dissenyat. El més eficient que podria ser, o fins i tot la més bella que pot ser. El que ens porta a l'estil. Estil en última instància és un judici estètic. ¿Vas triar bé noms per a les variables? Et sangria seu codi correctament? Es veu bé, i per tant, és fàcil per a un altre ésser humà llegir la seva respectiva de la seva correcció. Ara en general pel pla d'estudis, anotem aquestes coses en una escala de cinc punts. I permetin-me recalcar el punt quals tres és de fet bé. Molt ràpidament fer amics començar a fer aritmètica. Quan arriben a tres de cada cinc a la correcció d'algun conjunt de processadors i pensen maleïda, em va a 60% que és essencialment un D o E. Aquesta no és la forma en què pensar en aquests números. A tres és en veritat bo, i el que en general, es pot esperar en el començament del terme és que si vostè està rebent un munt de three's-- potser un parell de fires, un parell de fours-- o un parell de dos en dos, un parell de fours-- això és un bon lloc per començar. I mentre veiem un trajectòria ascendent en el temps, vostè està en un bon lloc. La fórmula que utilitzem per coses de pes és essencialment això pel pla d'estudis, que simplement vol dir que tenim donar més pes a la correcció. Com que és molt sovint la correcció que porta la major part del temps. Confia en mi ara. Vostè encontrar-- almenys en una pset-- que passar el 90% del seu temps treballant en 10% del problema. I tot tipus d'obres a excepció d'un o dos errors, i aquests són els errors que mantenir despert fins tard a la nit. Aquests són els que sort d'escapar. Però després de dormir-hi, o assistir a les hores d'oficina o fer preguntes en línia, es quan s'arriba a aquest objectiu 100%, i és per això que el pes correcció més. Dissenyar una mica menys, i estil una mica menys que això. Però cal tenir en estil mente-- és potser la més fàcil d'aquests a mossegar segons la guia d'estil. I ara, una més greu observar en l'honestedat acadèmica. CS50 té la trista distinció de sent el major productor de la Junta Ad casos gairebé tots els anys històricament. Això no es deu a que els estudiants fan trampa en CS50 més que qualsevol altra classe, però a causa de la naturalesa de l'obra, el fet que és electrònic, el fet que el busquem, i el fet que som els informàtics, Puc dir que estem per desgràcia molt bo en el detecti. Així que què significa això en termes reals? Així que, pel pla d'estudis, la filosofia del curs realment no es redueixen a ser raonable. Hi ha aquesta línia entre fent el treball d'un pel seu compte i aconseguir una mica de ajuda raonable d'un amic, i de plànol fer aquest treball per al seu amic, o enviant-li el seu codi de manera que ell o ella pot simplement prendre o demanar prestat a la dreta. I que creua la línia que dibuixen a la classe. Vegi, el pla d'estudis en última instància, per a les línies que dibuixem com raonable i el comportament irracional, però el que realment fa bullir baix a l'essència del seu treball que necessiten ser el teu propi al final. Ara, amb això dit, hi ha una heurística. Perquè com vostè podria imagine-- de les hores d'oficina i els efectes visuals i els vídeos que hem mostra CS50 així far-- és de fet la intenció de ser el més col · laborativa i com a cooperativa i com socials com sigui possible. Com col · laboratiu com és rigorós. Però amb això, va dir, l'heurística, com es veurà en el programa d'estudis, és que quan vostè està tenint algun problema. Vostè té alguns errors en el codi que no pot resoldre, és raonable per a vostè per mostrar el seu codi a una altra persona. Un amic fins a la classe, un amic assegut al teu costat en hores d'oficina, o un membre del personal. Però ells no poden mostrar el seu codi per a vostè. En altres paraules, una respondre a la seva pregunta-- Necessito ajuda-- no oh, aquí està el meu codi. Fes una ullada a això i deduir-ne el que vulguis. Bé, és clar, no hi ha una manera clara al joc aquest sistema pel que et vaig a mostrar el meu codi abans de tenir una pregunta. Vostè em mostra la meva seu codi abans de sotmetre a una pregunta. Però veure el programa de nou per al detalls més fins de on aquesta línia és. Només per pintar ara la imatge i compartir el més transparent possible on som en els darrers anys, aquest és el nombre de casos de la Junta Ad CS50 que ha tingut més els últims set anys. Amb 14 casos aquest últim tardor. Pel que fa als estudiants involucrats, era 20 alguns estudiants imparells a la tardor passat. Hi va haver un màxim de 33 estudiants fa alguns anys. Molts dels quals són per desgràcia ja no és aquí al campus. Els estudiants que participen com a percentatge de la classe ha oscil · lat històricament entre el 0% al 5,3%, que és només per dir això és cada any un repte. I cap a aquest fi, el que volem fer és transmetre una que dd-- només FYI-- comparar l' un ésser justos amb aquells estudiants que seguint la línia en conseqüència. Fem comparar tots els actuals presentacions en contra de totes les missions anteriors des del passat molts anys. Sabem també com Google voltant i trobar repositoris de codi , Fòrums de discussió en línia , Llocs de treball en línia en línia. Si un estudiant es troba, podem sens dubte trobarà tot el que lamentablement fem. Així que el que vostè veurà en el pla d'estudis encara que és aquesta clàusula tot. Jo sap apreciar, i tots ens ha personal d'haver fet el curs com això, o aquesta en si mateix un amb el temps, sens dubte saben el que se sent quan la vida s'interposa en el camí quan es té alguna nit tarda deadline-- no només en aquesta classe, però altre-- quan estàs completament esgotat, estressat, tenir un nombre excessiu d'altres coses a fer. Va a fer que en algun moment de la vida sense dubte un mal, potser tard decisió nit. Així que pel pla d'estudis, hi ha aquesta clàusula, de manera que si dins de les 72 hores de fer alguna mala decisió, vostè és propietari fins que i arribar a mi i un dels caps del curs i tindrem una conversa. Nosaltres ens encarregarem de les coses internament amb l'esperança que es converteixi en més d'un moment d'ensenyament o lliçó de vida, i no alguna cosa amb ramificacions particularment dràstiques com es pot veure en aquests gràfics aquí. Així que això és un to molt seriós. Fem una pausa per a uns pocs segons per trencar la tensió. [REPRODUCCIÓ DE MÚSICA] DAVID J. Malan: Molt bé, així que com és que per a un segue? Per als temes principals de l'actualitat. La primera de les quals és l'abstracció. Un altre dels que serà la representació de les dades, que francament és una manera molt sec de dir com podem anar sobre la solució de problemes i el pensament sobre la resolució de problemes? Així que has vist en Scratch, i vostè té vist potser ja en pset1 amb C que no només es pot utilitzar funcions, com printf, que altres persones en any passat va escriure per a tu. També podeu escriure les seves pròpies funcions. I encara que potser no tingui fet això en C, i francament en pset1 vostè realment no necessita per escriure el seu pròpia funció perquè el problema-- encara que tal vegada d'enormes proporcions en primer glance-- veuràs en última instància, pot ser resolt amb no tots els que moltes línies de codi. Però dit això, en termes d'escriure la seva pròpia funció, adonar-se que C dóna que aquesta capacitat. Jo vaig a anar en el codi font actual, que ja està disponible en línia, i jo vaig a seguir endavant i obert un programa que es diu funció 0.C, i en funció de zero anem a veure algunes coses. En les primeres línies 18 a través de 23 és la meva funció principal. I ara que estem començant a llegir codi que no estem escrivint sobre la marxa, sinó que he escrit amb antelació o que en un conjunt de problemes podria rebre amb ha escrit amb antelació. Una bona manera de començar lectura de codi d'una altra persona és buscar la funció principal. Esbrinar on aquesta entrada punt és d'executar el programa, i després seguir lògicament a partir d'aquí. Pel que aquest programa aparentment impressions el seu nom seguit de dos punts. A continuació, utilitzem GetString de la biblioteca CS50 per obtenir una cadena, o una paraula o frase des de l'usuari en el teclat. I després hi ha aquest El printNombre aquí--. Ara no és un printNombre funció que ve amb C. No està en io.h. estàndard No està en CS50.h. És més bé en el mateix arxiu. Avís si em desplaço cap avall unes línies bit-- 25 a 27-- és només una manera bonica de comentar el seu codi mitjançant les estrelles i les barres. Aquesta és una de diverses línies comentari, i això és només la meva descripció en blau de el que fa aquesta funció. A causa de que en les línies 28 a 31, He escrit una funció super simple el nom és printNombre. Es necessita quants arguments li diries? Així que un argument-- perquè hi ha una argument que apareix dins dels parèntesis. El tipus de la qual és String. Què vol dir printNombre és com aquesta caixa de negre o funció que pren com a entrada una cadena. I el nom d'aquesta cadena convenientment estarà Nom. No S, no N, però el seu nom. Així que, què fa printNombre? És agradable simple. De la mateixa manera que una línia de codi per el printf, però pel que sembla imprimeix "Hola," fulano de tal. Quan el tal i tal ve de l'argument. Ara bé, això no és una gran innovació aquí. Realment, m'he pres un programa que pogués haver estat escrita amb una línia de codi posant això aquí, i ho va canviar a alguna cosa que involucra a uns sis o set anys més o menys línies de codi tot el camí fins aquí. Però és la pràctica d'una principi conegut com a abstracció. Tipus d'encapsular dins d'un nou funció que té un nom, i millor però aquest nom literalment diu el que fa. Vull dir printf-- això no és particularment descriptiva. Si vull crear un peça del trencaclosques, o si que vulgueu crear una funció que imprimeix el nom d'algú, la bellesa de fer això és que el que pugui realment que la funció de donar un nom que descriu el que fa. Ara que necessita en una entrada que He trucat arbitràriament nom, però això també és meravellosament descriptiu en lloc de ser una mica més genèric com S. I buit, per ara, només significa que aquesta funció no em tornar res. No és com que GetString literalment em lliura volta una cadena com ho vam fer amb els trossos de paper amb els seus companys de classe la setmana passada, sinó més aviat que només té un efecte secundari. S'imprimeix alguna cosa a la pantalla. Així que al final del dia, si jo no fer la funció-0, ./function-0, veurem que demana el meu nom. Escric David, i els tipus al meu nom. Si ho faig de nou amb Rob, que dirà "Hola, Rob." Així que una idea simple, però potser extrapolar d'aquesta mentalment que a mesura que els seus programes obtenen una mica més complicat, i desitja escriure un tros de codi i trucades que code-- invoke que code-- per alguns descriptiva nomenar com printNombre, C si ens permetre aquesta capacitat. Hi ha un altre exemple simple. Per exemple, si obro una presentar de trucada avui return.c, compte del que he fet aquí. La major part d'aquesta funció principal és printf. La primera vegada que inicialitzar arbitràriament 1 variable anomenada x al número 2. Després imprimeixo "x és ara % I "passar en el valor de x. Així que només estic dient el que és. Ara estic sol amb audàcia afirmant amb printf. Estic cubicació aquest valor x, i estic fer-ho trucant a una funció anomenat pas del cub en x com a argument, i després guardar la sortida en la pròpia variable, x. Així que estic colpejant fortament el valor de x. Estic anul · lant la valor de x amb el el resultat de cridar aquesta funció és cub. I després em imprimeixo alguns material esponjós aquí dient el que vaig fer. Llavors, què és, llavors, el cub? Noti el que és fonamentalment diferent aquí. He donat la funció un nom com abans. He especificat un nom per a una discussió. Aquesta vegada es diu n en lloc del nom, però jo podria dir-el que vulgui. Però això és diferent. Aquesta cosa de l'esquerra. Anteriorment, era el que la paraula clau? Nois. Ara és òbviament int. Llavors, què tal la treu? Mentre que significa void mena de res, i aquest era el cas. PrintNombre res va tornar. Es va fer alguna cosa, però no em tornaran cosa que podria posar en el banda esquerra d'un signe igual com ho he fet aquí a la línia 22. Així que si dic que a la línia 30, Què és això, probablement, el que implica sobre el que el cub té per a mi? Sí? Es retorna un enter. Així que em dóna l'esquena, per exemple, un tros de paper sobre el qual ha escrit la resposta. 2 cubs, o 3 glaçons, o 4 cubed-- vaig passar, i com puc implementar això? Bé, acaba de n vegades n vegades n és com pot ser que cubicar un valor. Així que de nou, super simple idea, però demostratiu ara com podem escriure funcions que en realitat ens va fer tornar valors que puguin ser del seu interès. Vegem un últim exemple aquí es diu funció d'un. En aquest exemple, s'inicia per obtenir més convincent. Així, en funció d'un, aquesta avís program-- última instància crida a una funció anomenada GetPositiveInt. GetPositiveInt no és un funció a la biblioteca CS50, però vam decidir que li agradaria que existeixi. Així que si ens desplacem cap avall més endavant a l'arxiu, Noto com em vaig anar sobre la implementació aconseguir int positiu, i jo diuen que és més convincent perquè aquest és un decent nombre de línies de codi. No és només un ximple programet joguina. En realitat té una mica de comprovació d'errors i fer alguna cosa més útil. Així que si no has vist el tutorial vídeos que hem incrustat en pset1, sap que aquest és un tipus de bucle en C, similar en esperit per al tipus de coses de Scratch pot fer. I diu fer-ho. Imprimiu això. Després seguir endavant i obtenir N-- aconseguir un int i emmagatzemar-lo en n, i seguir fent això una i altra vegada i de nou, sempre i quan n és menor que un. Així que n serà inferior a un només si l'humà no està cooperant. Si ell o ella està escrivint en 0 o -1 o -50, aquest bucle es mantindrà l'execució d'una i altra vegada. I en última instància, noto, em retorni el valor. Així que ara tenim una funció això hagués estat agradable si CS50 s'implementaria en CS50.h i CS50.c per a vostè, però aquí podem ara implementar això nosaltres mateixos. No obstant això, dues observacions sobre alguns detalls clau. Un-- per què em declaro int n, creu que, en la línia 29 en comptes de fer això aquí, que és més consistent amb el que vam fer la setmana passada? Sí? Un bon pensament. Així que si haguéssim de posar aquí, és com si ens mantenir a declarar una i altra vegada. Això en si mateix és no és problemàtica, per se, perquè només tenim el valor d'una vegada i després aconseguirem un de nou de totes maneres. Però un bon pensament. Sí? Tanca. Així que ja he declarat en n línia 29 fora del bucle, accessible en tot tota aquesta funció. Altres no funciona perquè n és encara dins d'aquests arrissat suports aquí. Tan-- segur. Exactament. Així que això és encara més al punt. Si en lloc declarem n dret aquí a la línia 32, és problemàtic perquè conjectura on més que necessito per accedir-hi? En la línia 34, i la senzilla regla d'or és que només es pot utilitzar una variable dins dels més recents claus en què es va declarar. Desafortunadament, la línia 34 és una línia massa tard, perquè jo ja he tancat la clau de tancament en la línia 33 que correspon a la claudàtor en la línia 30. I que aquesta és una manera de dir que aquesta variable int té com abast, per dir-ho, a dins d'aquestes claus. Simplement no existeix fora d'ells. Així que de fet, si faig això malament, em deixa guardar el codi ja que és-- incorrectament escrita. Deixin-me seguir endavant i fer-ho fer funció-1, i l'error notice--. L'ús d'identificador no declarat n en la línia 35, que està just aquí. I si ens desplacem fins a A més, un altre. L'ús de no declarats identificador n en la línia 34. Així el compilador, Clang, és de notar que només no hi ha tot i que clarament que hi és visualment. Així que una solució simple està declarant allà. Ara vaig a desplaçar-me a la part superior de l'arxiu. El que salta a la vista com ser una mica diferent de les coses que ens espera a la setmana passada? No només no tinc nom, no només les fan Tinc alguns aguts inclou sobre de la tapa, Tinc alguna cosa que em trucar a un prototip. Ara que sembla terriblement similar al que que acabem de veure fa un moment a la línia 27. Així que anem a deduir a partir d'una diferent missatge d'error pel que he fet això. Déjame anar per davant i eliminar aquestes línies existeixen. I així, no sabem res de prototip. Remake aquest fitxer. Fer una funció. I ara, maleïda sigui, quatre errors. Anem a desplaçar-se fins la primera. Declaració implícita de la funció aconseguir int positiu és vàlid en C99. C99 només significa el 1999 versió del llenguatge C, que és el que estem fent servir de fet. Així que què vol dir això? Bé C-- i més concretament C compilers-- són programes bastant ximples. Només saben el que has els va dir, i això és realitat temàtica de la setmana passada. El problema és que si em vaig sobre la implementació de nom aquí, i que jo anomeno una funció anomenada GetPositiveInt aquí a la línia 20, que la funció fa tècnicament no existint fins que el compilador veu la línia 27. Desafortunadament, el compilador és fer les coses amunt, avall, esquerra, dreta, perquè no ha vist la aplicació de GetPositiveInt, però veu que tractar per usar-lo aquí, que només va a bail-- cridés que amb un error potser mensaje-- críptic, i en realitat no compilar l'arxiu. Així que una trucada prototip fins aquí és certament redundant. Literalment, em vaig baixar aquí i he copiat i enganxat això, i ho poso aquí. Buit seria més adequat, així que anem a literalment, copieu i enganxeu aquest cop. Jo, literalment, vaig copiar i vaig enganxar. Realment només com com una molla de pa. Una petita pista per al compilador. No sé el que això fa encara, però estic prometent que que va a existir eventualment. I és per això que aquest line-- a línia 16-- acaba amb un punt i coma. És redundant per disseny. Sí? Si no vincula la seva biblioteca a ell-- oh, bona pregunta. De Sharp inclou inclusions d'arxius de capçalera. Necessitat de ser-- ha gairebé sempre a la part superior l'arxiu per a un similar-- per exactament la mateixa raó, si. A causa que en la norma io.h és literalment una línia com això, però amb la paraula printf, i amb els seus arguments i el seu tipus de retorn. I així, fent aguda inclouen fins aquí, el que estàs fent, literalment, està copiant i enganxant el contingut d'una altra persona va escriure sobre de la tapa. D'aquesta manera cluing seu codi en la fet que existeixen aquestes funcions. Sí? Absolutament. Així que un molt intel · ligent i correcta solució seria, ¿saps què? No sé el que és un prototip és, però sé si entenc que C és només mut i replanteja dalt a baix. Bé anem a donar-li el que vol. Anem a tallar aquest codi, enganxa'l dalt part superior, i després prem principal baix. Això també resoldria el problema. Però pot molt fàcilment arribar a un escenari en el qual la necessitat de cridar a B, i potser B flama de nou a A. Aquest és una cosa que es diu recursivitat, i tornarem a això. I pot o no pot ser un bon cosa, però definitivament es pot trencar aquesta solució. I a més, ho faria reclamar estilísticament, especialment quan els seus programes convertit en aquest llarg i aquest llarg, és simplement molt pràctic posar principal a la part superior perquè és la cosa més programadors van a preocupar. I el que és una mica més net, es podria dir que, per fer-ho de la manera Originalment vaig fer amb un prototip fins i tot encara que es veu una mica redundant a primera vista. Sí? Ho sentim, es pot dir que més fort? Si canvia la ubicació de la l'execució i el prototip? Així que aquesta és una bona pregunta. Si torna a declarar aquesta avall aquí, anem a veure què passa. Així que si jo atribueixo aquí, que estàs dient. Oh, ho sento. Louder? Fins i tot més fort. Ah, bona pregunta. Seria invalidar la funció? Ja saps, després de tots aquests anys, em mai han posat un prototip després. Així que farem que la funció-1 després de fer això. [Murmurant] DAVID J. Malan: Oh, espera. Encara hem de posar tot a sobre de la tapa. Així que farem això aquí, si estic entendre bé la seva pregunta. Estic posant tot, incloent el prototip anteriorment principal, però m'estic posant el prototip per sota de la implementació. Així que si faig un, m'estic posant tornar una error-- sense usar variable n. Oh, no. Gràcies. Anem a veure, ens desfem d'aquest. Això és un error diferent, així que anem a ignorar això. Anem realment refer ràpidament això. OK, així que no argument de dades utilitzat pel format de cadena N-- oh, això és perquè Vaig canviar a aquests aquí. Molt bé, sabem quina és la resposta va A-- bé, aquí anem. Ah, gràcies pel positiu. Molt bé, vaig a arreglar aquest codi després de-- ignorar aquest error en particular ja que aquest fue-- funciona és la resposta. Així que no sobreescriu el que acabes de fer. Sospito que el compilador està escrit de tal manera que fa cas omís del seu prototip perquè el cos, per dir-ho, de la funció ja té han aplicat més amunt. Hauria de consultar realitat el manual del compilador per entendre si hi ha algun altre implicació, però a primera vista simplement per experimentar, provar, no sembla haver cap impacte. Bona pregunta. Així que seguirem endavant ara, movent-se lluny dels efectes secundaris que són funcions que fan una mena visualment a la pantalla amb printf, però no retornen un valor. I les funcions que tenen retorn valors com la que acabem de veure algunes de. Ja vam veure aquesta noció d'abast, i anem a veure una i altra vegada. Però, per ara, de nou, utilitzar la regla d'or que una variable només es pot utilitzar dins de la més recent inauguració i claus tancades com ens va veure en aquest exemple particular. I com vostè ha assenyalat, hi ha una ability-- que podria resoldre alguns d'aquests problemes posant una variable a nivell mundial a la part superior d'un arxiu. No obstant això, en gairebé tots els casos ens arrufar el nas a què, i de fet no fins i tot anar que la solució per ara. Així que per ara, el menjar per emportar és que variables tenen aquesta noció d'abast. Però ara anem a veure una altra via seca de realitat busca en alguns força interessant detalls d'implementació. Com podríem representar la informació. I ja trobem aquesta en la primera setmana de la classe. Pel que fa als binaris, i recordant a nosaltres mateixos decimal. Però recordar des de la setmana passada que C té diferents tipus de dades i raïms més, però els més útils per ara podria ser aquests. Un char, o caràcter, el que passa ser un byte, o de vuit bits en total. I això vol dir que la mida d'un char és un sol byte. Un byte és de vuit bits, de manera que això significa que podem representar el nombre de caràcters. Quantes lletres o símbols del teclat si tenim un byte o vuit bits. Penseu de nou a la setmana zero. Si vostè té vuit bits, quants valors totals pot representar amb patrons de zeros i uns? Un-- més que això. Així que 256 totals si començar a comptar des de zero. Així que si tens 08:00 bits-- així que si ens tingut les nostres llums binaris fins aquí de nou, podríem convertir aquestes bombetes en i fora en qualsevol de 256 patrons únics. Ara bé, això és una mica problemàtic. No tant per Anglès i llengües romanços, però sens dubte quan s'introdueix, per exemple, les llengües asiàtiques, que tenen molt més símbols que com 26 lletres de l'alfabet. En realitat podríem necessitar més d'un byte. I per sort en els últims anys té la societat adoptat altres normes que utilitzen més d'un byte per cada càrrega. Però, per ara, en C, el valor per defecte és només un byte o vuit bits. Un sencer, per la seva banda, és de quatre bytes, també coneguda com 32 bits. El que significa que el que és el més gran possible nombre es pot representar amb un int pel que sembla? Amb un bilió. Així que és de quatre mil milions més o menys. 2 a la potència 32a, si ens assumir sense números negatius i només ha d'utilitzar tots positius els números, que és de quatre mil milions més o menys possibilitats. Un flotador, per la seva banda, és un tipus diferent de tipus de dades en C. És encara un nombre, però és un nombre real. Una cosa amb un punt decimal. I resulta que C també utilitza quatre bytes per representar els valors de coma flotant. Desafortunadament quants flotant valors dels punts hi ha al món? Quants nombres reals hi ha? Hi ha un infinit nombre, i per al cas hi ha un nombre infinit de nombres enters. Així que ja estem tipus de excavar un forat de nosaltres mateixos aquí. Per la qual cosa pel que sembla en computers-- a menys els programes escrits en C a ells-- només pot comptar tan alt com 4000000000 més o menys, i valors de punt flotant només pot semblar tenir certa quantitat finita de precisió. Només els tants dígits després seu punt decimal. Perquè, és clar, si només té 32 bits, No sé com anirem sobre representant numbers-- reals probablement amb diferents tipus de patrons. Però hi ha sens dubte, un finit nombre d'aquests patrons, així que aquí, també, això és problemàtic. Ara podem evitar el problema lleugerament. Si no utilitza un flotador, podria utilitzar un doble en C, que li dóna 8 bytes, que és la forma més patrons possibles de zeros i uns. Però segueix sent finit, que es va ser problemàtic si escrius programari per als gràfics o de fantasia fórmules matemàtiques. Així que en realitat podria desitjar a comptar fins més gran que això. A named-- llarg long-- estúpidament és també 8 bytes o 64 bits, i això és el doble de temps com un int, i és per a un valor enter llarg. Diversió fet-- si un int és de quatre bytes, Quant dura un temps en C normalment? També quatre bytes, però una llarg, llarg és de vuit bytes, i això és per raons històriques. Però el menjar per emportar ara és només que les dades té a ser representat en un computer-- que és un dispositiu físic amb l'electricitat, generalment està conduint aquests zeros i ones-- amb quantitats finites de precisió. Llavors, quin és el problema llavors? Bé, hi ha un problema de desbordament de sencers. No només en C, però en els ordinadors en general. Per exemple, si aquesta és un byte mereix una bit-- així que si això és vuit bit-- tot dels quals són el número u. Quin nombre és aquest que representa si assumim és tots els valors positius en binari? 255, i no és 256, perquè el zero és el nombre més baix. Així que 255 és el més alt un, però el problema se suposa que volia incrementar aquesta variable que s'utilitzen vuit bits en total si vull incrementar-lo. Doncs tan aviat com puc afegir un un a tots aquests, vostè potser pugui imaginar visually-- només com portar l'un fent servir decimals-- alguna cosa va a fluir cap a l'esquerra. I de fet, si afegeixo el nombre 1 a aquest, el que succeeix en el sistema binari és que es desborda de nou a zero. Així que si només no utilitzades: 1 int, però un sol byte per explicar nombres enters en un programa, per default-- tan aviat com sigui s'arriba a 250, 251, 252, 253, 254, 255-- 0 ve després de 255, que probablement no ho és un usuari que va a esperar. Ara mentre que en punt flotant del món, vostè també té un problema similar. No tant amb la major number-- encara que això és encara un problema. Però amb la quantitat de precisió que pot representar. Així que donem una ullada a aquest exemple aquí també de code-- font d'avui surar-0.c. I noti que és un super senzill programa que aparentment haurien imprimir el que de valor? Què s'aposta que això va a imprimir tot i que hi ha una mica de nova sintaxi aquí? Així que espero que 0,1. Així que l'equivalent d'un dècim perquè estic fent 1 dividit per 10. Estic emmagatzemant la resposta en una variable anomenada f. Aquesta variable és de tipus float, que és una paraula clau que acaba de proposar existia. No hem vist això abans, però això és una espècie d'una manera ordenada en printf per especificar el nombre de dígits que vull veure després d'un punt decimal. Així que aquesta notació només significa que aquí és un marcador de posició. És per una coma flotant valor, i oh, per cert, mostren amb el punt decimal amb un nombre després del punt decimal. Així que aquest és el nombre de dígits significatius, per així dir-ho, que és possible que vulgueu. Així que m'ho dius a mi anar endavant i fer fer surar-0, ./float-0, i pel que sembla 1 dividit per 10 és 0.0. Ara per què és això? Bé una vegada més, l'equip està prenent em literalment, i he escrit 1 i he escrit 10, i prendre una conjectura el és el tipus de dades assumit per als dos valors? Un int, és tècnicament cosa una mica diferent. És normalment un llarg, però és en última instància, un valor integral. No és un valor de coma flotant. Què vol dir que si això és un enter i això és un int, el problema és que l'ordinador no té la capacitat per emmagatzemar fins a aquest punt decimal. Així que quan vostè fa 1 dividit per 10 que usen nombres enters tant per al numerador i el denominador, la resposta ha de ser 0,1. Però el computer-- perquè aquests són integers-- no sap què fer amb el 0,1. Llavors, què està fent amb claredat? És simplement llençar-la, i el que estic veient en última instància, 0.0 és només perquè jo vaig insistir que printf mostrar un punt decimal. Però el problema és que si vostè dividir un enter per un sencer, vostè get-- per definició d'C-- un enter. I no farà alguna cosa agradable i còmoda com al voltant d'ella fins al més proper amunt o cap avall. Es va a truncar sobretot després de l'decimal. Així que només intuïtivament, el que és probablement una solució? Quina és la solució més simple aquí? Sí? Exactament. Per què no simplement tractem aquests com valors de coma flotant efectivament convertint-los en carrosses o dobles. I ara si ho faig fer carrosses-0, o si va compilar carrosses-1, que és idèntica a la qual cosa només es va proposar. I ara que faig carrosses-0, ara em surt la meva 0.1. Ara bé, això és increïble. Però ara em faré cosa una mica diferent. Tinc curiositat per veure el que és realment passant per sota de la campana, i jo vaig a imprimir aquesta a 28 xifres decimals. Vull veure realment 0.1000-- 1 infinite-- [Inaudible] 27 zeros després que 0,1. Bé anem a veure si això és el que de fet entenc. Feu mateix arxiu carrosses-0. ./floats-0. Anem a apropar a la resposta dramàtica. Durant tot aquest temps, has estat pensant 1 dividit per 10 és del 10%, o 0,1. Que no és. Almenys pel que fa a la de què es tracti ordinador. Ara què-- bé, això és completa mentida 1 dividit per 10 és de 0,1. Però això no és què-- el menjar per portar avui. Llavors, per què pensa l'equip, a diferència de tots nosaltres a l'habitació, que 1 dividit per 10 és en realitat aquest valor boig? Quina és l'ordinador fent semblar? Què és això? No és desbordi, per se. Overflow és típicament quan en què es posa al voltant d'un valor. És aquest problema d'imprecisió en un valor de coma flotant en la qual només té 32 o fins i tot 64 bits. Però si hi ha un infinit nombre de numbers-- veritable nombres amb punts decimals i els números de thereafter-- segurament no pot representar a tots ells. Així que l'equip ha donat nosaltres la coincidència més propera al valor que pot representar usant aquest molts bits al valor realment vull, que és 0,1. Desafortunadament, si vostè començar a fer matemàtiques, o iniciar la participació d'aquest tipus de flotació valors de punt en important programs-- programari financer, res software-- militar on la percepció és probablement bastant important. I començar a afegir números d'aquest tipus, i començament executar aquest programari amb entrades molt grans o per moltes hores o lots de dies o una pila d'anys, aquests diminuts petits errors sens dubte pot augmentar amb el temps. Ara com un part, si alguna vegada t'has vist Superman 3 o espai d'oficina i es pot recordar com aquests nois van robar una gran quantitat de diners del seu ordinador mitjançant l'ús de valors de coma flotant i sumant la petita residus, és d'esperar que la pel · lícula ara té més sentit. Això és el que eren al·ludint que en la pel · lícula. El fet que la majoria les empreses no es veurien després d'un cert nombre de decimals, però aquests són fraccions de centaus. Així que començar a sumar, vostè comença a fer un munt de diners en el seu compte bancari. Així que això és Espai Oficina explicat. Ara per desgràcia més enllà Espai d'oficina, hi ha són alguns legítimament preocupant i impactes significatius d'aquests tipus de decisions de disseny subjacents, i de fet una de les raons utilitzem C en el curs és perquè vostè realment té aquesta planta fins a la comprensió de com funcionen els ordinadors, com el programari funciona i què no donar res per fet. I de fet Desafortunadament, fins i tot amb que la comprensió fonamental, nosaltres els humans cometem errors. I el que jo vaig pensar en compartir és aquest video de vuit minut aquí pren d'un episodi de Meravelles Modernes, que és un espectacle didàctic sobre com funcionen les coses que pinta dos quadres quan un ús indegut i la comprensió de valors de coma flotant conduït a alguns significativa resultats desafortunats. Anem a fer una ullada. [REPRODUCCIÓ DE VÍDEO] Nosaltres Ara tornar a "Enginyeria Desastres "a Meravelles Modernes. Ordinadors. Tots hem arribat a acceptar la problemes sovint frustrants que aconseguit amb ells-- error, virus, i glitches-- programari per als preus petits a pagar per la comoditat. Però en l'alta tecnologia i d'alta velocitat aplicacions militars i programes espacials, el problema més petit possible magnificar en el desastre. El 4 de juny de 1996, els científics van preparar per llançar un coet Ariane 5 no tripulat. Transportava científica satèl · lits dissenyats establir amb precisió com el Interactua camp magnètic de la Terra amb els vents solars. El coet va ser construït per l'Agència Espacial Europea, i va enlairar des de les seves instal · lacions a la costa de la Guaiana francesa. -Al Uns 37 segons en el vol, primer alguna cosa notat anava malament. Que els broquets es gira sobre un eix de manera que en realitat no hauria. Al voltant de 40 segons de vol, clarament el vehicle estava en problemes, i va ser llavors quan van fer la decisió de destruir. L'oficial de seguretat de gamma, amb enormes budells, pressiona el botó i explotar el coet abans que pogués convertir-se en un perill per a la seguretat pública. : Aquest era la donzella viatge de l'Ariane 5, i la seva destrucció es va portar lloc a causa de la falla integrat en el programari del coet. -El Problema al Ariane va ser que no era un nombre que requereix 64 bits per expressar, i volien convertir a un nombre de 16 bits. Van assumir que el nombre Mai seria molt gran. Que la majoria d'aquests dígits a el nombre de 64 bits eren zeros. Estaven equivocats. -El Incapacitat d'un programa per acceptar el tipus de nombre generat per un altre era a l'arrel de la falla. El desenvolupament de programari s'havia convertit en un molt costosa part de la nova tecnologia. El coet Ariane 4 tenia tingut molt èxit. Així que gran part del programari creat per també va ser utilitzat en el Ariane 5. -El Problema bàsic era que l'Ariane 5. Va ser Més Ràpid accelerat més ràpid, i el programari no havia pres en compte per això. -El Destrucció del coet va ser un gran desastre financer. Tot a causa d'un error de programari minuts. Però aquesta no va ser la primera problemes de conversió de dades de temps havia ple la tecnologia moderna de coets. -En 1991 amb l'inici de la primera Guerra del Golf, el míssil Patriot experimentat una classe similar d'un problema de conversió nombre. I com a resultat 28 gent-- 28 Soldiers-- nord-americans van morir, i al voltant d'un centenar més van resultar ferits. Quan el Patriot, que se suposava per protegir contra Scuds entrants, deixat de disparar un míssil. Quan Iraq va envair Kuwait, i Amèrica llançat Tempesta del Desert a principis de 1991, Bateries de míssils Patriot van ser desplegats per protegir Aràbia Saudita i Israel dels atacs iraquians amb míssils Scud. El Patriot és un mitjà-rang de Estats Units terra-aire del sistema fabricat per l'empresa Raytheon. -El Mida del Patriota interceptor itself-- és més o menys uns 20 peus de llarg, i pesa al voltant de 2.000 lliures. I porta una ogiva del voltant, Crec que és més o menys 150 lliures. I el propi cap de combat és un explosiu d'alta potència, que té fragments al seu voltant. Així la carcassa de la ogiva és dissenyat per actuar com un perdigó. -Els Míssils es duen quatre per contenidor, i són transportats per un semiremolc. -El Sistema Patriot antimíssils es remunta almenys 20 anys. Originalment va ser dissenyat com un míssil de defensa aèria per enderrocar avions enemics. A la primera Guerra del Golf quan aquesta guerra es va encendre, l'Exèrcit volia utilitzar-lo per enderrocar míssils Scud, no avions. La Força Aèria Iraquiana va ser no tant d'un problema, però l'Exèrcit estava preocupat sobre els Scud. I pel que van tractar d' actualitzar el Patriot. -Intercepting Un enemic míssil que viatja a Mach 5 que seria un repte suficient. Però quan el Patriot va ser traslladat d'urgència en servei, l'Exèrcit no estava al tant de una modificació iraquiana que fet els seus Scuds gairebé impossible a ella. Què va succeir és que els Scud van anar arribant eren inestables. Eren oscil.lant. La raó d'això era dels Iraqis-- a fi d'obtenir 600 quilòmetres a terme d'un rang missile-- 300 quilòmetres prendre el pes de la ogiva front, i l'ogiva fet més lleuger. Així que ara el Patriot de tractar d'arribar al Scud, i la majoria de la temps-- l'aclaparadora majoria de la temps-- seria simplement sortir volant pel Scud. Una Els operadors del sistema Patriot es va adonar de la Patriot va perdre el seu objectiu, detonar ogiva del Patriota per evitar possibles baixes si es va deixar caure a terra. Això va ser el que van veure la majoria de la gent com grans boles de foc al cel, i incomprès com intercepcions d'ogives Scud. -Encara En els cels nocturns, Patriots semblava estar destruint amb èxit Scud, en Dhahran podria haver No s'equivoquin sobre el seu acompliment. Hi ha sistema de radar del Patriot perdut la pista d'un Scud entrant i mai posat en marxa a causa a un defecte de programari. Van ser els israelians que va descobrir per primera vegada que com més temps el sistema estava encès, com més gran és la discrepància de temps es va convertir. A causa d'un rellotge incorporat a l'ordinador del sistema. -About Dues setmanes abans la tragèdia a Dhahran, els israelians van informar el Departament de Defensa que el sistema estava perdent el temps. Després d'aproximadament vuit hores de funcionament, es van adonar que el sistema esdevingui notablement menys precisa. El Departament de Defensa va respondre comptant totes les bateries Patriot per no deixar els sistemes per un llarg temps. Mai van dir el que era molt de temps. 8 hores, 10 hores, mil hores. Ningú sabia. -El Bateria Patriot destinat a la caserna en Dhahran i el seu defectuós intern rellotge havia estat en marxa durant més de 100 hores en la nit del 25 de febrer. És rastrejats temps amb una precisió del voltant d'una dècima de segon. Ara desè d'un segon és un nombre interessant perquè no es pot expressar exactament en binari, que significa que no es pot expressar exactament en qualsevol ordinador digital moderna. És difícil de creure, però utilitzar això com un exemple. Prenguem el nombre d'un terç. Una tercera no pot ser expressat en decimal exactament. Una tercera és 0.333 passant per l'infinit. No hi ha manera de fer això amb precisió absoluta en un decimal. Aquest és exactament el tipus de problema això va succeir en el Patriot. Com més temps el sistema va funcionar, la es va convertir en el pitjor error de temps. -Després 100 hores de funcionament, el error en el temps era només al voltant d'un terç d'un segon. Però en termes de focalització d'un míssil que viatja a Mach 5, que va donar lloc a un seguiment error de més de 600 metres. Seria un error fatal per als soldats a Dhahran. ¿Què va passar es va anar el llançament d'un Scud detectat pels satèl · lits d'alerta primerenca, i conèixer un Scud venia en la seva direcció general. No sabien d'on venia. Ara era fins al radar component del sistema Patriot defensar Dhahran localitzar i pista del míssil enemic entrant. -El Radar era molt intel · ligent. En realitat, seria rastrejar la posició de la Scud i després predir on probablement seria la propera vegada que el radar envia un pols a terme. Això es deia la porta de distància. Aleshores Una vegada que el Patriot decideix prou temps té passat a tornar enrere i comprovar la ubicació per a aquest objecte detectat que es remunta. Així que quan es va tornar al mal lloc, a continuació, no veu cap objecte. I decideix que no havia objecte. Que hi havia una detecció falsa i cau la pista. -El Scud entrant desaparèixer des de la pantalla de radar, i segons després, es va estavellar contra la caserna. El Scud va matar 28. Va ser l'últim acomiadat durant la primera Guerra del Golf. Tràgicament, el programari actualitzat arribar a l'alba de l'endemà. La falla de programari tenia estat fixat, tancament un capítol en l'atribolat la història dels míssils Patriot. [FI REPRODUCCIÓ DE VÍDEO] DAVID J. Malan: Això és tot per CS50. Ens veiem dimecres. [REPRODUCCIÓ DE MÚSICA]