1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [REPRODUCCIÓ DE MÚSICA] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. Malan: Molt bé. 5 00:00:12,660 --> 00:00:15,590 Això és CS50, i això és el començament de la setmana dues. 6 00:00:15,590 --> 00:00:19,120 Comencem, doncs, avui amb un error. 7 00:00:19,120 --> 00:00:20,974 Un error, per descomptat, és un error en un programa, 8 00:00:20,974 --> 00:00:22,890 i obtindrà molt familiaritzats amb aquest concepte 9 00:00:22,890 --> 00:00:26,050 si mai has programat abans. pset0 i ara pset1. 10 00:00:26,050 --> 00:00:29,280 Però considerarem alguna cosa una mica simple al principi. 11 00:00:29,280 --> 00:00:32,189 Aquest programa aquí que jo tirar junts per avançat, 12 00:00:32,189 --> 00:00:37,280 i afirmo que això ha d'imprimir 10 estrelles de la pantalla utilitzant printf, 13 00:00:37,280 --> 00:00:41,020 però està aparentment Buggy en alguna manera. 14 00:00:41,020 --> 00:00:45,370 >> Atès que especificació que ha d'imprimir 10 estrelles, 15 00:00:45,370 --> 00:00:50,230 però no és així, aparentment, el que vostè reclamar és l'error? 16 00:00:50,230 --> 00:00:52,004 Sí? 17 00:00:52,004 --> 00:00:54,420 Així que és un fora per un error, i què vols dir amb això? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 Okay. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Excel · lent. 22 00:01:10,410 --> 00:01:13,930 Així que hem creat un valor inicial de zero per a i, 23 00:01:13,930 --> 00:01:18,399 i hem especificat un valor de n de 10, però nosaltres hem fet servir menor o igual a. 24 00:01:18,399 --> 00:01:21,190 I la raó que això és de dos personatges i no només un símbol, 25 00:01:21,190 --> 00:01:22,630 com en un llibre de matemàtiques, és que no té 26 00:01:22,630 --> 00:01:24,880 una forma d'expressar la un equivalent de caràcters. 27 00:01:24,880 --> 00:01:28,450 >> Així que això significa menys d', però si vostè comença a comptar des de zero, 28 00:01:28,450 --> 00:01:31,690 però es compta fins al final a través d'e igual a 10, 29 00:01:31,690 --> 00:01:34,170 vostè és, per descomptat, va a comptar 11 coses en total. 30 00:01:34,170 --> 00:01:35,900 I pel que anem a imprimir 11 estrelles. 31 00:01:35,900 --> 00:01:37,990 Llavors, què podria ser una solució per això? 32 00:01:37,990 --> 00:01:39,970 Sí? 33 00:01:39,970 --> 00:01:43,980 >> Així que ajustar el menys o igual a només ser menor que, 34 00:01:43,980 --> 00:01:46,250 i hi ha, reclam, potser una altra solució, també. 35 00:01:46,250 --> 00:01:47,210 Què pot ser que una altra cosa que fer? 36 00:01:47,210 --> 00:01:48,590 Sí? 37 00:01:48,590 --> 00:01:53,660 >> Així que comença a igualar a 1, i deixar el menor que o igual a. 38 00:01:53,660 --> 00:01:56,187 I, francament, m'agradaria reclamar que, per a un humà típic, 39 00:01:56,187 --> 00:01:57,770 Això és probablement més senzill. 40 00:01:57,770 --> 00:02:00,280 Comença a comptar a 1 i comptar fins a 10. 41 00:02:00,280 --> 00:02:01,690 Bàsicament fa el que vol dir. 42 00:02:01,690 --> 00:02:04,010 >> Però la realitat és en programació, com hem vist, 43 00:02:04,010 --> 00:02:07,598 els informàtics i programadors generalment no començar a comptar des de zero. 44 00:02:07,598 --> 00:02:09,389 I així està bé una vegada t'acostumes a ell. 45 00:02:09,389 --> 00:02:12,640 El seu estat de salut general una mena menys. 46 00:02:12,640 --> 00:02:14,910 Així que simplement una lògica error que podríem ara 47 00:02:14,910 --> 00:02:17,990 fixar i finalment tornar a compilar això i aconseguir tot just 10. 48 00:02:17,990 --> 00:02:19,610 >> Bé què tal aquest error aquí? 49 00:02:19,610 --> 00:02:24,200 Aquí, una altra vegada, reclamar que tinc un objectiu d'imprimir 10 stars-- 50 00:02:24,200 --> 00:02:28,140 un per línia aquesta vegada, però no és així. 51 00:02:28,140 --> 00:02:30,940 Abans que ens proposem ho la solució és, el que fa aquest 52 00:02:30,940 --> 00:02:34,640 imprimeixo visualment si jo fos a compilar i executar aquest programa què et sembla? 53 00:02:34,640 --> 00:02:35,140 Sí? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Estrella. 56 00:02:38,860 --> 00:02:41,690 Així que totes les estrelles al mateixa línia és el que he sentit, 57 00:02:41,690 --> 00:02:43,391 i després el caràcter de nova línia. 58 00:02:43,391 --> 00:02:44,140 Així que anem a tractar d'això. 59 00:02:44,140 --> 00:02:48,710 Així fan amb errors-1, entrar, i veig la comanda Clang 60 00:02:48,710 --> 00:02:50,090 que parlem l'última vegada. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, i de fet veig totes les 10 estrelles en la mateixa línia tot i que jo reclam 62 00:02:55,180 --> 00:02:58,690 En la meva especificació només un comentari al cim el codi que tenia la intenció de fer una per 63 00:02:58,690 --> 00:02:59,230 línia. 64 00:02:59,230 --> 00:03:00,580 Però això es veu bé. 65 00:03:00,580 --> 00:03:04,620 >> Ara la línia 15 es veu com si estigués la impressió d'una estrella, i després la línia 16 66 00:03:04,620 --> 00:03:06,620 sembla com si jo fos la impressió un caràcter de nova línia, 67 00:03:06,620 --> 00:03:09,560 i els dos estan tan sagnia Jo estic dins del bucle clarament. 68 00:03:09,560 --> 00:03:13,610 Així que no hauria d'estar fent l'estrella, nova línia, estrella, nova línia, estrella, nova línia? 69 00:03:13,610 --> 00:03:14,110 Sí? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Sí, a diferència d'un llenguatge com Python, si vostè està familiaritzat, 72 00:03:21,240 --> 00:03:23,540 indentació no importa a l'equip. 73 00:03:23,540 --> 00:03:25,280 L'únic que importa a la humana. 74 00:03:25,280 --> 00:03:29,860 Així les línies mentre que aquí m'he inventat 15 i 16-- que es veu bonica, 75 00:03:29,860 --> 00:03:31,330 però l'ordinador no li importa. 76 00:03:31,330 --> 00:03:34,640 L'equip es preocupa per realment tenir claus 77 00:03:34,640 --> 00:03:36,310 al voltant d'aquestes línies de codi. 78 00:03:36,310 --> 00:03:39,520 >> Així que és clear-- igual que en Scratch-- que aquestes dues línies de codi 79 00:03:39,520 --> 00:03:40,450 ha de ser executat. 80 00:03:40,450 --> 00:03:44,390 Com un dels trencaclosques groc de Scratch peces una i altra vegada i una altra. 81 00:03:44,390 --> 00:03:50,920 >> Així que ara si puc tornar a executar aquest program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Tinc un error ara. 83 00:03:51,770 --> 00:03:54,212 El que em vaig oblidar de fer? 84 00:03:54,212 --> 00:03:55,420 Sí, així que no em compilar. 85 00:03:55,420 --> 00:03:56,740 Així que amb errors-2. 86 00:03:56,740 --> 00:03:59,840 No existeix el fitxer perquè no ho vaig fer realment compilar la segona versió. 87 00:03:59,840 --> 00:04:04,860 Així que ara interessant no declarat no variable-- 2. 88 00:04:04,860 --> 00:04:05,510 Estem fent 1. 89 00:04:05,510 --> 00:04:11,050 Fer ./buggy-1-- buggy 1-- i ara cada un d'ells està en la mateixa línia. 90 00:04:11,050 --> 00:04:13,880 >> Ara hi ha una excepció a aquesta suposada afirmació meva 91 00:04:13,880 --> 00:04:15,520 que necessiteu aquestes claus. 92 00:04:15,520 --> 00:04:20,160 Quan és en realitat AUTORIZACIÓN-- si has notat en la secció o textbooks-- 93 00:04:20,160 --> 00:04:22,130 ometre les claus? 94 00:04:22,130 --> 00:04:22,630 Sí? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Exactament. 97 00:04:26,870 --> 00:04:28,940 Quan només hi ha una línia de codi que 98 00:04:28,940 --> 00:04:32,830 volen ser associats amb el bucle com en el nostre primer exemple. 99 00:04:32,830 --> 00:04:36,380 És perfectament legítim ometre les claus 100 00:04:36,380 --> 00:04:40,310 només com una espècie de conveniència del compilador per a vostè. 101 00:04:40,310 --> 00:04:40,810 Sí? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Bona pregunta. 104 00:04:43,930 --> 00:04:45,500 Es consideraria un error d'estil? 105 00:04:45,500 --> 00:04:49,340 Ens promote-- com en CS50 guia d'estil, l'URL per al qual 106 00:04:49,340 --> 00:04:51,926 està en pset1-- que sempre utilitzar les claus. 107 00:04:51,926 --> 00:04:53,550 Certament, si sou nou en la programació. 108 00:04:53,550 --> 00:04:56,800 La realitat és que no som va a prohibir que 109 00:04:56,800 --> 00:04:58,680 de fer aquestes comoditats. 110 00:04:58,680 --> 00:05:00,846 Però si vostè és només el en el ritme de les coses, 111 00:05:00,846 --> 00:05:04,020 absolutament sol utilitzeu sempre l'arrissat suports fins que arribi la caiguda d'ella. 112 00:05:04,020 --> 00:05:04,640 Bona pregunta. 113 00:05:04,640 --> 00:05:05,320 >> Bé. 114 00:05:05,320 --> 00:05:07,660 Així que llavors era un error. 115 00:05:07,660 --> 00:05:09,190 Almenys en una cosa bastant simple. 116 00:05:09,190 --> 00:05:11,260 I no obstant això, vostè podria pensar que això és bastant rudimentària, oi? 117 00:05:11,260 --> 00:05:13,635 Aquesta és una espècie de la primera setmana de veure el llenguatge 118 00:05:13,635 --> 00:05:14,890 com, veure els seus errors en el mateix. 119 00:05:14,890 --> 00:05:17,250 Però la realitat aquests són realment representativa 120 00:05:17,250 --> 00:05:20,310 d'alguns problemes bastant aterridores que poden sorgir en el món real. 121 00:05:20,310 --> 00:05:23,530 >> Així que alguns de vostès poden recordar si vostè segueix de notícies de tecnologia, 122 00:05:23,530 --> 00:05:25,740 o potser fins i tot atrapats vent de l'est al febrer 123 00:05:25,740 --> 00:05:29,434 d'aquest últim any que Apple tenia comès un petit error en ambdues iOS, 124 00:05:29,434 --> 00:05:31,350 el sistema operatiu en seus telèfons, i també 125 00:05:31,350 --> 00:05:34,220 Mac OS, el sistema operatiu en els seus ordinadors d'escriptori i portàtils. 126 00:05:34,220 --> 00:05:36,480 I vas veure titulars com aquest. 127 00:05:36,480 --> 00:05:41,120 I a partir de llavors, Apple promès corregir aquest error, 128 00:05:41,120 --> 00:05:45,950 i molt ràpidament va fer fixar en iOS, però en última instància, fixa en Mac OS 129 00:05:45,950 --> 00:05:46,810 també. 130 00:05:46,810 --> 00:05:50,370 >> Ara cap d'aquests titulars sola realitat revelar el que era el problema de fons, 131 00:05:50,370 --> 00:05:55,640 però l'error es redueix en última instància a una errada en SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 I conte llarg, aquest és el programari 133 00:05:57,390 --> 00:06:01,030 que els nostres navegadors i altres programari utilitzat per fer què? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Si digués que SSL és involucrats, cada vegada que 136 00:06:06,860 --> 00:06:13,920 visiti un URL que comenci amb HTTPS, el que llavors podria estar relacionat amb SSL? 137 00:06:13,920 --> 00:06:14,580 Xifrat. 138 00:06:14,580 --> 00:06:16,470 Així que anem a parlar de això en els pròxims dies. 139 00:06:16,470 --> 00:06:18,750 Xifrat, l'art de la aleatorització informació. 140 00:06:18,750 --> 00:06:22,200 >> Però conte llarg, Apple Fa algun temps havia comès un error 141 00:06:22,200 --> 00:06:25,970 en la implementació de SSL, l' programari que implementa en última instància 142 00:06:25,970 --> 00:06:30,120 URL com HTTPS o màxim connexions allà també. 143 00:06:30,120 --> 00:06:32,850 El resultat de tot això és que el seu connexions podria potencialment 144 00:06:32,850 --> 00:06:33,920 ser interceptat. 145 00:06:33,920 --> 00:06:37,130 I les seves connexions eren no necessàriament xifrat 146 00:06:37,130 --> 00:06:40,350 si has tingut algun tipus dolent en el medi vostè i el lloc web de destinació que 147 00:06:40,350 --> 00:06:42,170 sabia com prendre avantatge d'això. 148 00:06:42,170 --> 00:06:45,090 >> Ara Apple finalment va publicar una solució per a aquest últim, 149 00:06:45,090 --> 00:06:46,920 i la descripció de la seva arranjament era això. 150 00:06:46,920 --> 00:06:49,878 Transport segur no per validar l'autenticitat de la connexió. 151 00:06:49,878 --> 00:06:52,920 El tema va ser abordat per restauració que falten etapes de validació. 152 00:06:52,920 --> 00:06:57,250 >> Així que aquesta és una explicació molt ondulat mà per simplement dir que vam ficar la pota. 153 00:06:57,250 --> 00:07:00,920 Hi ha, literalment, un línia de codi que va ser amb errors 154 00:07:00,920 --> 00:07:05,130 en la implementació de SSL, i si vostè va en línia i la recerca d'aquest 155 00:07:05,130 --> 00:07:07,210 vostè pot trobar realment el codi font original. 156 00:07:07,210 --> 00:07:11,960 Per exemple, aquesta és una captura de pantalla només una part d'un arxiu bastant gran, 157 00:07:11,960 --> 00:07:15,965 però aquesta és una funció aparentment anomenat SSL verificar intercanvi de claus del servidor de subscripció. 158 00:07:15,965 --> 00:07:17,840 I es necessita un munt de arguments i insumos. 159 00:07:17,840 --> 00:07:20,298 I no ens centrarem massa en els petits detalls que hi ha, 160 00:07:20,298 --> 00:07:24,390 però si vostè es centra en el codi dins d'aquest superior function-- anem 161 00:07:24,390 --> 00:07:25,590 zoom sobre això. 162 00:07:25,590 --> 00:07:28,140 És possible que ja sospitar el que l'error podria 163 00:07:28,140 --> 00:07:31,230 encara si no tens ni idea en última instància, el que estem veient. 164 00:07:31,230 --> 00:07:35,924 Hi ha una espècie d'anomalia aquí, que és el que? 165 00:07:35,924 --> 00:07:38,940 >> Sí, no m'agrada la mirada de dos Goto falla. 166 00:07:38,940 --> 00:07:42,060 Francament, no sé ben bé què Goto FALLADA significa, però tenir dos d'ells 167 00:07:42,060 --> 00:07:42,810 esquena amb esquena. 168 00:07:42,810 --> 00:07:45,290 Això com que em frega intel·lectualment pel camí equivocat, 169 00:07:45,290 --> 00:07:48,910 i, de fet, si ens acostem a només aquestes línies, és a dir C. 170 00:07:48,910 --> 00:07:52,220 >> Així que una gran quantitat de codi d'Apple està al seu torn està escrit en C, 171 00:07:52,220 --> 00:07:55,780 i això pel que sembla és realment equivalent-- 172 00:07:55,780 --> 00:07:59,060 no que prou indentació versió, però si reconeix el fet 173 00:07:59,060 --> 00:08:02,560 que no hi ha claus, el que Apple realment va escriure era el codi que veu 174 00:08:02,560 --> 00:08:03,540 com aquest. 175 00:08:03,540 --> 00:08:07,080 Així que he has allunyat i jo fixa la indentació en el sentit 176 00:08:07,080 --> 00:08:10,690 que si no hi claus, que segon Goto fallen és en groc 177 00:08:10,690 --> 00:08:12,500 es va a executar independentment del. 178 00:08:12,500 --> 00:08:15,540 No està associat amb la condició if per sobre d'ella. 179 00:08:15,540 --> 00:08:19,590 >> Així que fins i tot més, si no prou entendre el que això podria possiblement 180 00:08:19,590 --> 00:08:23,230 estar fent, saber que cada un d'aquests conditions-- cadascuna d'aquestes línies 181 00:08:23,230 --> 00:08:26,180 és un pas molt important en el procés de comprovar 182 00:08:26,180 --> 00:08:28,350 si les seves dades són en realitat xifrada. 183 00:08:28,350 --> 00:08:31,710 Així saltar un d'ells passos, no és la millor idea. 184 00:08:31,710 --> 00:08:34,840 >> Però perquè tenim aquesta Anar a segona falla en groc, 185 00:08:34,840 --> 00:08:36,840 i perquè una vegada que tipus de estèticament 186 00:08:36,840 --> 00:08:40,480 moure a l'esquerra on es lògicament és en aquest moment, el que 187 00:08:40,480 --> 00:08:43,230 Què significa això per a la línia de codi de sota que Goto segon 188 00:08:43,230 --> 00:08:46,480 falles pensaria vostè? 189 00:08:46,480 --> 00:08:48,860 Sempre serà omès. 190 00:08:48,860 --> 00:08:52,100 Així gotos estan generalment mal vist per raons que no entrarem a realment, 191 00:08:52,100 --> 00:08:54,940 i de fet en CS50 no tendim per ensenyar aquesta Goto declaració, 192 00:08:54,940 --> 00:08:58,130 però es pot pensar en Goto fallar en el sentit d'anar salt 193 00:08:58,130 --> 00:08:59,600 a alguna altra part del codi. 194 00:08:59,600 --> 00:09:03,120 >> En altres paraules saltar per sobre aquesta última línia per complet, 195 00:09:03,120 --> 00:09:07,420 i així el resultat d'aquesta estúpida simple error que s'acaba 196 00:09:07,420 --> 00:09:10,330 resultat d'algú probablement copiar i enganxar un també 197 00:09:10,330 --> 00:09:14,150 moltes vegades era que tot el la seguretat de iOS i Mac OS 198 00:09:14,150 --> 00:09:18,240 era vulnerable a la intercepció per mals des de fa força temps. 199 00:09:18,240 --> 00:09:19,940 Fins que Apple finalment fixa això. 200 00:09:19,940 --> 00:09:23,100 >> Ara bé, si alguns de vostès són en realitat corrent versions antigues de iOS o Mac OS, 201 00:09:23,100 --> 00:09:27,250 vostè pot anar a gotofail.com que és un lloc web que algú va crear 202 00:09:27,250 --> 00:09:29,190 per determinar essencialment mitjançant programació 203 00:09:29,190 --> 00:09:30,980 si l'equip segueix sent vulnerable. 204 00:09:30,980 --> 00:09:33,600 I, francament, si ho és, és probablement una bona idea 205 00:09:33,600 --> 00:09:36,870 per actualitzar el telèfon o el teu Mac en aquest moment. 206 00:09:36,870 --> 00:09:40,120 Però allà, just testimoni de com una apreciació d'aquestes nivell inferior 207 00:09:40,120 --> 00:09:42,400 detalls i bastant idees simples pot realment 208 00:09:42,400 --> 00:09:44,590 traduir-se en decisions i els problemes que 209 00:09:44,590 --> 00:09:47,320 affected-- en aquest cas-- milions de persones. 210 00:09:47,320 --> 00:09:49,107 >> Ara una paraula sobre l'administració. 211 00:09:49,107 --> 00:09:50,690 Secció començarà diumenge que ve. 212 00:09:50,690 --> 00:09:53,360 Vostè rebrà un correu electrònic pel cap de setmana de la secció, i en aquest moment 213 00:09:53,360 --> 00:09:55,290 el procés de resecció s'iniciarà si no tens 214 00:09:55,290 --> 00:09:56,998 es va adonar que ara tenen alguns dels nous conflictes. 215 00:09:56,998 --> 00:10:00,180 Així que això succeeix tots els anys, i ens s'acomoda en els dies per venir. 216 00:10:00,180 --> 00:10:02,430 >> Oficina hores-- fan mantenir un ull en aquesta programació aquí. 217 00:10:02,430 --> 00:10:05,100 Canvia una mica aquesta setmana, en particular el temps d'inici 218 00:10:05,100 --> 00:10:08,180 i la ubicació, així que consulti amb que abans de dirigir-se a les hores d'oficina 219 00:10:08,180 --> 00:10:09,520 qualsevol de les quatre nits. 220 00:10:09,520 --> 00:10:12,680 I ara unes paraules sobre l'avaluació, especialment pel que et submergeixis en un problema 221 00:10:12,680 --> 00:10:14,350 estableix un i més enllà. 222 00:10:14,350 --> 00:10:17,070 >> Així per l'especificació, aquests són en general 223 00:10:17,070 --> 00:10:20,360 els eixos al llarg de la qual avaluem la seva feina. 224 00:10:20,360 --> 00:10:23,170 L'abast es refereix al que mesura les seves implements de codi 225 00:10:23,170 --> 00:10:25,690 les característiques necessàries per la nostra especificació. 226 00:10:25,690 --> 00:10:28,290 En altres paraules, la quantitat de un conjunt peça va fer mossegar fora. 227 00:10:28,290 --> 00:10:30,440 Vas fer un terç d'ella, un mitjà d'això, el 100% de la mateixa. 228 00:10:30,440 --> 00:10:33,000 Encara que no és correcta, la quantitat que va aconseguir? 229 00:10:33,000 --> 00:10:35,290 Així que captura el nivell d'esforç i de la quantitat 230 00:10:35,290 --> 00:10:38,260 a la qual poc allunyat de la els problemes del conjunt de problemes. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- aquest, a En quina mesura, és el seu codi 232 00:10:40,690 --> 00:10:43,150 coherent amb la nostra especificacions i lliure d'errors. 233 00:10:43,150 --> 00:10:44,770 Així funciona correctament? 234 00:10:44,770 --> 00:10:48,700 Si li donem una mica d'entrada, ho fa ens donen el resultat que esperem? 235 00:10:48,700 --> 00:10:52,570 Design-- ara aquesta és la primera de particularment els qualitatius, 236 00:10:52,570 --> 00:10:56,180 o els que requereixen el judici humà. 237 00:10:56,180 --> 00:10:59,690 I, de fet, és per això que comptem amb un personal de tants companys d'ensenyament i curs 238 00:10:59,690 --> 00:11:00,350 ajudants. 239 00:11:00,350 --> 00:11:03,480 ¿Fins a quin punt és la seva codi ben escrit? 240 00:11:03,480 --> 00:11:05,810 >> I de nou es tracta d'una molt avaluació qualitativa 241 00:11:05,810 --> 00:11:09,100 que treballarà amb vostè en bidireccionalment en les setmanes per venir. 242 00:11:09,100 --> 00:11:12,060 Així que quan vostè no rep només en els resultats numèrics, sinó també 243 00:11:12,060 --> 00:11:16,682 unes partitures escrites, o retroalimentació mecanografiat, o comentaris per escrit en les paraules en anglès. 244 00:11:16,682 --> 00:11:19,640 Això és el que utilitzarem per conduir que cap realment escriure un millor codi. 245 00:11:19,640 --> 00:11:23,320 I a la conferència ia la secció, tractarem assenyalar sortir-- tan sovint com ens puedes-- 246 00:11:23,320 --> 00:11:26,420 el que fa que un programa no només correcta i funcionalment bo, 247 00:11:26,420 --> 00:11:28,200 sinó també ben dissenyat. 248 00:11:28,200 --> 00:11:31,850 El més eficient que podria ser, o fins i tot la més bella que pot ser. 249 00:11:31,850 --> 00:11:33,100 >> El que ens porta a l'estil. 250 00:11:33,100 --> 00:11:36,876 Estil en última instància és un judici estètic. 251 00:11:36,876 --> 00:11:38,750 ¿Vas triar bé noms per a les variables? 252 00:11:38,750 --> 00:11:40,330 Et sangria seu codi correctament? 253 00:11:40,330 --> 00:11:44,010 Es veu bé, i per tant, és fàcil per a un altre ésser humà 254 00:11:44,010 --> 00:11:46,550 llegir la seva respectiva de la seva correcció. 255 00:11:46,550 --> 00:11:50,300 >> Ara en general pel pla d'estudis, anotem aquestes coses en una escala de cinc punts. 256 00:11:50,300 --> 00:11:53,640 I permetin-me recalcar el punt quals tres és de fet bé. 257 00:11:53,640 --> 00:11:55,550 Molt ràpidament fer amics començar a fer aritmètica. 258 00:11:55,550 --> 00:11:58,133 Quan arriben a tres de cada cinc a la correcció d'algun conjunt de processadors 259 00:11:58,133 --> 00:12:02,040 i pensen maleïda, em va a 60% que és essencialment un D o E. 260 00:12:02,040 --> 00:12:03,980 >> Aquesta no és la forma en què pensar en aquests números. 261 00:12:03,980 --> 00:12:06,880 A tres és en veritat bo, i el que en general, es pot esperar en el començament 262 00:12:06,880 --> 00:12:09,820 del terme és que si vostè està rebent un munt de three's-- potser un parell 263 00:12:09,820 --> 00:12:12,540 de fires, un parell de fours-- o un parell de dos en dos, un parell de fours-- 264 00:12:12,540 --> 00:12:13,748 això és un bon lloc per començar. 265 00:12:13,748 --> 00:12:16,320 I mentre veiem un trajectòria ascendent en el temps, 266 00:12:16,320 --> 00:12:18,540 vostè està en un bon lloc. 267 00:12:18,540 --> 00:12:20,752 >> La fórmula que utilitzem per coses de pes és essencialment 268 00:12:20,752 --> 00:12:22,710 això pel pla d'estudis, que simplement vol dir que tenim 269 00:12:22,710 --> 00:12:24,750 donar més pes a la correcció. 270 00:12:24,750 --> 00:12:27,930 Com que és molt sovint la correcció que porta la major part del temps. 271 00:12:27,930 --> 00:12:28,760 Confia en mi ara. 272 00:12:28,760 --> 00:12:31,190 Vostè encontrar-- almenys en una pset-- que 273 00:12:31,190 --> 00:12:36,790 passar el 90% del seu temps treballant en 10% del problema. 274 00:12:36,790 --> 00:12:39,320 >> I tot tipus d'obres a excepció d'un o dos errors, 275 00:12:39,320 --> 00:12:41,570 i aquests són els errors que mantenir despert fins tard a la nit. 276 00:12:41,570 --> 00:12:43,380 Aquests són els que sort d'escapar. 277 00:12:43,380 --> 00:12:45,560 Però després de dormir-hi, o assistir a les hores d'oficina 278 00:12:45,560 --> 00:12:48,844 o fer preguntes en línia, es quan s'arriba a aquest objectiu 100%, 279 00:12:48,844 --> 00:12:50,760 i és per això que el pes correcció més. 280 00:12:50,760 --> 00:12:54,102 Dissenyar una mica menys, i estil una mica menys que això. 281 00:12:54,102 --> 00:12:56,060 Però cal tenir en estil mente-- és potser la més fàcil 282 00:12:56,060 --> 00:12:58,890 d'aquests a mossegar segons la guia d'estil. 283 00:12:58,890 --> 00:13:01,580 >> I ara, una més greu observar en l'honestedat acadèmica. 284 00:13:01,580 --> 00:13:05,000 CS50 té la trista distinció de sent el major productor de la Junta Ad 285 00:13:05,000 --> 00:13:07,330 casos gairebé tots els anys històricament. 286 00:13:07,330 --> 00:13:11,012 Això no es deu a que els estudiants fan trampa en CS50 més que qualsevol altra classe, 287 00:13:11,012 --> 00:13:13,720 però a causa de la naturalesa de l'obra, el fet que és electrònic, 288 00:13:13,720 --> 00:13:16,636 el fet que el busquem, i el fet que som els informàtics, 289 00:13:16,636 --> 00:13:20,570 Puc dir que estem per desgràcia molt bo en el detecti. 290 00:13:20,570 --> 00:13:22,710 >> Així que què significa això en termes reals? 291 00:13:22,710 --> 00:13:24,820 Així que, pel pla d'estudis, la filosofia del curs 292 00:13:24,820 --> 00:13:28,090 realment no es redueixen a ser raonable. 293 00:13:28,090 --> 00:13:31,684 Hi ha aquesta línia entre fent el treball d'un pel seu compte 294 00:13:31,684 --> 00:13:34,100 i aconseguir una mica de ajuda raonable d'un amic, 295 00:13:34,100 --> 00:13:38,020 i de plànol fer aquest treball per al seu amic, o enviant-li el seu codi 296 00:13:38,020 --> 00:13:41,080 de manera que ell o ella pot simplement prendre o demanar prestat a la dreta. 297 00:13:41,080 --> 00:13:43,580 I que creua la línia que dibuixen a la classe. 298 00:13:43,580 --> 00:13:45,410 >> Vegi, el pla d'estudis en última instància, per a les línies 299 00:13:45,410 --> 00:13:48,209 que dibuixem com raonable i el comportament irracional, 300 00:13:48,209 --> 00:13:50,000 però el que realment fa bullir baix a l'essència 301 00:13:50,000 --> 00:13:53,980 del seu treball que necessiten ser el teu propi al final. 302 00:13:53,980 --> 00:13:56,230 Ara, amb això dit, hi ha una heurística. 303 00:13:56,230 --> 00:13:58,980 Perquè com vostè podria imagine-- de les hores d'oficina i els efectes visuals 304 00:13:58,980 --> 00:14:01,060 i els vídeos que hem mostra CS50 així far-- 305 00:14:01,060 --> 00:14:04,530 és de fet la intenció de ser el més col · laborativa i com a cooperativa i com socials 306 00:14:04,530 --> 00:14:06,450 com sigui possible. 307 00:14:06,450 --> 00:14:08,570 Com col · laboratiu com és rigorós. 308 00:14:08,570 --> 00:14:11,314 >> Però amb això, va dir, l'heurística, com es veurà en el programa d'estudis, 309 00:14:11,314 --> 00:14:12,980 és que quan vostè està tenint algun problema. 310 00:14:12,980 --> 00:14:16,470 Vostè té alguns errors en el codi que no pot resoldre, és raonable per a vostè 311 00:14:16,470 --> 00:14:18,039 per mostrar el seu codi a una altra persona. 312 00:14:18,039 --> 00:14:21,080 Un amic fins a la classe, un amic assegut al teu costat en hores d'oficina, 313 00:14:21,080 --> 00:14:22,680 o un membre del personal. 314 00:14:22,680 --> 00:14:25,810 Però ells no poden mostrar el seu codi per a vostè. 315 00:14:25,810 --> 00:14:27,710 >> En altres paraules, una respondre a la seva pregunta-- 316 00:14:27,710 --> 00:14:29,940 Necessito ajuda-- no oh, aquí està el meu codi. 317 00:14:29,940 --> 00:14:32,440 Fes una ullada a això i deduir-ne el que vulguis. 318 00:14:32,440 --> 00:14:34,580 Bé, és clar, no hi ha una manera clara al joc 319 00:14:34,580 --> 00:14:37,760 aquest sistema pel que et vaig a mostrar el meu codi abans de tenir una pregunta. 320 00:14:37,760 --> 00:14:40,150 Vostè em mostra la meva seu codi abans de sotmetre a una pregunta. 321 00:14:40,150 --> 00:14:45,870 Però veure el programa de nou per al detalls més fins de on aquesta línia és. 322 00:14:45,870 --> 00:14:50,606 >> Només per pintar ara la imatge i compartir el més transparent possible 323 00:14:50,606 --> 00:14:53,480 on som en els darrers anys, aquest és el nombre de casos de la Junta Ad 324 00:14:53,480 --> 00:14:56,260 CS50 que ha tingut més els últims set anys. 325 00:14:56,260 --> 00:14:58,717 Amb 14 casos aquest últim tardor. 326 00:14:58,717 --> 00:15:01,300 Pel que fa als estudiants involucrats, era 20 alguns estudiants imparells 327 00:15:01,300 --> 00:15:02,490 a la tardor passat. 328 00:15:02,490 --> 00:15:05,670 Hi va haver un màxim de 33 estudiants fa alguns anys. 329 00:15:05,670 --> 00:15:08,830 Molts dels quals són per desgràcia ja no és aquí al campus. 330 00:15:08,830 --> 00:15:13,100 >> Els estudiants que participen com a percentatge de la classe ha oscil · lat històricament entre el 0% 331 00:15:13,100 --> 00:15:17,300 al 5,3%, que és només per dir això és cada any un repte. 332 00:15:17,300 --> 00:15:20,390 I cap a aquest fi, el que volem fer és transmetre una 333 00:15:20,390 --> 00:15:24,310 que dd-- només FYI-- comparar l' un ésser justos amb aquells estudiants que 334 00:15:24,310 --> 00:15:26,520 seguint la línia en conseqüència. 335 00:15:26,520 --> 00:15:29,620 Fem comparar tots els actuals presentacions en contra de totes les missions anteriors 336 00:15:29,620 --> 00:15:30,840 des del passat molts anys. 337 00:15:30,840 --> 00:15:33,620 >> Sabem també com Google voltant i trobar repositoris de codi 338 00:15:33,620 --> 00:15:36,360 , Fòrums de discussió en línia , Llocs de treball en línia en línia. 339 00:15:36,360 --> 00:15:41,580 Si un estudiant es troba, podem sens dubte trobarà tot el que lamentablement fem. 340 00:15:41,580 --> 00:15:45,330 Així que el que vostè veurà en el pla d'estudis encara que és aquesta clàusula tot. 341 00:15:45,330 --> 00:15:47,500 Jo sap apreciar, i tots ens ha 342 00:15:47,500 --> 00:15:50,870 personal d'haver fet el curs com això, o aquesta en si mateix un amb el temps, 343 00:15:50,870 --> 00:15:53,997 sens dubte saben el que se sent quan la vida s'interposa en el camí quan es té 344 00:15:53,997 --> 00:15:56,080 alguna nit tarda deadline-- no només en aquesta classe, 345 00:15:56,080 --> 00:15:58,660 però altre-- quan estàs completament esgotat, estressat, 346 00:15:58,660 --> 00:16:00,659 tenir un nombre excessiu d'altres coses a fer. 347 00:16:00,659 --> 00:16:03,660 Va a fer que en algun moment de la vida sense dubte un mal, potser tard 348 00:16:03,660 --> 00:16:04,620 decisió nit. 349 00:16:04,620 --> 00:16:06,520 >> Així que pel pla d'estudis, hi ha aquesta clàusula, 350 00:16:06,520 --> 00:16:10,629 de manera que si dins de les 72 hores de fer alguna mala decisió, vostè és propietari fins que 351 00:16:10,629 --> 00:16:12,670 i arribar a mi i un dels caps del curs 352 00:16:12,670 --> 00:16:14,300 i tindrem una conversa. 353 00:16:14,300 --> 00:16:16,220 Nosaltres ens encarregarem de les coses internament amb l'esperança 354 00:16:16,220 --> 00:16:18,770 que es converteixi en més d'un moment d'ensenyament o lliçó de vida, 355 00:16:18,770 --> 00:16:22,120 i no alguna cosa amb ramificacions particularment dràstiques 356 00:16:22,120 --> 00:16:24,570 com es pot veure en aquests gràfics aquí. 357 00:16:24,570 --> 00:16:26,540 >> Així que això és un to molt seriós. 358 00:16:26,540 --> 00:16:29,960 Fem una pausa per a uns pocs segons per trencar la tensió. 359 00:16:29,960 --> 00:16:34,442 >> [REPRODUCCIÓ DE MÚSICA] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. Malan: Molt bé, així que com és que per a un segue? 362 00:17:20,250 --> 00:17:22,059 Per als temes principals de l'actualitat. 363 00:17:22,059 --> 00:17:23,859 La primera de les quals és l'abstracció. 364 00:17:23,859 --> 00:17:26,900 Un altre dels que serà la representació de les dades, que francament 365 00:17:26,900 --> 00:17:31,640 és una manera molt sec de dir com podem anar sobre la solució de problemes i el pensament 366 00:17:31,640 --> 00:17:33,250 sobre la resolució de problemes? 367 00:17:33,250 --> 00:17:37,285 Així que has vist en Scratch, i vostè té vist potser ja en pset1 amb C 368 00:17:37,285 --> 00:17:39,930 que no només es pot utilitzar funcions, com printf, 369 00:17:39,930 --> 00:17:42,770 que altres persones en any passat va escriure per a tu. 370 00:17:42,770 --> 00:17:45,340 També podeu escriure les seves pròpies funcions. 371 00:17:45,340 --> 00:17:48,440 >> I encara que potser no tingui fet això en C, i francament en pset1 372 00:17:48,440 --> 00:17:51,866 vostè realment no necessita per escriure el seu pròpia funció perquè el problema-- 373 00:17:51,866 --> 00:17:53,990 encara que tal vegada d'enormes proporcions en primer glance-- veuràs 374 00:17:53,990 --> 00:17:57,910 en última instància, pot ser resolt amb no tots els que moltes línies de codi. 375 00:17:57,910 --> 00:18:01,140 Però dit això, en termes d'escriure la seva pròpia funció, 376 00:18:01,140 --> 00:18:03,570 adonar-se que C dóna que aquesta capacitat. 377 00:18:03,570 --> 00:18:06,940 >> Jo vaig a anar en el codi font actual, que ja està disponible en línia, 378 00:18:06,940 --> 00:18:10,900 i jo vaig a seguir endavant i obert un programa que es diu funció 0.C, 379 00:18:10,900 --> 00:18:14,620 i en funció de zero anem a veure algunes coses. 380 00:18:14,620 --> 00:18:19,160 En les primeres línies 18 a través de 23 és la meva funció principal. 381 00:18:19,160 --> 00:18:22,414 I ara que estem començant a llegir codi que no estem escrivint sobre la marxa, 382 00:18:22,414 --> 00:18:25,080 sinó que he escrit amb antelació o que en un conjunt de problemes 383 00:18:25,080 --> 00:18:27,910 podria rebre amb ha escrit amb antelació. 384 00:18:27,910 --> 00:18:30,040 Una bona manera de començar lectura de codi d'una altra persona 385 00:18:30,040 --> 00:18:31,400 és buscar la funció principal. 386 00:18:31,400 --> 00:18:34,420 Esbrinar on aquesta entrada punt és d'executar el programa, 387 00:18:34,420 --> 00:18:36,580 i després seguir lògicament a partir d'aquí. 388 00:18:36,580 --> 00:18:40,190 >> Pel que aquest programa aparentment impressions el seu nom seguit de dos punts. 389 00:18:40,190 --> 00:18:42,490 A continuació, utilitzem GetString de la biblioteca CS50 390 00:18:42,490 --> 00:18:46,050 per obtenir una cadena, o una paraula o frase des de l'usuari en el teclat. 391 00:18:46,050 --> 00:18:48,390 I després hi ha aquest El printNombre aquí--. 392 00:18:48,390 --> 00:18:51,420 >> Ara no és un printNombre funció que ve amb C. 393 00:18:51,420 --> 00:18:52,970 No està en io.h. estàndard 394 00:18:52,970 --> 00:18:55,570 No està en CS50.h. 395 00:18:55,570 --> 00:18:57,880 És més bé en el mateix arxiu. 396 00:18:57,880 --> 00:19:01,000 Avís si em desplaço cap avall unes línies bit-- 25 a 27-- 397 00:19:01,000 --> 00:19:05,330 és només una manera bonica de comentar el seu codi mitjançant les estrelles i les barres. 398 00:19:05,330 --> 00:19:07,320 Aquesta és una de diverses línies comentari, i això és només 399 00:19:07,320 --> 00:19:10,570 la meva descripció en blau de el que fa aquesta funció. 400 00:19:10,570 --> 00:19:14,530 >> A causa de que en les línies 28 a 31, He escrit una funció super simple 401 00:19:14,530 --> 00:19:16,280 el nom és printNombre. 402 00:19:16,280 --> 00:19:19,560 Es necessita quants arguments li diries? 403 00:19:19,560 --> 00:19:25,120 Així que un argument-- perquè hi ha una argument que apareix dins dels parèntesis. 404 00:19:25,120 --> 00:19:27,000 El tipus de la qual és String. 405 00:19:27,000 --> 00:19:30,240 Què vol dir printNombre és com aquesta caixa de negre 406 00:19:30,240 --> 00:19:32,910 o funció que pren com a entrada una cadena. 407 00:19:32,910 --> 00:19:35,730 >> I el nom d'aquesta cadena convenientment estarà Nom. 408 00:19:35,730 --> 00:19:37,840 No S, no N, però el seu nom. 409 00:19:37,840 --> 00:19:41,090 Així que, què fa printNombre? 410 00:19:41,090 --> 00:19:42,210 És agradable simple. 411 00:19:42,210 --> 00:19:45,390 De la mateixa manera que una línia de codi per el printf, però pel que sembla 412 00:19:45,390 --> 00:19:47,950 imprimeix "Hola," fulano de tal. 413 00:19:47,950 --> 00:19:50,070 Quan el tal i tal ve de l'argument. 414 00:19:50,070 --> 00:19:52,300 >> Ara bé, això no és una gran innovació aquí. 415 00:19:52,300 --> 00:19:56,710 Realment, m'he pres un programa que pogués haver estat escrita amb una línia de codi 416 00:19:56,710 --> 00:20:00,190 posant això aquí, i ho va canviar a alguna cosa 417 00:20:00,190 --> 00:20:04,920 que involucra a uns sis o set anys més o menys línies de codi tot el camí fins aquí. 418 00:20:04,920 --> 00:20:08,190 >> Però és la pràctica d'una principi conegut com a abstracció. 419 00:20:08,190 --> 00:20:12,550 Tipus d'encapsular dins d'un nou funció que té un nom, i millor 420 00:20:12,550 --> 00:20:14,590 però aquest nom literalment diu el que fa. 421 00:20:14,590 --> 00:20:16,880 Vull dir printf-- això no és particularment descriptiva. 422 00:20:16,880 --> 00:20:18,932 Si vull crear un peça del trencaclosques, o si 423 00:20:18,932 --> 00:20:21,140 que vulgueu crear una funció que imprimeix el nom d'algú, 424 00:20:21,140 --> 00:20:23,230 la bellesa de fer això és que el que pugui realment 425 00:20:23,230 --> 00:20:27,170 que la funció de donar un nom que descriu el que fa. 426 00:20:27,170 --> 00:20:29,844 >> Ara que necessita en una entrada que He trucat arbitràriament nom, 427 00:20:29,844 --> 00:20:32,760 però això també és meravellosament descriptiu en lloc de ser una mica més 428 00:20:32,760 --> 00:20:36,140 genèric com S. I buit, per ara, només significa 429 00:20:36,140 --> 00:20:38,330 que aquesta funció no em tornar res. 430 00:20:38,330 --> 00:20:41,127 No és com que GetString literalment em lliura volta una cadena 431 00:20:41,127 --> 00:20:43,960 com ho vam fer amb els trossos de paper amb els seus companys de classe la setmana passada, 432 00:20:43,960 --> 00:20:45,990 sinó més aviat que només té un efecte secundari. 433 00:20:45,990 --> 00:20:48,080 S'imprimeix alguna cosa a la pantalla. 434 00:20:48,080 --> 00:20:53,880 >> Així que al final del dia, si jo no fer la funció-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 veurem que demana el meu nom. 436 00:20:55,450 --> 00:20:58,150 Escric David, i els tipus al meu nom. 437 00:20:58,150 --> 00:21:01,080 Si ho faig de nou amb Rob, que dirà "Hola, Rob." 438 00:21:01,080 --> 00:21:04,280 Així que una idea simple, però potser extrapolar d'aquesta mentalment 439 00:21:04,280 --> 00:21:06,750 que a mesura que els seus programes obtenen una mica més complicat, 440 00:21:06,750 --> 00:21:10,290 i desitja escriure un tros de codi i trucades que code-- invoke 441 00:21:10,290 --> 00:21:13,270 que code-- per alguns descriptiva nomenar com printNombre, 442 00:21:13,270 --> 00:21:15,600 C si ens permetre aquesta capacitat. 443 00:21:15,600 --> 00:21:17,660 >> Hi ha un altre exemple simple. 444 00:21:17,660 --> 00:21:22,940 Per exemple, si obro una presentar de trucada avui return.c, 445 00:21:22,940 --> 00:21:24,270 compte del que he fet aquí. 446 00:21:24,270 --> 00:21:26,330 La major part d'aquesta funció principal és printf. 447 00:21:26,330 --> 00:21:30,360 La primera vegada que inicialitzar arbitràriament 1 variable anomenada x al número 2. 448 00:21:30,360 --> 00:21:34,110 Després imprimeixo "x és ara % I "passar en el valor de x. 449 00:21:34,110 --> 00:21:35,500 Així que només estic dient el que és. 450 00:21:35,500 --> 00:21:37,208 >> Ara estic sol amb audàcia afirmant amb printf. 451 00:21:37,208 --> 00:21:42,050 Estic cubicació aquest valor x, i estic fer-ho trucant a una funció 452 00:21:42,050 --> 00:21:45,590 anomenat pas del cub en x com a argument, 453 00:21:45,590 --> 00:21:49,300 i després guardar la sortida en la pròpia variable, x. 454 00:21:49,300 --> 00:21:51,340 Així que estic colpejant fortament el valor de x. 455 00:21:51,340 --> 00:21:53,380 Estic anul · lant la valor de x amb el 456 00:21:53,380 --> 00:21:56,510 el resultat de cridar aquesta funció és cub. 457 00:21:56,510 --> 00:21:59,530 I després em imprimeixo alguns material esponjós aquí dient el que vaig fer. 458 00:21:59,530 --> 00:22:01,600 >> Llavors, què és, llavors, el cub? 459 00:22:01,600 --> 00:22:03,510 Noti el que és fonamentalment diferent aquí. 460 00:22:03,510 --> 00:22:05,540 He donat la funció un nom com abans. 461 00:22:05,540 --> 00:22:08,270 He especificat un nom per a una discussió. 462 00:22:08,270 --> 00:22:11,650 Aquesta vegada es diu n en lloc del nom, però jo podria dir-el que vulgui. 463 00:22:11,650 --> 00:22:12,650 Però això és diferent. 464 00:22:12,650 --> 00:22:14,080 Aquesta cosa de l'esquerra. 465 00:22:14,080 --> 00:22:16,290 Anteriorment, era el que la paraula clau? 466 00:22:16,290 --> 00:22:16,870 Nois. 467 00:22:16,870 --> 00:22:18,580 Ara és òbviament int. 468 00:22:18,580 --> 00:22:20,630 >> Llavors, què tal la treu? 469 00:22:20,630 --> 00:22:24,090 Mentre que significa void mena de res, i aquest era el cas. 470 00:22:24,090 --> 00:22:25,970 PrintNombre res va tornar. 471 00:22:25,970 --> 00:22:27,942 Es va fer alguna cosa, però no em tornaran 472 00:22:27,942 --> 00:22:30,650 cosa que podria posar en el banda esquerra d'un signe igual 473 00:22:30,650 --> 00:22:32,460 com ho he fet aquí a la línia 22. 474 00:22:32,460 --> 00:22:36,780 >> Així que si dic que a la línia 30, Què és això, probablement, el que implica 475 00:22:36,780 --> 00:22:38,610 sobre el que el cub té per a mi? 476 00:22:38,610 --> 00:22:41,110 Sí? 477 00:22:41,110 --> 00:22:42,310 Es retorna un enter. 478 00:22:42,310 --> 00:22:44,590 Així que em dóna l'esquena, per exemple, un tros de paper 479 00:22:44,590 --> 00:22:46,580 sobre el qual ha escrit la resposta. 480 00:22:46,580 --> 00:22:50,130 2 cubs, o 3 glaçons, o 4 cubed-- vaig passar, 481 00:22:50,130 --> 00:22:51,540 i com puc implementar això? 482 00:22:51,540 --> 00:22:54,810 Bé, acaba de n vegades n vegades n és com pot ser que cubicar un valor. 483 00:22:54,810 --> 00:22:57,110 Així que de nou, super simple idea, però demostratiu 484 00:22:57,110 --> 00:23:00,100 ara com podem escriure funcions que en realitat ens va fer tornar 485 00:23:00,100 --> 00:23:02,380 valors que puguin ser del seu interès. 486 00:23:02,380 --> 00:23:05,740 >> Vegem un últim exemple aquí es diu funció d'un. 487 00:23:05,740 --> 00:23:08,530 En aquest exemple, s'inicia per obtenir més convincent. 488 00:23:08,530 --> 00:23:12,400 Així, en funció d'un, aquesta avís program-- última instància 489 00:23:12,400 --> 00:23:14,920 crida a una funció anomenada GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt no és un funció a la biblioteca CS50, 491 00:23:17,800 --> 00:23:20,400 però vam decidir que li agradaria que existeixi. 492 00:23:20,400 --> 00:23:24,550 >> Així que si ens desplacem cap avall més endavant a l'arxiu, Noto com em vaig anar sobre la implementació 493 00:23:24,550 --> 00:23:26,560 aconseguir int positiu, i jo diuen que és més convincent 494 00:23:26,560 --> 00:23:28,992 perquè aquest és un decent nombre de línies de codi. 495 00:23:28,992 --> 00:23:30,700 No és només un ximple programet joguina. 496 00:23:30,700 --> 00:23:33,870 En realitat té una mica de comprovació d'errors i fer alguna cosa més útil. 497 00:23:33,870 --> 00:23:38,470 >> Així que si no has vist el tutorial vídeos que hem incrustat en pset1, 498 00:23:38,470 --> 00:23:42,350 sap que aquest és un tipus de bucle en C, similar en esperit 499 00:23:42,350 --> 00:23:44,270 per al tipus de coses de Scratch pot fer. 500 00:23:44,270 --> 00:23:46,320 I diu fer-ho. 501 00:23:46,320 --> 00:23:47,500 Imprimiu això. 502 00:23:47,500 --> 00:23:51,860 Després seguir endavant i obtenir N-- aconseguir un int i emmagatzemar-lo en n, 503 00:23:51,860 --> 00:23:55,760 i seguir fent això una i altra vegada i de nou, sempre i quan n és menor que un. 504 00:23:55,760 --> 00:23:58,720 >> Així que n serà inferior a un només si l'humà no està cooperant. 505 00:23:58,720 --> 00:24:01,980 Si ell o ella està escrivint en 0 o -1 o -50, 506 00:24:01,980 --> 00:24:04,790 aquest bucle es mantindrà l'execució d'una i altra vegada. 507 00:24:04,790 --> 00:24:07,549 I en última instància, noto, em retorni el valor. 508 00:24:07,549 --> 00:24:09,590 Així que ara tenim una funció això hagués estat agradable 509 00:24:09,590 --> 00:24:14,040 si CS50 s'implementaria en CS50.h i CS50.c per a vostè, 510 00:24:14,040 --> 00:24:16,520 però aquí podem ara implementar això nosaltres mateixos. 511 00:24:16,520 --> 00:24:19,230 >> No obstant això, dues observacions sobre alguns detalls clau. 512 00:24:19,230 --> 00:24:24,390 Un-- per què em declaro int n, creu que, en la línia 29 513 00:24:24,390 --> 00:24:27,139 en comptes de fer això aquí, que és 514 00:24:27,139 --> 00:24:28,930 més consistent amb el que vam fer la setmana passada? 515 00:24:28,930 --> 00:24:29,430 Sí? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Un bon pensament. 518 00:24:35,110 --> 00:24:37,080 Així que si haguéssim de posar aquí, és com si ens 519 00:24:37,080 --> 00:24:39,110 mantenir a declarar una i altra vegada. 520 00:24:39,110 --> 00:24:42,000 Això en si mateix és no és problemàtica, per se, 521 00:24:42,000 --> 00:24:43,940 perquè només tenim el valor d'una vegada i després 522 00:24:43,940 --> 00:24:45,330 aconseguirem un de nou de totes maneres. 523 00:24:45,330 --> 00:24:45,940 Però un bon pensament. 524 00:24:45,940 --> 00:24:46,440 Sí? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Tanca. 527 00:24:53,330 --> 00:24:59,030 Així que ja he declarat en n línia 29 fora del bucle, 528 00:24:59,030 --> 00:25:01,390 accessible en tot tota aquesta funció. 529 00:25:01,390 --> 00:25:05,400 Altres no funciona perquè n és encara dins d'aquests arrissat 530 00:25:05,400 --> 00:25:06,470 suports aquí. 531 00:25:06,470 --> 00:25:07,940 Tan-- segur. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Exactament. 534 00:25:12,940 --> 00:25:14,356 Així que això és encara més al punt. 535 00:25:14,356 --> 00:25:18,600 Si en lloc declarem n dret aquí a la línia 32, 536 00:25:18,600 --> 00:25:22,340 és problemàtic perquè conjectura on més que necessito per accedir-hi? 537 00:25:22,340 --> 00:25:25,620 En la línia 34, i la senzilla regla d'or és 538 00:25:25,620 --> 00:25:30,060 que només es pot utilitzar una variable dins dels més recents claus 539 00:25:30,060 --> 00:25:31,420 en què es va declarar. 540 00:25:31,420 --> 00:25:35,230 >> Desafortunadament, la línia 34 és una línia massa tard, 541 00:25:35,230 --> 00:25:38,560 perquè jo ja he tancat la clau de tancament en la línia 33 542 00:25:38,560 --> 00:25:41,220 que correspon a la claudàtor en la línia 30. 543 00:25:41,220 --> 00:25:44,180 I que aquesta és una manera de dir que aquesta variable int té com abast, 544 00:25:44,180 --> 00:25:46,970 per dir-ho, a dins d'aquestes claus. 545 00:25:46,970 --> 00:25:48,910 Simplement no existeix fora d'ells. 546 00:25:48,910 --> 00:25:51,580 >> Així que de fet, si faig això malament, em deixa guardar el codi 547 00:25:51,580 --> 00:25:53,530 ja que és-- incorrectament escrita. 548 00:25:53,530 --> 00:25:57,990 Deixin-me seguir endavant i fer-ho fer funció-1, i l'error notice--. 549 00:25:57,990 --> 00:26:03,502 L'ús d'identificador no declarat n en la línia 35, que està just aquí. 550 00:26:03,502 --> 00:26:05,210 I si ens desplacem fins a A més, un altre. 551 00:26:05,210 --> 00:26:08,750 L'ús de no declarats identificador n en la línia 34. 552 00:26:08,750 --> 00:26:11,200 >> Així el compilador, Clang, és de notar que només 553 00:26:11,200 --> 00:26:13,720 no hi ha tot i que clarament que hi és visualment. 554 00:26:13,720 --> 00:26:16,090 Així que una solució simple està declarant allà. 555 00:26:16,090 --> 00:26:18,790 >> Ara vaig a desplaçar-me a la part superior de l'arxiu. 556 00:26:18,790 --> 00:26:21,080 El que salta a la vista com ser una mica diferent 557 00:26:21,080 --> 00:26:23,070 de les coses que ens espera a la setmana passada? 558 00:26:23,070 --> 00:26:26,990 No només no tinc nom, no només les fan Tinc alguns aguts inclou sobre de la tapa, 559 00:26:26,990 --> 00:26:29,340 Tinc alguna cosa que em trucar a un prototip. 560 00:26:29,340 --> 00:26:36,100 Ara que sembla terriblement similar al que que acabem de veure fa un moment a la línia 27. 561 00:26:36,100 --> 00:26:39,230 >> Així que anem a deduir a partir d'una diferent missatge d'error pel que he fet això. 562 00:26:39,230 --> 00:26:42,050 Déjame anar per davant i eliminar aquestes línies existeixen. 563 00:26:42,050 --> 00:26:44,240 I així, no sabem res de prototip. 564 00:26:44,240 --> 00:26:45,430 Remake aquest fitxer. 565 00:26:45,430 --> 00:26:46,890 Fer una funció. 566 00:26:46,890 --> 00:26:48,090 I ara, maleïda sigui, quatre errors. 567 00:26:48,090 --> 00:26:50,220 Anem a desplaçar-se fins la primera. 568 00:26:50,220 --> 00:26:55,070 >> Declaració implícita de la funció aconseguir int positiu és vàlid en C99. 569 00:26:55,070 --> 00:26:57,780 C99 només significa el 1999 versió del llenguatge 570 00:26:57,780 --> 00:26:59,710 C, que és el que estem fent servir de fet. 571 00:26:59,710 --> 00:27:01,050 Així que què vol dir això? 572 00:27:01,050 --> 00:27:05,250 Bé C-- i més concretament C compilers-- són programes bastant ximples. 573 00:27:05,250 --> 00:27:07,420 Només saben el que has els va dir, i això és 574 00:27:07,420 --> 00:27:08,960 realitat temàtica de la setmana passada. 575 00:27:08,960 --> 00:27:12,910 >> El problema és que si em vaig sobre la implementació de nom aquí, 576 00:27:12,910 --> 00:27:17,640 i que jo anomeno una funció anomenada GetPositiveInt aquí a la línia 20, 577 00:27:17,640 --> 00:27:22,520 que la funció fa tècnicament no existint fins que el compilador veu la línia 27. 578 00:27:22,520 --> 00:27:25,450 Desafortunadament, el compilador és fer les coses amunt, avall, esquerra, dreta, 579 00:27:25,450 --> 00:27:29,580 perquè no ha vist la aplicació de GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 però veu que tractar per usar-lo aquí, 581 00:27:32,400 --> 00:27:35,810 que només va a bail-- cridés que amb un error potser mensaje-- 582 00:27:35,810 --> 00:27:38,440 críptic, i en realitat no compilar l'arxiu. 583 00:27:38,440 --> 00:27:41,940 >> Així que una trucada prototip fins aquí és certament redundant. 584 00:27:41,940 --> 00:27:47,870 Literalment, em vaig baixar aquí i he copiat i enganxat això, i ho poso aquí. 585 00:27:47,870 --> 00:27:51,020 Buit seria més adequat, així que anem a literalment, copieu i enganxeu aquest cop. 586 00:27:51,020 --> 00:27:52,854 Jo, literalment, vaig copiar i vaig enganxar. 587 00:27:52,854 --> 00:27:54,270 Realment només com com una molla de pa. 588 00:27:54,270 --> 00:27:56,260 >> Una petita pista per al compilador. 589 00:27:56,260 --> 00:27:58,860 No sé el que això fa encara, però estic prometent que 590 00:27:58,860 --> 00:28:00,260 que va a existir eventualment. 591 00:28:00,260 --> 00:28:04,010 I és per això que aquest line-- a línia 16-- acaba amb un punt i coma. 592 00:28:04,010 --> 00:28:05,486 És redundant per disseny. 593 00:28:05,486 --> 00:28:05,986 Sí? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Si no vincula la seva biblioteca a ell-- oh, bona pregunta. 596 00:28:14,360 --> 00:28:17,350 De Sharp inclou inclusions d'arxius de capçalera. 597 00:28:17,350 --> 00:28:20,040 Necessitat de ser-- ha gairebé sempre a la part superior 598 00:28:20,040 --> 00:28:23,270 l'arxiu per a un similar-- per exactament la mateixa raó, si. 599 00:28:23,270 --> 00:28:26,430 A causa que en la norma io.h és literalment una línia 600 00:28:26,430 --> 00:28:30,560 com això, però amb la paraula printf, i amb els seus arguments i el seu tipus de retorn. 601 00:28:30,560 --> 00:28:33,310 I així, fent aguda inclouen fins aquí, el que estàs fent, literalment, 602 00:28:33,310 --> 00:28:36,380 està copiant i enganxant el contingut d'una altra persona va escriure sobre de la tapa. 603 00:28:36,380 --> 00:28:39,660 D'aquesta manera cluing seu codi en la fet que existeixen aquestes funcions. 604 00:28:39,660 --> 00:28:40,160 Sí? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolutament. 607 00:28:48,260 --> 00:28:51,690 Així que un molt intel · ligent i correcta solució seria, ¿saps què? 608 00:28:51,690 --> 00:28:53,760 No sé el que és un prototip és, però sé 609 00:28:53,760 --> 00:28:56,390 si entenc que C és només mut i replanteja dalt a baix. 610 00:28:56,390 --> 00:28:57,820 Bé anem a donar-li el que vol. 611 00:28:57,820 --> 00:29:01,650 Anem a tallar aquest codi, enganxa'l dalt part superior, i després prem principal baix. 612 00:29:01,650 --> 00:29:03,470 Això també resoldria el problema. 613 00:29:03,470 --> 00:29:07,409 >> Però pot molt fàcilment arribar a un escenari en el qual la necessitat de cridar a B, 614 00:29:07,409 --> 00:29:10,075 i potser B flama de nou a A. Aquest és una cosa que es diu recursivitat, 615 00:29:10,075 --> 00:29:11,370 i tornarem a això. 616 00:29:11,370 --> 00:29:13,911 I pot o no pot ser un bon cosa, però definitivament es pot 617 00:29:13,911 --> 00:29:15,110 trencar aquesta solució. 618 00:29:15,110 --> 00:29:17,690 >> I a més, ho faria reclamar estilísticament, 619 00:29:17,690 --> 00:29:20,760 especialment quan els seus programes convertit en aquest llarg i aquest llarg, 620 00:29:20,760 --> 00:29:23,064 és simplement molt pràctic posar principal a la part superior 621 00:29:23,064 --> 00:29:25,730 perquè és la cosa més programadors van a preocupar. 622 00:29:25,730 --> 00:29:28,150 I el que és una mica més net, es podria dir que, per fer-ho de la manera 623 00:29:28,150 --> 00:29:30,380 Originalment vaig fer amb un prototip fins i tot 624 00:29:30,380 --> 00:29:33,396 encara que es veu una mica redundant a primera vista. 625 00:29:33,396 --> 00:29:33,895 Sí? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Ho sentim, es pot dir que més fort? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Si canvia la ubicació de la l'execució i el prototip? 630 00:29:49,580 --> 00:29:51,270 Així que aquesta és una bona pregunta. 631 00:29:51,270 --> 00:29:53,780 Si torna a declarar aquesta avall aquí, anem a veure què passa. 632 00:29:53,780 --> 00:29:55,530 Així que si jo atribueixo aquí, que estàs dient. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, ho sento. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Fins i tot més fort. 638 00:30:04,011 --> 00:30:04,760 Ah, bona pregunta. 639 00:30:04,760 --> 00:30:05,860 Seria invalidar la funció? 640 00:30:05,860 --> 00:30:08,901 Ja saps, després de tots aquests anys, em mai han posat un prototip després. 641 00:30:08,901 --> 00:30:13,810 Així que farem que la funció-1 després de fer això. 642 00:30:13,810 --> 00:30:15,279 >> [Murmurant] 643 00:30:15,279 --> 00:30:16,320 DAVID J. Malan: Oh, espera. 644 00:30:16,320 --> 00:30:17,944 Encara hem de posar tot a sobre de la tapa. 645 00:30:17,944 --> 00:30:21,400 Així que farem això aquí, si estic entendre bé la seva pregunta. 646 00:30:21,400 --> 00:30:24,700 Estic posant tot, incloent el prototip anteriorment principal, 647 00:30:24,700 --> 00:30:28,180 però m'estic posant el prototip per sota de la implementació. 648 00:30:28,180 --> 00:30:33,190 >> Així que si faig un, m'estic posant tornar una error-- sense usar variable n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, no. 651 00:30:37,860 --> 00:30:38,360 Gràcies. 652 00:30:38,360 --> 00:30:39,430 Anem a veure, ens desfem d'aquest. 653 00:30:39,430 --> 00:30:41,304 Això és un error diferent, així que anem a ignorar això. 654 00:30:41,304 --> 00:30:43,910 Anem realment refer ràpidament això. 655 00:30:43,910 --> 00:30:48,100 >> OK, així que no argument de dades utilitzat pel format de cadena 656 00:30:48,100 --> 00:30:52,310 N-- oh, això és perquè Vaig canviar a aquests aquí. 657 00:30:52,310 --> 00:30:55,885 Molt bé, sabem quina és la resposta va A-- bé, aquí anem. 658 00:30:55,885 --> 00:31:00,560 Ah, gràcies pel positiu. 659 00:31:00,560 --> 00:31:03,430 Molt bé, vaig a arreglar aquest codi després de-- ignorar aquest error en particular 660 00:31:03,430 --> 00:31:08,300 ja que aquest fue-- funciona és la resposta. 661 00:31:08,300 --> 00:31:11,560 >> Així que no sobreescriu el que acabes de fer. 662 00:31:11,560 --> 00:31:14,800 Sospito que el compilador està escrit de tal manera 663 00:31:14,800 --> 00:31:18,420 que fa cas omís del seu prototip perquè el cos, per dir-ho, 664 00:31:18,420 --> 00:31:20,922 de la funció ja té han aplicat més amunt. 665 00:31:20,922 --> 00:31:23,380 Hauria de consultar realitat el manual del compilador 666 00:31:23,380 --> 00:31:26,171 per entendre si hi ha algun altre implicació, però a primera vista 667 00:31:26,171 --> 00:31:29,290 simplement per experimentar, provar, no sembla haver cap impacte. 668 00:31:29,290 --> 00:31:30,730 Bona pregunta. 669 00:31:30,730 --> 00:31:33,660 >> Així que seguirem endavant ara, movent-se lluny dels efectes secundaris que 670 00:31:33,660 --> 00:31:36,660 són funcions que fan una mena visualment a la pantalla amb printf, 671 00:31:36,660 --> 00:31:38,090 però no retornen un valor. 672 00:31:38,090 --> 00:31:41,550 I les funcions que tenen retorn valors com la que acabem de veure algunes de. 673 00:31:41,550 --> 00:31:45,350 Ja vam veure aquesta noció d'abast, i anem a veure una i altra vegada. 674 00:31:45,350 --> 00:31:47,210 Però, per ara, de nou, utilitzar la regla d'or 675 00:31:47,210 --> 00:31:51,410 que una variable només es pot utilitzar dins de la més recent inauguració 676 00:31:51,410 --> 00:31:54,350 i claus tancades com ens va veure en aquest exemple particular. 677 00:31:54,350 --> 00:31:56,910 >> I com vostè ha assenyalat, hi ha una ability-- 678 00:31:56,910 --> 00:32:00,040 que podria resoldre alguns d'aquests problemes posant una variable a nivell mundial 679 00:32:00,040 --> 00:32:01,290 a la part superior d'un arxiu. 680 00:32:01,290 --> 00:32:03,630 No obstant això, en gairebé tots els casos ens arrufar el nas a què, 681 00:32:03,630 --> 00:32:06,170 i de fet no fins i tot anar que la solució per ara. 682 00:32:06,170 --> 00:32:09,890 Així que per ara, el menjar per emportar és que variables tenen aquesta noció d'abast. 683 00:32:09,890 --> 00:32:13,430 >> Però ara anem a veure una altra via seca de realitat busca 684 00:32:13,430 --> 00:32:15,810 en alguns força interessant detalls d'implementació. 685 00:32:15,810 --> 00:32:17,810 Com podríem representar la informació. 686 00:32:17,810 --> 00:32:20,370 I ja trobem aquesta en la primera setmana de la classe. 687 00:32:20,370 --> 00:32:23,320 Pel que fa als binaris, i recordant a nosaltres mateixos decimal. 688 00:32:23,320 --> 00:32:28,310 >> Però recordar des de la setmana passada que C té diferents tipus de dades i raïms més, 689 00:32:28,310 --> 00:32:30,600 però els més útils per ara podria ser aquests. 690 00:32:30,600 --> 00:32:36,030 Un char, o caràcter, el que passa ser un byte, o de vuit bits en total. 691 00:32:36,030 --> 00:32:40,060 I això vol dir que la mida d'un char és un sol byte. 692 00:32:40,060 --> 00:32:45,370 Un byte és de vuit bits, de manera que això significa que podem representar el nombre de caràcters. 693 00:32:45,370 --> 00:32:47,320 Quantes lletres o símbols del teclat 694 00:32:47,320 --> 00:32:49,210 si tenim un byte o vuit bits. 695 00:32:49,210 --> 00:32:51,546 Penseu de nou a la setmana zero. 696 00:32:51,546 --> 00:32:53,420 Si vostè té vuit bits, quants valors totals 697 00:32:53,420 --> 00:32:55,503 pot representar amb patrons de zeros i uns? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Un-- més que això. 700 00:33:00,260 --> 00:33:03,490 Així que 256 totals si començar a comptar des de zero. 701 00:33:03,490 --> 00:33:07,120 Així que si tens 08:00 bits-- així que si ens tingut les nostres llums binaris fins aquí de nou, 702 00:33:07,120 --> 00:33:12,180 podríem convertir aquestes bombetes en i fora en qualsevol de 256 patrons únics. 703 00:33:12,180 --> 00:33:13,640 >> Ara bé, això és una mica problemàtic. 704 00:33:13,640 --> 00:33:16,857 No tant per Anglès i llengües romanços, però sens dubte 705 00:33:16,857 --> 00:33:19,190 quan s'introdueix, per exemple, les llengües asiàtiques, que 706 00:33:19,190 --> 00:33:22,580 tenen molt més símbols que com 26 lletres de l'alfabet. 707 00:33:22,580 --> 00:33:24,390 En realitat podríem necessitar més d'un byte. 708 00:33:24,390 --> 00:33:28,240 I per sort en els últims anys té la societat 709 00:33:28,240 --> 00:33:31,040 adoptat altres normes que utilitzen més d'un byte per cada càrrega. 710 00:33:31,040 --> 00:33:34,210 >> Però, per ara, en C, el valor per defecte és només un byte o vuit bits. 711 00:33:34,210 --> 00:33:38,195 Un sencer, per la seva banda, és de quatre bytes, també coneguda com 32 bits. 712 00:33:38,195 --> 00:33:41,320 El que significa que el que és el més gran possible nombre es pot representar amb un int 713 00:33:41,320 --> 00:33:41,820 pel que sembla? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Amb un bilió. 716 00:33:45,050 --> 00:33:46,760 Així que és de quatre mil milions més o menys. 717 00:33:46,760 --> 00:33:49,840 2 a la potència 32a, si ens assumir sense números negatius 718 00:33:49,840 --> 00:33:52,530 i només ha d'utilitzar tots positius els números, que és de quatre mil milions 719 00:33:52,530 --> 00:33:53,730 més o menys possibilitats. 720 00:33:53,730 --> 00:33:57,890 Un flotador, per la seva banda, és un tipus diferent de tipus de dades en C. És encara un nombre, 721 00:33:57,890 --> 00:33:58,990 però és un nombre real. 722 00:33:58,990 --> 00:34:00,660 Una cosa amb un punt decimal. 723 00:34:00,660 --> 00:34:03,000 I resulta que C també utilitza quatre bytes 724 00:34:03,000 --> 00:34:05,340 per representar els valors de coma flotant. 725 00:34:05,340 --> 00:34:09,420 >> Desafortunadament quants flotant valors dels punts hi ha al món? 726 00:34:09,420 --> 00:34:11,582 Quants nombres reals hi ha? 727 00:34:11,582 --> 00:34:13,540 Hi ha un infinit nombre, i per al cas 728 00:34:13,540 --> 00:34:15,164 hi ha un nombre infinit de nombres enters. 729 00:34:15,164 --> 00:34:18,070 Així que ja estem tipus de excavar un forat de nosaltres mateixos aquí. 730 00:34:18,070 --> 00:34:21,780 Per la qual cosa pel que sembla en computers-- a menys els programes escrits en C a ells-- 731 00:34:21,780 --> 00:34:24,110 només pot comptar tan alt com 4000000000 més o menys, 732 00:34:24,110 --> 00:34:26,260 i valors de punt flotant només pot semblar 733 00:34:26,260 --> 00:34:28,330 tenir certa quantitat finita de precisió. 734 00:34:28,330 --> 00:34:30,810 Només els tants dígits després seu punt decimal. 735 00:34:30,810 --> 00:34:32,822 >> Perquè, és clar, si només té 32 bits, 736 00:34:32,822 --> 00:34:36,030 No sé com anirem sobre representant numbers-- reals probablement 737 00:34:36,030 --> 00:34:37,409 amb diferents tipus de patrons. 738 00:34:37,409 --> 00:34:40,030 Però hi ha sens dubte, un finit nombre d'aquests patrons, 739 00:34:40,030 --> 00:34:41,830 així que aquí, també, això és problemàtic. 740 00:34:41,830 --> 00:34:43,710 >> Ara podem evitar el problema lleugerament. 741 00:34:43,710 --> 00:34:45,710 Si no utilitza un flotador, podria utilitzar un doble 742 00:34:45,710 --> 00:34:50,230 en C, que li dóna 8 bytes, que és la forma més patrons possibles de zeros 743 00:34:50,230 --> 00:34:50,730 i uns. 744 00:34:50,730 --> 00:34:55,199 Però segueix sent finit, que es va ser problemàtic si escrius programari 745 00:34:55,199 --> 00:34:57,670 per als gràfics o de fantasia fórmules matemàtiques. 746 00:34:57,670 --> 00:35:00,410 Així que en realitat podria desitjar a comptar fins més gran que això. 747 00:35:00,410 --> 00:35:05,640 A named-- llarg long-- estúpidament és també 8 bytes o 64 bits, 748 00:35:05,640 --> 00:35:10,260 i això és el doble de temps com un int, i és per a un valor enter llarg. 749 00:35:10,260 --> 00:35:15,655 >> Diversió fet-- si un int és de quatre bytes, Quant dura un temps en C normalment? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 També quatre bytes, però una llarg, llarg és de vuit bytes, 752 00:35:21,560 --> 00:35:23,050 i això és per raons històriques. 753 00:35:23,050 --> 00:35:26,450 >> Però el menjar per emportar ara és només que les dades té 754 00:35:26,450 --> 00:35:29,625 a ser representat en un computer-- que és un dispositiu físic amb l'electricitat, 755 00:35:29,625 --> 00:35:32,190 generalment està conduint aquests zeros i ones-- 756 00:35:32,190 --> 00:35:34,320 amb quantitats finites de precisió. 757 00:35:34,320 --> 00:35:35,620 Llavors, quin és el problema llavors? 758 00:35:35,620 --> 00:35:37,480 >> Bé, hi ha un problema de desbordament de sencers. 759 00:35:37,480 --> 00:35:39,780 No només en C, però en els ordinadors en general. 760 00:35:39,780 --> 00:35:42,590 Per exemple, si aquesta és un byte mereix una bit-- 761 00:35:42,590 --> 00:35:45,120 així que si això és vuit bit-- tot dels quals són el número u. 762 00:35:45,120 --> 00:35:47,300 Quin nombre és aquest que representa si assumim 763 00:35:47,300 --> 00:35:50,730 és tots els valors positius en binari? 764 00:35:50,730 --> 00:35:54,410 >> 255, i no és 256, perquè el zero és el nombre més baix. 765 00:35:54,410 --> 00:35:56,760 Així que 255 és el més alt un, però el problema 766 00:35:56,760 --> 00:36:00,330 se suposa que volia incrementar aquesta variable que 767 00:36:00,330 --> 00:36:04,030 s'utilitzen vuit bits en total si vull incrementar-lo. 768 00:36:04,030 --> 00:36:07,160 >> Doncs tan aviat com puc afegir un un a tots aquests, 769 00:36:07,160 --> 00:36:10,500 vostè potser pugui imaginar visually-- només com portar l'un fent servir decimals-- 770 00:36:10,500 --> 00:36:12,300 alguna cosa va a fluir cap a l'esquerra. 771 00:36:12,300 --> 00:36:15,590 I de fet, si afegeixo el nombre 1 a aquest, el que succeeix en el sistema binari 772 00:36:15,590 --> 00:36:17,670 és que es desborda de nou a zero. 773 00:36:17,670 --> 00:36:21,730 >> Així que si només no utilitzades: 1 int, però un sol byte per explicar nombres enters 774 00:36:21,730 --> 00:36:27,170 en un programa, per default-- tan aviat com sigui s'arriba a 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 ve després de 255, que probablement no ho és 776 00:36:32,710 --> 00:36:34,790 un usuari que va a esperar. 777 00:36:34,790 --> 00:36:39,620 >> Ara mentre que en punt flotant del món, vostè també té un problema similar. 778 00:36:39,620 --> 00:36:42,670 No tant amb la major number-- encara que això és encara un problema. 779 00:36:42,670 --> 00:36:45,360 Però amb la quantitat de precisió que pot representar. 780 00:36:45,360 --> 00:36:49,490 Així que donem una ullada a aquest exemple aquí també de code-- font d'avui 781 00:36:49,490 --> 00:36:52,070 surar-0.c. 782 00:36:52,070 --> 00:36:54,280 >> I noti que és un super senzill programa que 783 00:36:54,280 --> 00:36:56,580 aparentment haurien imprimir el que de valor? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Què s'aposta que això va a imprimir tot i que hi ha una mica de nova sintaxi 786 00:37:04,110 --> 00:37:05,540 aquí? 787 00:37:05,540 --> 00:37:06,700 Així que espero que 0,1. 788 00:37:06,700 --> 00:37:10,000 Així que l'equivalent d'un dècim perquè estic fent 1 dividit per 10. 789 00:37:10,000 --> 00:37:12,430 Estic emmagatzemant la resposta en una variable anomenada f. 790 00:37:12,430 --> 00:37:15,850 Aquesta variable és de tipus float, que és una paraula clau que acaba de proposar existia. 791 00:37:15,850 --> 00:37:18,910 >> No hem vist això abans, però això és una espècie d'una manera ordenada en printf 792 00:37:18,910 --> 00:37:22,110 per especificar el nombre de dígits que vull veure després d'un punt decimal. 793 00:37:22,110 --> 00:37:25,020 Així que aquesta notació només significa que aquí és un marcador de posició. 794 00:37:25,020 --> 00:37:27,900 És per una coma flotant valor, i oh, per cert, 795 00:37:27,900 --> 00:37:31,389 mostren amb el punt decimal amb un nombre després del punt decimal. 796 00:37:31,389 --> 00:37:33,180 Així que aquest és el nombre de dígits significatius, 797 00:37:33,180 --> 00:37:34,650 per així dir-ho, que és possible que vulgueu. 798 00:37:34,650 --> 00:37:40,450 >> Així que m'ho dius a mi anar endavant i fer fer surar-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 i pel que sembla 1 dividit per 10 és 0.0. 800 00:37:46,660 --> 00:37:47,760 Ara per què és això? 801 00:37:47,760 --> 00:37:51,380 >> Bé una vegada més, l'equip està prenent em literalment, i he escrit 1 802 00:37:51,380 --> 00:37:56,680 i he escrit 10, i prendre una conjectura el és el tipus de dades assumit per als dos 803 00:37:56,680 --> 00:37:58,440 valors? 804 00:37:58,440 --> 00:38:00,970 Un int, és tècnicament cosa una mica diferent. 805 00:38:00,970 --> 00:38:04,150 És normalment un llarg, però és en última instància, un valor integral. 806 00:38:04,150 --> 00:38:06,030 No és un valor de coma flotant. 807 00:38:06,030 --> 00:38:09,456 >> Què vol dir que si això és un enter i això és un int, 808 00:38:09,456 --> 00:38:11,830 el problema és que l'ordinador no té la capacitat 809 00:38:11,830 --> 00:38:13,680 per emmagatzemar fins a aquest punt decimal. 810 00:38:13,680 --> 00:38:16,430 Així que quan vostè fa 1 dividit per 10 que usen nombres enters 811 00:38:16,430 --> 00:38:20,950 tant per al numerador i el denominador, la resposta ha de ser 0,1. 812 00:38:20,950 --> 00:38:24,930 Però el computer-- perquè aquests són integers-- 813 00:38:24,930 --> 00:38:27,430 no sap què fer amb el 0,1. 814 00:38:27,430 --> 00:38:30,010 >> Llavors, què està fent amb claredat? 815 00:38:30,010 --> 00:38:33,120 És simplement llençar-la, i el que estic veient en última instància, 816 00:38:33,120 --> 00:38:38,830 0.0 és només perquè jo vaig insistir que printf mostrar un punt decimal. 817 00:38:38,830 --> 00:38:41,740 Però el problema és que si vostè dividir un enter per un sencer, 818 00:38:41,740 --> 00:38:44,347 vostè get-- per definició d'C-- un enter. 819 00:38:44,347 --> 00:38:46,680 I no farà alguna cosa agradable i còmoda 820 00:38:46,680 --> 00:38:49,040 com al voltant d'ella fins al més proper amunt o cap avall. 821 00:38:49,040 --> 00:38:51,860 Es va a truncar sobretot després de l'decimal. 822 00:38:51,860 --> 00:38:54,030 >> Així que només intuïtivament, el que és probablement una solució? 823 00:38:54,030 --> 00:38:55,351 Quina és la solució més simple aquí? 824 00:38:55,351 --> 00:38:55,850 Sí? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Exactament. 827 00:39:01,100 --> 00:39:04,200 Per què no simplement tractem aquests com valors de coma flotant efectivament 828 00:39:04,200 --> 00:39:05,860 convertint-los en carrosses o dobles. 829 00:39:05,860 --> 00:39:10,500 I ara si ho faig fer carrosses-0, o si va compilar carrosses-1, 830 00:39:10,500 --> 00:39:12,570 que és idèntica a la qual cosa només es va proposar. 831 00:39:12,570 --> 00:39:16,400 I ara que faig carrosses-0, ara em surt la meva 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Ara bé, això és increïble. 833 00:39:17,234 --> 00:39:19,441 Però ara em faré cosa una mica diferent. 834 00:39:19,441 --> 00:39:22,280 Tinc curiositat per veure el que és realment passant per sota de la campana, 835 00:39:22,280 --> 00:39:26,050 i jo vaig a imprimir aquesta a 28 xifres decimals. 836 00:39:26,050 --> 00:39:29,730 Vull veure realment 0.1000-- 1 infinite-- 837 00:39:29,730 --> 00:39:32,710 [Inaudible] 27 zeros després que 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Bé anem a veure si això és el que de fet entenc. 839 00:39:34,740 --> 00:39:39,430 Feu mateix arxiu carrosses-0. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Anem a apropar a la resposta dramàtica. 842 00:39:44,380 --> 00:39:49,980 Durant tot aquest temps, has estat pensant 1 dividit per 10 és del 10%, o 0,1. 843 00:39:49,980 --> 00:39:50,810 Que no és. 844 00:39:50,810 --> 00:39:53,210 Almenys pel que fa a la de què es tracti ordinador. 845 00:39:53,210 --> 00:39:57,060 >> Ara què-- bé, això és completa mentida 1 dividit per 10 és de 0,1. 846 00:39:57,060 --> 00:39:59,710 Però això no és què-- el menjar per portar avui. 847 00:39:59,710 --> 00:40:04,010 Llavors, per què pensa l'equip, a diferència de tots nosaltres a l'habitació, 848 00:40:04,010 --> 00:40:06,870 que 1 dividit per 10 és en realitat aquest valor boig? 849 00:40:06,870 --> 00:40:10,620 Quina és l'ordinador fent semblar? 850 00:40:10,620 --> 00:40:12,490 Què és això? 851 00:40:12,490 --> 00:40:13,785 >> No és desbordi, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow és típicament quan en què es posa al voltant d'un valor. 853 00:40:15,910 --> 00:40:18,970 És aquest problema d'imprecisió en un valor de coma flotant 854 00:40:18,970 --> 00:40:22,220 en la qual només té 32 o fins i tot 64 bits. 855 00:40:22,220 --> 00:40:25,230 Però si hi ha un infinit nombre de numbers-- veritable 856 00:40:25,230 --> 00:40:27,940 nombres amb punts decimals i els números de thereafter-- segurament 857 00:40:27,940 --> 00:40:29,380 no pot representar a tots ells. 858 00:40:29,380 --> 00:40:32,870 Així que l'equip ha donat nosaltres la coincidència més propera 859 00:40:32,870 --> 00:40:37,090 al valor que pot representar usant aquest molts bits al valor realment vull, 860 00:40:37,090 --> 00:40:38,690 que és 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Desafortunadament, si vostè començar a fer matemàtiques, o 862 00:40:40,685 --> 00:40:44,360 iniciar la participació d'aquest tipus de flotació valors de punt en important programs-- 863 00:40:44,360 --> 00:40:46,770 programari financer, res software-- militar 864 00:40:46,770 --> 00:40:49,090 on la percepció és probablement bastant important. 865 00:40:49,090 --> 00:40:51,520 I començar a afegir números d'aquest tipus, i començament 866 00:40:51,520 --> 00:40:54,050 executar aquest programari amb entrades molt grans 867 00:40:54,050 --> 00:40:56,890 o per moltes hores o lots de dies o una pila d'anys, 868 00:40:56,890 --> 00:41:01,060 aquests diminuts petits errors sens dubte pot augmentar amb el temps. 869 00:41:01,060 --> 00:41:04,252 >> Ara com un part, si alguna vegada t'has vist Superman 3 o espai d'oficina 870 00:41:04,252 --> 00:41:05,960 i es pot recordar com aquests nois van robar 871 00:41:05,960 --> 00:41:08,668 una gran quantitat de diners del seu ordinador mitjançant l'ús de valors de coma flotant 872 00:41:08,668 --> 00:41:11,290 i sumant la petita residus, és d'esperar que la pel · lícula 873 00:41:11,290 --> 00:41:12,390 ara té més sentit. 874 00:41:12,390 --> 00:41:14,930 Això és el que eren al·ludint que en la pel · lícula. 875 00:41:14,930 --> 00:41:16,710 El fet que la majoria les empreses no es veurien 876 00:41:16,710 --> 00:41:18,600 després d'un cert nombre de decimals, 877 00:41:18,600 --> 00:41:20,009 però aquests són fraccions de centaus. 878 00:41:20,009 --> 00:41:22,550 Així que començar a sumar, vostè comença a fer un munt de diners 879 00:41:22,550 --> 00:41:23,424 en el seu compte bancari. 880 00:41:23,424 --> 00:41:25,160 Així que això és Espai Oficina explicat. 881 00:41:25,160 --> 00:41:28,220 >> Ara per desgràcia més enllà Espai d'oficina, hi ha 882 00:41:28,220 --> 00:41:31,794 són alguns legítimament preocupant i impactes significatius 883 00:41:31,794 --> 00:41:33,710 d'aquests tipus de decisions de disseny subjacents, 884 00:41:33,710 --> 00:41:35,990 i de fet una de les raons utilitzem C en el curs 885 00:41:35,990 --> 00:41:39,640 és perquè vostè realment té aquesta planta fins a la comprensió de com funcionen els ordinadors, 886 00:41:39,640 --> 00:41:42,440 com el programari funciona i què no donar res per fet. 887 00:41:42,440 --> 00:41:45,820 >> I de fet Desafortunadament, fins i tot amb que la comprensió fonamental, 888 00:41:45,820 --> 00:41:47,370 nosaltres els humans cometem errors. 889 00:41:47,370 --> 00:41:51,310 I el que jo vaig pensar en compartir és aquest video de vuit minut aquí pren 890 00:41:51,310 --> 00:41:56,980 d'un episodi de Meravelles Modernes, que és un espectacle didàctic sobre com funcionen les coses 891 00:41:56,980 --> 00:42:00,370 que pinta dos quadres quan un ús indegut 892 00:42:00,370 --> 00:42:02,540 i la comprensió de valors de coma flotant 893 00:42:02,540 --> 00:42:05,610 conduït a alguns significativa resultats desafortunats. 894 00:42:05,610 --> 00:42:06,363 Anem a fer una ullada. 895 00:42:06,363 --> 00:42:07,029 [REPRODUCCIÓ DE VÍDEO] 896 00:42:07,029 --> 00:42:11,290 Nosaltres Ara tornar a "Enginyeria Desastres "a Meravelles Modernes. 897 00:42:11,290 --> 00:42:12,940 Ordinadors. 898 00:42:12,940 --> 00:42:15,580 Tots hem arribat a acceptar la problemes sovint frustrants que 899 00:42:15,580 --> 00:42:20,960 aconseguit amb ells-- error, virus, i glitches-- programari per als preus petits 900 00:42:20,960 --> 00:42:23,100 a pagar per la comoditat. 901 00:42:23,100 --> 00:42:27,770 Però en l'alta tecnologia i d'alta velocitat aplicacions militars i programes espacials, 902 00:42:27,770 --> 00:42:32,780 el problema més petit possible magnificar en el desastre. 903 00:42:32,780 --> 00:42:38,880 >> El 4 de juny de 1996, els científics van preparar per llançar un coet Ariane 5 no tripulat. 904 00:42:38,880 --> 00:42:41,190 Transportava científica satèl · lits dissenyats 905 00:42:41,190 --> 00:42:44,570 establir amb precisió com el Interactua camp magnètic de la Terra 906 00:42:44,570 --> 00:42:47,380 amb els vents solars. 907 00:42:47,380 --> 00:42:50,580 El coet va ser construït per l'Agència Espacial Europea, 908 00:42:50,580 --> 00:42:54,400 i va enlairar des de les seves instal · lacions a la costa de la Guaiana francesa. 909 00:42:54,400 --> 00:42:57,520 >> -Al Uns 37 segons en el vol, primer 910 00:42:57,520 --> 00:42:59,070 alguna cosa notat anava malament. 911 00:42:59,070 --> 00:43:02,240 Que els broquets es gira sobre un eix de manera que en realitat no hauria. 912 00:43:02,240 --> 00:43:06,550 Al voltant de 40 segons de vol, clarament el vehicle estava en problemes, 913 00:43:06,550 --> 00:43:08,820 i va ser llavors quan van fer la decisió de destruir. 914 00:43:08,820 --> 00:43:12,370 L'oficial de seguretat de gamma, amb enormes budells, pressiona el botó 915 00:43:12,370 --> 00:43:18,030 i explotar el coet abans que pogués convertir-se en un perill per a la seguretat pública. 916 00:43:18,030 --> 00:43:21,010 >> : Aquest era la donzella viatge de l'Ariane 5, 917 00:43:21,010 --> 00:43:23,920 i la seva destrucció es va portar lloc a causa de la falla 918 00:43:23,920 --> 00:43:25,932 integrat en el programari del coet. 919 00:43:25,932 --> 00:43:27,640 -El Problema al Ariane va ser que no 920 00:43:27,640 --> 00:43:30,500 era un nombre que requereix 64 bits per expressar, 921 00:43:30,500 --> 00:43:33,560 i volien convertir a un nombre de 16 bits. 922 00:43:33,560 --> 00:43:36,820 Van assumir que el nombre Mai seria molt gran. 923 00:43:36,820 --> 00:43:40,940 Que la majoria d'aquests dígits a el nombre de 64 bits eren zeros. 924 00:43:40,940 --> 00:43:42,450 Estaven equivocats. 925 00:43:42,450 --> 00:43:45,000 >> -El Incapacitat d'un programa per acceptar 926 00:43:45,000 --> 00:43:49,460 el tipus de nombre generat per un altre era a l'arrel de la falla. 927 00:43:49,460 --> 00:43:54,260 El desenvolupament de programari s'havia convertit en un molt costosa part de la nova tecnologia. 928 00:43:54,260 --> 00:43:57,060 El coet Ariane 4 tenia tingut molt èxit. 929 00:43:57,060 --> 00:44:01,600 Així que gran part del programari creat per també va ser utilitzat en el Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -El Problema bàsic era que l'Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Va ser Més Ràpid accelerat més ràpid, i el programari no havia pres en compte per això. 932 00:44:11,200 --> 00:44:14,910 >> -El Destrucció del coet va ser un gran desastre financer. 933 00:44:14,910 --> 00:44:18,630 Tot a causa d'un error de programari minuts. 934 00:44:18,630 --> 00:44:21,160 Però aquesta no va ser la primera problemes de conversió de dades de temps 935 00:44:21,160 --> 00:44:24,770 havia ple la tecnologia moderna de coets. 936 00:44:24,770 --> 00:44:28,020 >> -En 1991 amb l'inici de la primera Guerra del Golf, 937 00:44:28,020 --> 00:44:30,540 el míssil Patriot experimentat una classe similar 938 00:44:30,540 --> 00:44:32,465 d'un problema de conversió nombre. 939 00:44:32,465 --> 00:44:36,760 I com a resultat 28 gent-- 28 Soldiers-- nord-americans van morir, 940 00:44:36,760 --> 00:44:39,010 i al voltant d'un centenar més van resultar ferits. 941 00:44:39,010 --> 00:44:42,830 Quan el Patriot, que se suposava per protegir contra Scuds entrants, 942 00:44:42,830 --> 00:44:45,780 deixat de disparar un míssil. 943 00:44:45,780 --> 00:44:51,610 >> Quan Iraq va envair Kuwait, i Amèrica llançat Tempesta del Desert a principis de 1991, 944 00:44:51,610 --> 00:44:55,720 Bateries de míssils Patriot van ser desplegats per protegir Aràbia Saudita i Israel 945 00:44:55,720 --> 00:44:59,180 dels atacs iraquians amb míssils Scud. 946 00:44:59,180 --> 00:45:03,080 El Patriot és un mitjà-rang de Estats Units terra-aire del sistema 947 00:45:03,080 --> 00:45:06,530 fabricat per l'empresa Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -El Mida del Patriota interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 és més o menys uns 20 peus de llarg, i pesa al voltant de 2.000 lliures. 950 00:45:14,705 --> 00:45:19,090 I porta una ogiva del voltant, Crec que és més o menys 150 lliures. 951 00:45:19,090 --> 00:45:23,880 I el propi cap de combat és un explosiu d'alta potència, que 952 00:45:23,880 --> 00:45:26,700 té fragments al seu voltant. 953 00:45:26,700 --> 00:45:31,630 Així la carcassa de la ogiva és dissenyat per actuar com un perdigó. 954 00:45:31,630 --> 00:45:34,040 >> -Els Míssils es duen quatre per contenidor, 955 00:45:34,040 --> 00:45:37,170 i són transportats per un semiremolc. 956 00:45:37,170 --> 00:45:44,880 >> -El Sistema Patriot antimíssils es remunta almenys 20 anys. 957 00:45:44,880 --> 00:45:48,380 Originalment va ser dissenyat com un míssil de defensa aèria 958 00:45:48,380 --> 00:45:50,810 per enderrocar avions enemics. 959 00:45:50,810 --> 00:45:54,410 A la primera Guerra del Golf quan aquesta guerra es va encendre, 960 00:45:54,410 --> 00:45:59,650 l'Exèrcit volia utilitzar-lo per enderrocar míssils Scud, no avions. 961 00:45:59,650 --> 00:46:03,580 La Força Aèria Iraquiana va ser no tant d'un problema, 962 00:46:03,580 --> 00:46:06,590 però l'Exèrcit estava preocupat sobre els Scud. 963 00:46:06,590 --> 00:46:10,120 I pel que van tractar d' actualitzar el Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Un enemic míssil que viatja a Mach 5 965 00:46:12,740 --> 00:46:15,670 que seria un repte suficient. 966 00:46:15,670 --> 00:46:18,440 Però quan el Patriot va ser traslladat d'urgència en servei, 967 00:46:18,440 --> 00:46:22,580 l'Exèrcit no estava al tant de una modificació iraquiana que 968 00:46:22,580 --> 00:46:25,880 fet els seus Scuds gairebé impossible a ella. 969 00:46:25,880 --> 00:46:30,690 >> Què va succeir és que els Scud van anar arribant eren inestables. 970 00:46:30,690 --> 00:46:32,000 Eren oscil.lant. 971 00:46:32,000 --> 00:46:37,210 La raó d'això era dels Iraqis-- a fi d'obtenir 600 quilòmetres a terme 972 00:46:37,210 --> 00:46:41,680 d'un rang missile-- 300 quilòmetres prendre el pes de la ogiva front, 973 00:46:41,680 --> 00:46:43,340 i l'ogiva fet més lleuger. 974 00:46:43,340 --> 00:46:48,490 Així que ara el Patriot de tractar d'arribar al Scud, i la majoria de la temps-- 975 00:46:48,490 --> 00:46:52,880 l'aclaparadora majoria de la temps-- seria simplement sortir volant pel Scud. 976 00:46:52,880 --> 00:46:57,120 >> Una Els operadors del sistema Patriot es va adonar de la Patriot va perdre el seu objectiu, 977 00:46:57,120 --> 00:47:01,630 detonar ogiva del Patriota per evitar possibles baixes si 978 00:47:01,630 --> 00:47:04,440 es va deixar caure a terra. 979 00:47:04,440 --> 00:47:08,700 >> Això va ser el que van veure la majoria de la gent com grans boles de foc al cel, 980 00:47:08,700 --> 00:47:14,180 i incomprès com intercepcions d'ogives Scud. 981 00:47:14,180 --> 00:47:18,020 >> -Encara En els cels nocturns, Patriots semblava estar destruint amb èxit 982 00:47:18,020 --> 00:47:23,280 Scud, en Dhahran podria haver No s'equivoquin sobre el seu acompliment. 983 00:47:23,280 --> 00:47:27,930 Hi ha sistema de radar del Patriot perdut la pista d'un Scud entrant 984 00:47:27,930 --> 00:47:30,260 i mai posat en marxa a causa a un defecte de programari. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Van ser els israelians que va descobrir per primera vegada que com més temps el sistema estava encès, 987 00:47:38,880 --> 00:47:41,130 com més gran és la discrepància de temps es va convertir. 988 00:47:41,130 --> 00:47:44,770 A causa d'un rellotge incorporat a l'ordinador del sistema. 989 00:47:44,770 --> 00:47:48,190 >> -About Dues setmanes abans la tragèdia a Dhahran, 990 00:47:48,190 --> 00:47:50,720 els israelians van informar el Departament de Defensa 991 00:47:50,720 --> 00:47:52,410 que el sistema estava perdent el temps. 992 00:47:52,410 --> 00:47:54,410 Després d'aproximadament vuit hores de funcionament, es van adonar 993 00:47:54,410 --> 00:47:57,690 que el sistema esdevingui notablement menys precisa. 994 00:47:57,690 --> 00:48:01,850 El Departament de Defensa va respondre comptant totes les bateries Patriot 995 00:48:01,850 --> 00:48:04,800 per no deixar els sistemes per un llarg temps. 996 00:48:04,800 --> 00:48:06,980 Mai van dir el que era molt de temps. 997 00:48:06,980 --> 00:48:09,140 8 hores, 10 hores, mil hores. 998 00:48:09,140 --> 00:48:11,300 Ningú sabia. 999 00:48:11,300 --> 00:48:13,320 >> -El Bateria Patriot destinat a la caserna 1000 00:48:13,320 --> 00:48:18,310 en Dhahran i el seu defectuós intern rellotge havia estat en marxa durant més de 100 hores 1001 00:48:18,310 --> 00:48:21,520 en la nit del 25 de febrer. 1002 00:48:21,520 --> 00:48:25,792 >> És rastrejats temps amb una precisió del voltant d'una dècima de segon. 1003 00:48:25,792 --> 00:48:27,950 Ara desè d'un segon és un nombre interessant 1004 00:48:27,950 --> 00:48:31,850 perquè no es pot expressar exactament en binari, que 1005 00:48:31,850 --> 00:48:36,500 significa que no es pot expressar exactament en qualsevol ordinador digital moderna. 1006 00:48:36,500 --> 00:48:41,070 És difícil de creure, però utilitzar això com un exemple. 1007 00:48:41,070 --> 00:48:43,420 >> Prenguem el nombre d'un terç. 1008 00:48:43,420 --> 00:48:47,330 Una tercera no pot ser expressat en decimal exactament. 1009 00:48:47,330 --> 00:48:52,060 Una tercera és 0.333 passant per l'infinit. 1010 00:48:52,060 --> 00:48:56,420 No hi ha manera de fer això amb precisió absoluta en un decimal. 1011 00:48:56,420 --> 00:48:59,530 Aquest és exactament el tipus de problema això va succeir en el Patriot. 1012 00:48:59,530 --> 00:49:04,040 Com més temps el sistema va funcionar, la es va convertir en el pitjor error de temps. 1013 00:49:04,040 --> 00:49:08,840 >> -Després 100 hores de funcionament, el error en el temps era només al voltant d'un terç 1014 00:49:08,840 --> 00:49:10,440 d'un segon. 1015 00:49:10,440 --> 00:49:14,150 Però en termes de focalització d'un míssil que viatja a Mach 5, 1016 00:49:14,150 --> 00:49:18,560 que va donar lloc a un seguiment error de més de 600 metres. 1017 00:49:18,560 --> 00:49:21,870 Seria un error fatal per als soldats a Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> ¿Què va passar es va anar el llançament d'un Scud detectat pels satèl · lits d'alerta primerenca, 1019 00:49:28,455 --> 00:49:32,710 i conèixer un Scud venia en la seva direcció general. 1020 00:49:32,710 --> 00:49:35,150 No sabien d'on venia. 1021 00:49:35,150 --> 00:49:38,210 Ara era fins al radar component del sistema Patriot 1022 00:49:38,210 --> 00:49:43,150 defensar Dhahran localitzar i pista del míssil enemic entrant. 1023 00:49:43,150 --> 00:49:44,561 >> -El Radar era molt intel · ligent. 1024 00:49:44,561 --> 00:49:46,560 En realitat, seria rastrejar la posició de la Scud 1025 00:49:46,560 --> 00:49:48,930 i després predir on probablement seria 1026 00:49:48,930 --> 00:49:51,380 la propera vegada que el radar envia un pols a terme. 1027 00:49:51,380 --> 00:49:53,040 Això es deia la porta de distància. 1028 00:49:53,040 --> 00:49:57,620 >> Aleshores Una vegada que el Patriot decideix prou temps té 1029 00:49:57,620 --> 00:50:02,400 passat a tornar enrere i comprovar la ubicació per a aquest objecte detectat 1030 00:50:02,400 --> 00:50:03,550 que es remunta. 1031 00:50:03,550 --> 00:50:07,820 Així que quan es va tornar al mal lloc, a continuació, no veu cap objecte. 1032 00:50:07,820 --> 00:50:10,360 I decideix que no havia objecte. 1033 00:50:10,360 --> 00:50:13,630 Que hi havia una detecció falsa i cau la pista. 1034 00:50:13,630 --> 00:50:16,970 >> -El Scud entrant desaparèixer des de la pantalla de radar, 1035 00:50:16,970 --> 00:50:20,200 i segons després, es va estavellar contra la caserna. 1036 00:50:20,200 --> 00:50:22,570 El Scud va matar 28. 1037 00:50:22,570 --> 00:50:26,110 Va ser l'últim acomiadat durant la primera Guerra del Golf. 1038 00:50:26,110 --> 00:50:31,920 Tràgicament, el programari actualitzat arribar a l'alba de l'endemà. 1039 00:50:31,920 --> 00:50:34,870 La falla de programari tenia estat fixat, tancament 1040 00:50:34,870 --> 00:50:39,150 un capítol en l'atribolat la història dels míssils Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [FI REPRODUCCIÓ DE VÍDEO] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. Malan: Això és tot per CS50. 1043 00:50:41,488 --> 00:50:42,820 Ens veiem dimecres. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [REPRODUCCIÓ DE MÚSICA] 1046 00:50:50,370 --> 00:54:23,446