1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Molt bé, benvingut. 3 00:00:12,580 --> 00:00:13,290 Aquesta és CS50. 4 00:00:13,290 --> 00:00:15,130 Aquest és el començament de la setena setmana. 5 00:00:15,130 --> 00:00:18,890 Així que ha estat un temps, així que vam pensar que seria millor prendre un viatge llampec d'on som 6 00:00:18,890 --> 00:00:20,760 deixem i que ara estem passant. 7 00:00:20,760 --> 00:00:23,310 >> Així que aquesta cosa pugui tenir causat certa angoixa al principi. 8 00:00:23,310 --> 00:00:27,680 Però és d'esperar, que està començant a aclimatar-se a el que això denota aquí - 9 00:00:27,680 --> 00:00:32,670 estrella que representa un punter, que és just el que, en termes més senzills? 10 00:00:32,670 --> 00:00:33,400 Així que és una adreça. 11 00:00:33,400 --> 00:00:35,490 >> Així que és la direcció de alguna cosa a la memòria. 12 00:00:35,490 --> 00:00:38,260 I vam començar a pelar les capes Fa un parell de setmanes, les coses com 13 00:00:38,260 --> 00:00:41,800 GetString i altres funcions tot aquest temps han estat tornant 14 00:00:41,800 --> 00:00:46,010 adreces de les coses en la memòria, com el direcció del primer caràcter 15 00:00:46,010 --> 00:00:46,990 alguna seqüència. 16 00:00:46,990 --> 00:00:50,360 >> Així també vam introduir valgrind, que vostè començarà a utilitzar per a aquest problema 17 00:00:50,360 --> 00:00:53,380 establir, en particular per a la propera problema configurat així. 18 00:00:53,380 --> 00:00:54,980 I valgrind fa el que per a nosaltres? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Comprova si hi ha fuites de memòria, i També comprova que hi ha abús de la memòria. 21 00:01:01,020 --> 00:01:05,890 >> Es pot, amb certa probabilitat, detectar si el codi es tocarà de memòria 22 00:01:05,890 --> 00:01:07,100 que simplement no hauria. 23 00:01:07,100 --> 00:01:10,410 Així que no és necessàriament una fugida, però si anar més enllà de les fronteres d'alguns 24 00:01:10,410 --> 00:01:14,730 matriu, i en realitat s'executa valgrind i induir a que el comportament, mentre que 25 00:01:14,730 --> 00:01:17,870 valgrind s'està executant en el seu programa és s'executa dins de la mateixa, obtindrà 26 00:01:17,870 --> 00:01:21,460 missatges com això - "no vàlid escriuen d' mida de 4 ", que, recordem un parell de 27 00:01:21,460 --> 00:01:25,880 Fa setmanes significava que havia accidentalment com en un int massa 28 00:01:25,880 --> 00:01:27,250 més enllà dels límits d'una matriu. 29 00:01:27,250 --> 00:01:30,790 I el que la mida 4 significa aquí la mida que int en particular. 30 00:01:30,790 --> 00:01:35,260 >> Així que pren consol en el fet que de sortida de valgrind, el format de la mateixa, 31 00:01:35,260 --> 00:01:36,170 és simplement atroç. 32 00:01:36,170 --> 00:01:40,180 És molt difícil veure a través del desordre per la informació interessant. 33 00:01:40,180 --> 00:01:42,910 Així que el que hem fet aquí és només fragment alguns dels parells de més 34 00:01:42,910 --> 00:01:43,850 línies interessants. 35 00:01:43,850 --> 00:01:46,760 Però adonar-se que el 80% de valgrind de sortida serà una mica d'un 36 00:01:46,760 --> 00:01:47,650 distracció. 37 00:01:47,650 --> 00:01:52,820 >> Només has de buscar patrons com aquests - invàlida dret, nul llegir 40 bytes 38 00:01:52,820 --> 00:01:56,690 i un nombre de blocs són definitivament perduts, paraules clau així. 39 00:01:56,690 --> 00:02:01,920 I què et esperem veure algun tipus de rastre del que funcionarà el 40 00:02:01,920 --> 00:02:03,340 error és en realitat polz 41 00:02:03,340 --> 00:02:07,195 En aquest cas aquí, en quina línia de el meu codi era aparentment l'error? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 en un arxiu anomenat memory.c, que era l'exemple que estàvem jugant amb 44 00:02:14,130 --> 00:02:14,890 en el moment. 45 00:02:14,890 --> 00:02:16,460 Així que no és probable que en malloc. 46 00:02:16,460 --> 00:02:18,630 Probablement va ser en el meu codi al seu lloc. 47 00:02:18,630 --> 00:02:20,910 Així que anem a veure això de nou i de nou en poc temps. 48 00:02:20,910 --> 00:02:24,080 >> Així scanf, això va ocórrer en un parell de formes fins ara. 49 00:02:24,080 --> 00:02:26,410 Ens vam veure breument sscanf. 50 00:02:26,410 --> 00:02:28,330 Va ser una cosa un nombre de que es va capbussar en si 51 00:02:28,330 --> 00:02:29,535 els preparatius per al concurs. 52 00:02:29,535 --> 00:02:33,130 I scanf és en realitat el que el CS50 biblioteca ha estat utilitzant per sota de la 53 00:02:33,130 --> 00:02:36,560 campana des de fa força temps per tal per obtenir l'entrada de l'usuari. 54 00:02:36,560 --> 00:02:40,420 >> Per exemple, si em mut a la CS50 aparell aquí, deixa obrir una 55 00:02:40,420 --> 00:02:45,315 exemple, avui dia això es diu scanf-0.C I és super simple. 56 00:02:45,315 --> 00:02:46,590 És només unes poques línies de codi. 57 00:02:46,590 --> 00:02:50,880 Però demostra realment com getInt ha estat treballant tot aquest temps. 58 00:02:50,880 --> 00:02:54,710 >> En aquest programa aquí, a la línia 16 , Observi que em declaro 1 int. 59 00:02:54,710 --> 00:02:57,270 Així que no hi punters, res màgic allà, només un int. 60 00:02:57,270 --> 00:03:00,330 Després, en la línia 17, que inciten la usuari un nombre, per favor. 61 00:03:00,330 --> 00:03:02,930 Després a finals de 18, jo ús scanf aquí. 62 00:03:02,930 --> 00:03:06,910 I he especificat, una mena printf, que estic esperant cita 63 00:03:06,910 --> 00:03:08,110 Unquote cent i. 64 00:03:08,110 --> 00:03:10,920 >> Així cent i, per descomptat, denota un int. 65 00:03:10,920 --> 00:03:14,580 Però noti el que el segon argument per scanf és. 66 00:03:14,580 --> 00:03:17,350 Com descriuria el segon argument després de la coma? 67 00:03:17,350 --> 00:03:19,450 Què és això? 68 00:03:19,450 --> 00:03:20,670 >> És l'adreça de x. 69 00:03:20,670 --> 00:03:25,490 Així que això és útil ja que en proporcionar scanf amb la direcció de x, el que fa 70 00:03:25,490 --> 00:03:29,560 que faculten a aquesta funció a fer? 71 00:03:29,560 --> 00:03:33,010 No només ha d'anar-hi, però també fer què? 72 00:03:33,010 --> 00:03:34,060 >> Realitzar un canvi en ell. 73 00:03:34,060 --> 00:03:38,080 Com que vostè pot anar-hi, és una espècie de com un mapa a una ubicació en la memòria. 74 00:03:38,080 --> 00:03:41,900 I mentre vostè proporciona scanf o qualsevol funció amb un mapa a tal, que 75 00:03:41,900 --> 00:03:45,840 funció pot anar-hi, i no només mirar el valor, però també pot 76 00:03:45,840 --> 00:03:49,670 canviar aquest valor, la qual cosa és útil si el propòsit de la vida d'scanf és 77 00:03:49,670 --> 00:03:53,060 escanejar l'entrada de l'usuari, en concret des del teclat. 78 00:03:53,060 --> 00:03:57,830 I el f denota format, igual que printf, el f denota un format 79 00:03:57,830 --> 00:03:58,930 cadena que voleu imprimir. 80 00:03:58,930 --> 00:04:04,430 >> Així que en resum, la línia 18 simplement diu: tractar de llegir un int de l'usuari del 81 00:04:04,430 --> 00:04:10,420 teclat i guardar dins de x, en qualsevol que sigui la direcció x passa a viure en. 82 00:04:10,420 --> 00:04:14,860 I després, finalment, la línia 19 només diu, gràcies pel int, en aquest cas. 83 00:04:14,860 --> 00:04:15,940 >> Així que permetin-me anar endavant i fer això. 84 00:04:15,940 --> 00:04:18,570 Així que scanf 0. 85 00:04:18,570 --> 00:04:20,130 Deixin-me seguir endavant i fer més gran 86 00:04:20,130 --> 00:04:22,960 Vaig a córrer amb aquest punts frega scanf 0. 87 00:04:22,960 --> 00:04:24,020 Número, per favor? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Gràcies pel 50. 90 00:04:25,730 --> 00:04:27,270 Així que és bastant simple. 91 00:04:27,270 --> 00:04:28,160 >> Ara, què és el que no fa? 92 00:04:28,160 --> 00:04:29,940 No està fent un munt de comprovació d'errors. 93 00:04:29,940 --> 00:04:33,000 Per exemple, si jo no coopero, i jo no escric en un nombre, però 94 00:04:33,000 --> 00:04:37,860 vegada que escric alguna cosa així com "hola" això és una mica estrany. 95 00:04:37,860 --> 00:04:41,130 I el que una de les coses que l'CS50 biblioteca ha estat fent per nosaltres durant algun 96 00:04:41,130 --> 00:04:43,440 temps és que reprompting i reprompting. 97 00:04:43,440 --> 00:04:49,320 >> La retirada del mercat frase reintent estava en cs50.c, i aquesta és la raó per la qual en getInt 98 00:04:49,320 --> 00:04:51,670 la biblioteca CS50 és en realitat un conjunt manat de llargues cues, perquè estem 99 00:04:51,670 --> 00:04:53,190 comprovació de coses estúpides com aquesta. 100 00:04:53,190 --> 00:04:55,730 ¿No li dóna a l'usuari nosaltres, de fet, 01:00 int? 101 00:04:55,730 --> 00:04:57,910 ¿Ell o ella ens dóna alguna cosa com una lletra de l'alfabet? 102 00:04:57,910 --> 00:05:01,410 Si és així, volem detectar això i cridar. 103 00:05:01,410 --> 00:05:03,915 >> Però les coses es posen més interessants en el següent exemple. 104 00:05:03,915 --> 00:05:09,840 Si vaig a scanf-1.c, quina és la El que ha canviat fonamentalment en 105 00:05:09,840 --> 00:05:11,135 el següent exemple? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Estic utilitzant char *, per descomptat, en lloc de int. 108 00:05:16,010 --> 00:05:19,210 >> Així que això és interessant, perquè char *, recordar, és en realitat la 109 00:05:19,210 --> 00:05:20,190 el mateix que la cadena. 110 00:05:20,190 --> 00:05:23,840 Així que se sent com potser això és un super implementació simple de GetString. 111 00:05:23,840 --> 00:05:26,010 Però he desprendre la capa de la biblioteca CS50, així que estic 112 00:05:26,010 --> 00:05:27,550 anomenar aquest char * ara. 113 00:05:27,550 --> 00:05:30,070 Així que anem a veure que, si en qualsevol lloc, ens equivoquem. 114 00:05:30,070 --> 00:05:30,840 >> Línia 17 - 115 00:05:30,840 --> 00:05:33,950 Una altra vegada dic, si us plau, dóna'm alguna cosa, en aquest cas, una cadena. 116 00:05:33,950 --> 00:05:37,940 I després, en la següent línia, que jo anomeno scanf, de nou, donant-li un codi de format, 117 00:05:37,940 --> 00:05:39,310 però aquesta vegada per cent s. 118 00:05:39,310 --> 00:05:41,900 I aquesta vegada, estic donant-li tampó. 119 00:05:41,900 --> 00:05:43,550 >> Ara noto, no estic fent servir la i comercial. 120 00:05:43,550 --> 00:05:47,120 Però per què és que, probablement, bé aquí? 121 00:05:47,120 --> 00:05:49,760 Perquè el que està memòria intermèdia ja? 122 00:05:49,760 --> 00:05:50,770 Ja és un punter. 123 00:05:50,770 --> 00:05:51,650 Ja és una adreça. 124 00:05:51,650 --> 00:05:54,510 >> I anem a la paraula "confondre", em va deixar simplement dir-s, per exemple, per 125 00:05:54,510 --> 00:05:55,050 simplicitat. 126 00:05:55,050 --> 00:05:58,250 Però jo he anomenat esmorteir perquè en en general, en la programació, si vostè té un 127 00:05:58,250 --> 00:06:02,130 part de la memòria, que una cadena molt just és, pot trucar a un buffer. 128 00:06:02,130 --> 00:06:04,460 És un lloc per emmagatzemar informació. 129 00:06:04,460 --> 00:06:07,400 >> Igual que en coses com YouTube, quan que estan tampó, per així dir-ho, que 130 00:06:07,400 --> 00:06:10,270 simplement vol dir que la descàrrega els bits de Internet i el seu emmagatzematge en un 131 00:06:10,270 --> 00:06:14,160 matriu local, una part local de la memòria per que es pot veure més endavant sense 132 00:06:14,160 --> 00:06:16,830 que salta o penjat a que durant la reproducció. 133 00:06:16,830 --> 00:06:20,930 >> Així que hi ha un problema aquí, però, perquè jo ho dic scanf, l'espera una 134 00:06:20,930 --> 00:06:22,320 cadena de l'usuari. 135 00:06:22,320 --> 00:06:24,410 Aquí està la direcció del un tros de memòria. 136 00:06:24,410 --> 00:06:26,180 Ficar aquesta cadena no. 137 00:06:26,180 --> 00:06:31,230 Per què és que la envoltant donar ens problemes, però? 138 00:06:31,230 --> 00:06:33,490 >> Què és això? 139 00:06:33,490 --> 00:06:35,510 Puc accedir a que parteix de la memòria? 140 00:06:35,510 --> 00:06:36,250 Vostè sap, jo ho sé. 141 00:06:36,250 --> 00:06:39,210 A causa que s'ha inicialitzat tampó a alguna cosa? 142 00:06:39,210 --> 00:06:39,820 En realitat no. 143 00:06:39,820 --> 00:06:43,090 I el que és el que hem estat trucant un valor d'escombraries, el que 144 00:06:43,090 --> 00:06:44,040 no és una paraula formal. 145 00:06:44,040 --> 00:06:49,200 Simplement vol dir que no tenim idea del que els bits es troben dins dels quatre bytes que els 146 00:06:49,200 --> 00:06:51,240 He assignat com a tampó. 147 00:06:51,240 --> 00:06:52,450 >> No he trucat a malloc. 148 00:06:52,450 --> 00:06:53,940 He definitivament no vaig trucar GetString. 149 00:06:53,940 --> 00:06:56,380 Llavors, ¿qui sap el que és en realitat dins de tampó? 150 00:06:56,380 --> 00:07:00,550 I no obstant això, diu scanf cegues, anar-hi i posar el que l'usuari escriu. 151 00:07:00,550 --> 00:07:04,460 >> Llavors, és probable que causi en el nostre codi si ho executem? 152 00:07:04,460 --> 00:07:05,700 Probablement sigui una violació de segment. 153 00:07:05,700 --> 00:07:07,970 Potser no, però probablement una violació de segment. 154 00:07:07,970 --> 00:07:10,620 I dic potser no, perquè a vegades ho fa, de vegades, 155 00:07:10,620 --> 00:07:11,380 no rep una violació de segment. 156 00:07:11,380 --> 00:07:14,280 A vegades només tenir sort, però que és, però, serà 157 00:07:14,280 --> 00:07:15,340 un error en el programa. 158 00:07:15,340 --> 00:07:17,060 >> Així que permetin seguir endavant i compilar això. 159 00:07:17,060 --> 00:07:18,280 Vaig a fer-ho de la manera de la vella escola. 160 00:07:18,280 --> 00:07:23,825 Així Clang tauler 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Vaja, l'escola és massa vell. 162 00:07:24,720 --> 00:07:26,550 Anem a veure. 163 00:07:26,550 --> 00:07:28,440 Què vaig fer? 164 00:07:28,440 --> 00:07:29,700 Oh, char buffer *. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, gràcies - 167 00:07:35,130 --> 00:07:36,930 Deseu, OK - 168 00:07:36,930 --> 00:07:37,690 molt vella escola. 169 00:07:37,690 --> 00:07:38,900 Bé, ha estat un temps. 170 00:07:38,900 --> 00:07:41,720 >> Així que he acabo de salvar l'arxiu després d' fent que la temporal 171 00:07:41,720 --> 00:07:42,700 canviar fa un moment. 172 00:07:42,700 --> 00:07:46,090 I ara que he compilat manualment amb Clang. 173 00:07:46,090 --> 00:07:49,500 I ara em vaig a anar per davant i executar scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Cadena favor. 175 00:07:50,290 --> 00:07:51,600 Vaig a escriure "hola". 176 00:07:51,600 --> 00:07:54,070 >> I ara, aquí és on, francament, printf s'és una mica molest. 177 00:07:54,070 --> 00:07:56,020 No és en realitat va a segfault en aquest cas. 178 00:07:56,020 --> 00:07:59,860 Printf és una mica especial perquè és tan super d'ús comú que 179 00:07:59,860 --> 00:08:03,570 essencialment printf està fent Fes-nos un favor i adonar-se, 180 00:08:03,570 --> 00:08:04,830 això no és un punter vàlid. 181 00:08:04,830 --> 00:08:09,080 Déjame a mi mateix que acaba d'imprimir en parèntesi nul, fins i tot 182 00:08:09,080 --> 00:08:13,340 encara que no és necessàriament el que nosaltres esperàvem. 183 00:08:13,340 --> 00:08:16,940 >> Així que no podem induir molt fàcilment un segfault amb això, però és clar que 184 00:08:16,940 --> 00:08:18,600 no és el comportament que jo volia. 185 00:08:18,600 --> 00:08:19,800 Llavors, quina és la solució simple? 186 00:08:19,800 --> 00:08:25,650 Doncs bé, en scanf-2, permetin-me proposar que en lloc de en realitat només l'assignació d'una 187 00:08:25,650 --> 00:08:30,100 char *, deixa de ser una mica més intel · ligent sobre això, i em deixa assignar la memòria intermèdia 188 00:08:30,100 --> 00:08:32,940 com una seqüència de 16 caràcters. 189 00:08:32,940 --> 00:08:34,200 >> Així que puc fer això en un parell de maneres. 190 00:08:34,200 --> 00:08:35,610 Podria absolutament utilitzar malloc. 191 00:08:35,610 --> 00:08:38,980 Però puc tornar a la setmana dos quan Només necessitava un munt de 192 00:08:38,980 --> 00:08:39,620 personatges. 193 00:08:39,620 --> 00:08:40,860 Això és només una matriu. 194 00:08:40,860 --> 00:08:44,870 Així que permetin-me lloc redefinir memòria intermèdia en ser una matriu de 16 caràcters. 195 00:08:44,870 --> 00:08:47,340 >> I ara, quan pas de memòria intermèdia a - 196 00:08:47,340 --> 00:08:49,940 i això és una cosa que no ens parlar en dues setmanes - 197 00:08:49,940 --> 00:08:53,730 però es pot tractar a una matriu com encara que és una direcció. 198 00:08:53,730 --> 00:08:56,390 Tècnicament, com hem vist, són una mica diferent. 199 00:08:56,390 --> 00:09:01,290 Però scanf no li importarà si se li passa el nom d'una matriu, ja que el que 200 00:09:01,290 --> 00:09:05,030 Clang farà per nosaltres és essencialment tractar el nom de la matriu com la 201 00:09:05,030 --> 00:09:08,280 direcció de la part de 16 bytes. 202 00:09:08,280 --> 00:09:09,550 >> Així que això és millor. 203 00:09:09,550 --> 00:09:12,110 Això vol dir que ara que puc esperar feu el següent. 204 00:09:12,110 --> 00:09:16,800 Permetin-me Allunyar per un moment i fer fer scanf-2, compilat a OK. 205 00:09:16,800 --> 00:09:19,390 Ara m'ho dius fer aconseguir slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 Cadena favor. "Hola." I semblava funcionar aquesta vegada. 207 00:09:22,430 --> 00:09:26,020 >> Però algú pot proposar un escenari en el qual no pot seguir funcionant? 208 00:09:26,020 --> 00:09:28,550 Sí? 209 00:09:28,550 --> 00:09:30,640 Una mica més de 16 caràcters. 210 00:09:30,640 --> 00:09:32,020 I, de fet, podem estar una mica més precisa. 211 00:09:32,020 --> 00:09:36,540 Una mica més llavors 15 caràcters, perquè realment hem de tenir en compte 212 00:09:36,540 --> 00:09:39,920 que és necessari que la barra invertida zero implícitament en l'extrem de la cadena, 213 00:09:39,920 --> 00:09:42,950 que és un a part scanf se solen tenir cura de nosaltres. 214 00:09:42,950 --> 00:09:46,210 >> Així que permetin-me fer una cosa així - 215 00:09:46,210 --> 00:09:48,040 A vegades podem simplement deixar-ho així. 216 00:09:48,040 --> 00:09:50,630 Acceptar, pel que hem va induir ara la decisió de segmentació. 217 00:09:50,630 --> 00:09:51,000 Per què? 218 00:09:51,000 --> 00:09:54,940 Com he escrit en més de 15 caràcters, pel que hem fet 219 00:09:54,940 --> 00:09:58,280 memòria tocat que en realitat No hauria d'haver fet. 220 00:09:58,280 --> 00:10:00,180 >> Llavors, què és realment la solució a aquest problema? 221 00:10:00,180 --> 00:10:02,210 Bé, i si necessitem una cadena més llarga? 222 00:10:02,210 --> 00:10:03,960 Bé, potser ho deixem 32 bytes. 223 00:10:03,960 --> 00:10:05,160 Bé, i si això no és suficient? 224 00:10:05,160 --> 00:10:06,040 Què hi ha de 64 bytes? 225 00:10:06,040 --> 00:10:07,080 I si això no és suficient? 226 00:10:07,080 --> 00:10:09,640 Què hi ha de 128 o 200 bytes? 227 00:10:09,640 --> 00:10:12,660 El que realment és la solució a aquest problema en el cas general, si no sabem en 228 00:10:12,660 --> 00:10:14,460 avançar en el que està passant a l'usuari que escrigui? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> És només una mena de gran dolor al cul, per ser sincer, de manera que la 231 00:10:23,050 --> 00:10:29,050 CS50 biblioteca compta amb una dotzena de línies de codi que implementen col · lectivament 232 00:10:29,050 --> 00:10:32,390 GetString cadena d'una manera que no ho fem cal saber per endavant el que el 233 00:10:32,390 --> 00:10:33,430 usuari va a escriure. 234 00:10:33,430 --> 00:10:37,370 En particular, si un mira cap enrere en cs50.c des de fa dues setmanes, vostè veurà 235 00:10:37,370 --> 00:10:40,480 que GetString fa realitat No utilitzeu scanf d'aquesta manera. 236 00:10:40,480 --> 00:10:43,720 Més aviat, es llegeix un caràcter alhora. 237 00:10:43,720 --> 00:10:46,010 >> Perquè l'única cosa bona de la lectura d'un personatge és el que podem 238 00:10:46,010 --> 00:10:48,490 ens garanteix que sempre tenir almenys un car. 239 00:10:48,490 --> 00:10:51,740 Només es pot declarar una xerrada i, a continuació, prendre aquests passos veritablement nadó a 240 00:10:51,740 --> 00:10:54,380 llegir un caràcter en l'1 moment des del teclat. 241 00:10:54,380 --> 00:10:58,240 I llavors, el que veuràs GetString Com és que cada vegada que es queda sense, 242 00:10:58,240 --> 00:11:02,280 dir, 16 bytes de memòria, s'utilitza malloc, o un cosí d'aquests, a 243 00:11:02,280 --> 00:11:06,810 assignar més memòria, còpia l'antiga memòria en la nova, i després arrossegar- 244 00:11:06,810 --> 00:11:09,900 junt, aconseguint un caràcter alhora, i quan es queda sense que 245 00:11:09,900 --> 00:11:13,370 part de la memòria, el tira, joc un tros més gran de la memòria, còpies antigues 246 00:11:13,370 --> 00:11:14,750 en noves i repeteix. 247 00:11:14,750 --> 00:11:18,480 I és realment un mal de realitat implementar una cosa tan simple com 248 00:11:18,480 --> 00:11:19,710 obtenir informació d'un usuari. 249 00:11:19,710 --> 00:11:21,090 >> Així que vostè pot utilitzar scanf. 250 00:11:21,090 --> 00:11:22,430 Podeu utilitzar altres funcions similars. 251 00:11:22,430 --> 00:11:25,420 I un munt de llibres de text i en línia exemples fan, però tots són 252 00:11:25,420 --> 00:11:27,210 vulnerables a problemes com aquest. 253 00:11:27,210 --> 00:11:29,550 I en última instància, aconseguir una violació de segment és una mica molest. 254 00:11:29,550 --> 00:11:30,680 No és bo per a l'usuari. 255 00:11:30,680 --> 00:11:33,560 >> Però en el pitjor dels casos, el que fa és fonamental posar el seu 256 00:11:33,560 --> 00:11:37,160 codi en risc d'? 257 00:11:37,160 --> 00:11:39,250 Algun tipus d'atac, el que podria. 258 00:11:39,250 --> 00:11:41,680 Parlem d'un d'aquests atacs - Desbordament de la pila. 259 00:11:41,680 --> 00:11:44,660 Però en general, si se li permet desbordament de memòria intermèdia, com ho va fer un 260 00:11:44,660 --> 00:11:48,070 Fa unes setmanes, amb només escriure més que "hola" a la pila, 261 00:11:48,070 --> 00:11:52,330 tampoc pot fer-se càrrec, en potència, un equip, o almenys arribar a les dades que 262 00:11:52,330 --> 00:11:53,510 no li pertany a vostè. 263 00:11:53,510 --> 00:11:55,970 >> Així que en resum, és per això que tenim les rodes d'entrenament. 264 00:11:55,970 --> 00:11:59,090 Però ara, comencem a treure-se'ls, com els nostres programes ja no necessiten, 265 00:11:59,090 --> 00:12:00,610 necessàriament, l'entrada de l'usuari. 266 00:12:00,610 --> 00:12:03,960 Però en el cas del problema plantejat 06:00, seva aportació provindrà d'una gran 267 00:12:03,960 --> 00:12:07,520 arxiu de diccionari amb 150 alguns imparells mil paraules. 268 00:12:07,520 --> 00:12:10,330 >> Així que vostè no haurà de preocupar per arbitrària d'entrada de l'usuari. 269 00:12:10,330 --> 00:12:13,720 Li donarem alguns supòsits sobre aquest arxiu. 270 00:12:13,720 --> 00:12:20,340 Teniu alguna pregunta respecte punters o scanf o l'entrada de l'usuari en general? 271 00:12:20,340 --> 00:12:24,450 >> Bé, de manera que un ràpid cop d'ull a continuació, en un tema s'arrossega des de fa dues setmanes. 272 00:12:24,450 --> 00:12:28,590 I aquesta va ser la idea d'una estructura. 273 00:12:28,590 --> 00:12:34,180 No és que - aquesta noció de estructura, que era el que? 274 00:12:34,180 --> 00:12:35,430 Què li struct fer per nosaltres? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definir - 277 00:12:39,860 --> 00:12:41,710 ho sento? 278 00:12:41,710 --> 00:12:42,820 Definir un tipus variable. 279 00:12:42,820 --> 00:12:44,410 Així que en certa manera. 280 00:12:44,410 --> 00:12:46,180 De fet, estem combinant dos temes. 281 00:12:46,180 --> 00:12:49,510 Així que amb typedef, recordem que podem declarar un tipus de la nostra, com un 282 00:12:49,510 --> 00:12:51,500 sinònim, com a cadena de char *. 283 00:12:51,500 --> 00:12:56,200 Però l'ús d'typedef struct i, podem crear veritablement les nostres pròpies estructures de dades. 284 00:12:56,200 --> 00:12:59,600 >> Per exemple, si vaig de nou en gedit aquí només per un moment, i segueixo endavant 285 00:12:59,600 --> 00:13:08,230 i fer una cosa així, vaig a salvar això com, diguem, structs.c 286 00:13:08,230 --> 00:13:10,840 temporalment, només vaig seguir endavant i incloure 287 00:13:10,840 --> 00:13:14,360 standardio.h, void main int. 288 00:13:14,360 --> 00:13:18,960 I després aquí, suposo que vull per escriure un programa que emmagatzema 289 00:13:18,960 --> 00:13:21,840 diversos estudiants de múltiples cases, per exemple. 290 00:13:21,840 --> 00:13:24,430 Així que és com un registrarial base de dades d'algun tipus. 291 00:13:24,430 --> 00:13:29,550 >> Així que si necessito el nom d'un estudiant, podria fer alguna cosa com caràcters Nom * 292 00:13:29,550 --> 00:13:31,570 i vaig a fer una cosa així - 293 00:13:31,570 --> 00:13:34,410 En realitat, farem servir la biblioteca CS50 per només un moment per fer d'aquest un 294 00:13:34,410 --> 00:13:38,380 mica més simple, pel que pot demanar prestat aquestes desenes de línies de codi. 295 00:13:38,380 --> 00:13:39,340 I anem a mantenir simple. 296 00:13:39,340 --> 00:13:42,610 El mantindrem cadena, i ara GetString. 297 00:13:42,610 --> 00:13:47,420 >> Així que pretenc ara que he emmagatzemat el nom d'algun estudiant, i la casa de 298 00:13:47,420 --> 00:13:50,240 algun estudiant, el simple ús de les variables com ho vam fer, i en la primera setmana. 299 00:13:50,240 --> 00:13:52,370 Però suposo que ara vull donar suport diversos estudiants. 300 00:13:52,370 --> 00:13:58,460 Molt bé, així que els meus instints tenen a veure string nom2, es GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 es GetString. 302 00:14:01,370 --> 00:14:05,850 I el nostre tercer estudiant, farem name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Molt bé, així que això és d'esperar sorprenent vostè com una mica estúpid, 304 00:14:09,170 --> 00:14:11,580 perquè aquest procés és realment mai va a acabar, i només va a 305 00:14:11,580 --> 00:14:13,130 fer el meu codi es vegi pitjor i pitjor i pitjor. 306 00:14:13,130 --> 00:14:14,810 Però vam resoldre això també en la segona setmana. 307 00:14:14,810 --> 00:14:19,450 Quina era la nostra solució relativament net quan vam tenir múltiples variables de l' 308 00:14:19,450 --> 00:14:23,580 mateix tipus de dades que estan relacionats, però que no volíem aquest embolic atroç 309 00:14:23,580 --> 00:14:26,870 de les variables de nom similar ¿ 310 00:14:26,870 --> 00:14:30,060 Què hem fet en el seu lloc? 311 00:14:30,060 --> 00:14:31,260 >> Així que crec que he sentit alguns llocs. 312 00:14:31,260 --> 00:14:32,590 Vam tenir una matriu. 313 00:14:32,590 --> 00:14:37,110 Per diverses còpies de alguna cosa, per què no netegem tot això 314 00:14:37,110 --> 00:14:39,540 i simplement dir, dóna'm array anomenat noms? 315 00:14:39,540 --> 00:14:41,640 >> I per ara, anem a codificar 3. 316 00:14:41,640 --> 00:14:44,450 I llavors dóna'm una altra matriu anomenat cases, i em va deixar per 317 00:14:44,450 --> 00:14:45,800 Codi dura ara 3. 318 00:14:45,800 --> 00:14:49,220 I jo he netejat massivament la embolic que acabo de crear. 319 00:14:49,220 --> 00:14:52,400 Ara, he encara fortament codificats 3, però encara el 3 podria venir dinàmica de la 320 00:14:52,400 --> 00:14:54,350 usuari, o argv, o similars. 321 00:14:54,350 --> 00:14:55,720 Així que això ja està més net. 322 00:14:55,720 --> 00:15:00,100 >> Però el que és molest d'això és que Ara, tot i que el nom és d'alguna manera 323 00:15:00,100 --> 00:15:02,280 fonamentalment vinculats a la casa d'un estudiant - 324 00:15:02,280 --> 00:15:04,720 és un estudiant que realment vol representar - 325 00:15:04,720 --> 00:15:08,080 Ara tinc dos arrays paral · lels en el sentit que són el 326 00:15:08,080 --> 00:15:13,930 mateixa mida i noms suport 0 presumiblement mapes a cases suport 0, 327 00:15:13,930 --> 00:15:16,600 i els noms del suport 1 mapes a les cases de suport 1. 328 00:15:16,600 --> 00:15:19,280 En altres paraules, que l'estudiant viu a aquesta casa, i que un altre estudiant 329 00:15:19,280 --> 00:15:20,530 que viu en una altra casa. 330 00:15:20,530 --> 00:15:23,720 Però segur que això podria ser fet encara més netament. 331 00:15:23,720 --> 00:15:24,990 >> Bé, pot, de fet. 332 00:15:24,990 --> 00:15:28,730 I m'ho dius a mi seguir endavant i obrir fins structs.h, i vostè 333 00:15:28,730 --> 00:15:31,130 veure aquesta idea aquí. 334 00:15:31,130 --> 00:15:34,905 Tingueu en compte que he fet servir typedef, com lusió fa un moment per declarar la nostra 335 00:15:34,905 --> 00:15:35,570 tipus de dades pròpia. 336 00:15:35,570 --> 00:15:39,660 Però també estic fent servir aquesta altra paraula clau anomenada struct el que em dóna una nova 337 00:15:39,660 --> 00:15:40,790 estructura de dades. 338 00:15:40,790 --> 00:15:43,980 >> I aquesta estructura de dades afirmo va de tenir dues coses a l'interior de 339 00:15:43,980 --> 00:15:47,060 és - una cadena anomenada nom, i una cadena anomenada casa. 340 00:15:47,060 --> 00:15:49,820 I el nom que vaig a donar a aquesta estructura de dades es va 341 00:15:49,820 --> 00:15:51,005 que es dirà estudiant. 342 00:15:51,005 --> 00:15:54,030 Podria dir-el que vulgui, però això semànticament fer 343 00:15:54,030 --> 00:15:55,810 sentit per a mi en la meva ment. 344 00:15:55,810 --> 00:15:59,160 >> Així que ara, si obro una versió millorada del programa que vaig començar a escriure 345 00:15:59,160 --> 00:16:00,390 allà, deixa desplaçar fins a la part superior. 346 00:16:00,390 --> 00:16:03,190 I hi ha alguna cosa més línies de codi aquí, però vull centrar-me en 347 00:16:03,190 --> 00:16:04,160 el moment en un. 348 00:16:04,160 --> 00:16:07,790 He declarat una constant crida als estudiants i codificat 3 per ara. 349 00:16:07,790 --> 00:16:11,110 Però ara, observi el net el meu codi comença a aconseguir. 350 00:16:11,110 --> 00:16:15,030 >> En la línia 22, declaro selecció dels estudiants. 351 00:16:15,030 --> 00:16:18,760 I noti que l'alumne és aparentment ara és un tipus de dades. 352 00:16:18,760 --> 00:16:23,360 A causa que en la part superior d'aquest arxiu, notarà He inclòs l'arxiu de capçalera 353 00:16:23,360 --> 00:16:24,820 que vaig arribar fa un moment. 354 00:16:24,820 --> 00:16:28,820 I aquest fitxer de capçalera simplement havia aquesta definició d'un estudiant. 355 00:16:28,820 --> 00:16:32,470 >> Així que ara, he creat els meus propis dades personalitzades tipus que els autors de C any 356 00:16:32,470 --> 00:16:33,890 Fa no pensar per endavant. 357 00:16:33,890 --> 00:16:34,570 Però no hi ha problema. 358 00:16:34,570 --> 00:16:35,870 Puc fer-ho jo mateix. 359 00:16:35,870 --> 00:16:39,050 Així que aquesta és una matriu anomenada alumnes, cada un dels membres 360 00:16:39,050 --> 00:16:41,100 és una estructura estudiant. 361 00:16:41,100 --> 00:16:44,270 I vull tres dels en la matriu. 362 00:16:44,270 --> 00:16:46,030 >> I ara, què fa el resta d'aquest programa fer? 363 00:16:46,030 --> 00:16:47,550 Jo necessitava una cosa una mica arbitrària. 364 00:16:47,550 --> 00:16:51,450 Així que de línia 24 en endavant, Una iteració de 0 a 3. 365 00:16:51,450 --> 00:16:54,000 Llavors els pregunto a l'usuari el nom de l'estudiant. 366 00:16:54,000 --> 00:16:56,110 I llavors jo ús GetString com abans. 367 00:16:56,110 --> 00:16:59,410 Llavors li pregunto a la casa de l'estudiant, i utilitzo GetString com abans. 368 00:16:59,410 --> 00:17:01,780 >> Però noti - Lleugerament nova tros de sintaxi - 369 00:17:01,780 --> 00:17:07,010 Encara puc índex per l'i-èsim estudiant, però com puc obtenir les dades específiques 370 00:17:07,010 --> 00:17:08,354 camp a l'interior de l'estructura? 371 00:17:08,354 --> 00:17:11,770 Bé, el que és aparentment el nova peça de la sintaxi? 372 00:17:11,770 --> 00:17:13,339 És només l'operador punt. 373 00:17:13,339 --> 00:17:14,510 >> No hem realment vist això abans. 374 00:17:14,510 --> 00:17:17,819 Vostè ho ha vist en el conjunt de processadors cinc si vostè té bussejat en ja amb els arxius de mapa de bits. 375 00:17:17,819 --> 00:17:22,372 Però el punt només significa dins d'aquest estructura o diversos camps, donen punts 376 00:17:22,372 --> 00:17:24,510 nom, o em dóna house punt. 377 00:17:24,510 --> 00:17:28,690 Això significa anar dins de l'estructura i obtenir els camps particulars. 378 00:17:28,690 --> 00:17:30,200 >> Què fa la resta d'aquest programa ho faci? 379 00:17:30,200 --> 00:17:31,190 No tot és tan sexy. 380 00:17:31,190 --> 00:17:34,640 Tingueu en compte que una iteració de 0 a 3 més, i jo simplement crear una Anglès 381 00:17:34,640 --> 00:17:40,500 frase com això i allò altre és de tal una casa per exemple, passant el nom del punt de 382 00:17:40,500 --> 00:17:43,320 l'i-èsim alumne i la seva casa també. 383 00:17:43,320 --> 00:17:47,560 >> I finalment, ara anem a començar a obtenir anal sobre això, ara que estem 384 00:17:47,560 --> 00:17:49,580 familiaritzat amb el que malloc i d'altres funcions han estat 385 00:17:49,580 --> 00:17:50,570 fent tot aquest temps. 386 00:17:50,570 --> 00:17:54,220 Per què he d'alliberar tant el nom i de la casa, tot i que 387 00:17:54,220 --> 00:17:56,960 no trucar a malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString va fer. 389 00:17:58,020 --> 00:18:00,930 I aquest va ser el petit i brut secret de diverses setmanes, però GetString té 390 00:18:00,930 --> 00:18:03,530 es perd memòria a tot el col · locar tot el semestre fins al moment. 391 00:18:03,530 --> 00:18:05,990 I finalment Valgrand revelar això a nosaltres. 392 00:18:05,990 --> 00:18:10,730 >> Però no és una gran cosa, perquè sé que simplement puc alliberar el nom 393 00:18:10,730 --> 00:18:15,750 i la casa, encara que tècnicament, a ser súper, súper segur, hauria de ser 394 00:18:15,750 --> 00:18:17,890 fent un repàs de les faltes aquí. 395 00:18:17,890 --> 00:18:19,040 Quins són els teus instints et diuen? 396 00:18:19,040 --> 00:18:22,480 Quina hauria de ser la comprovació de abans que jo Què és un 397 00:18:22,480 --> 00:18:25,470 cordes, també conegut com el qual un char *? 398 00:18:25,470 --> 00:18:33,460 >> Realment ha de comprovar si els alumnes Suport nom i punt no 399 00:18:33,460 --> 00:18:34,840 igual nul. 400 00:18:34,840 --> 00:18:40,400 Llavors estarà bé per seguir endavant i lliure aquest punter, i la mateixa o una altra 401 00:18:40,400 --> 00:18:41,160 un així. 402 00:18:41,160 --> 00:18:46,860 Si els estudiants bracket casa i punt no és igual a null, això ara va a protegir 403 00:18:46,860 --> 00:18:52,520 contra el cas de la cantonada en què GetString torna alguna cosa així com nul. 404 00:18:52,520 --> 00:18:57,310 I vam veure fa un moment, es printf protegir aquí amb només dir 405 00:18:57,310 --> 00:18:58,990 null, el que va a semblar estrany. 406 00:18:58,990 --> 00:19:02,340 Però almenys no violació de segment, com hem vist. 407 00:19:02,340 --> 00:19:05,990 >> Bé, deixa fer una cosa aquí. estructures-0 és una mena de programa estúpid 408 00:19:05,990 --> 00:19:09,700 perquè entro totes aquestes dades i, a continuació, es perd un cop acabi el programa. 409 00:19:09,700 --> 00:19:10,940 Però m'ho dius anar endavant i fer això. 410 00:19:10,940 --> 00:19:12,830 Vull deixar el terminal finestra una mica més gran. 411 00:19:12,830 --> 00:19:17,000 Permetin-me fer estructures-1, que és una nova versió d'aquest. 412 00:19:17,000 --> 00:19:18,520 >> Vaig a apropar una una mica. 413 00:19:18,520 --> 00:19:21,620 I ara m'ho dius córrer dot reduir les estructures-1. 414 00:19:21,620 --> 00:19:22,590 Nom de l'estudiant - 415 00:19:22,590 --> 00:19:31,500 David Mather, farem Rob Kirkland, farem Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 L'interessant ara és avís - 417 00:19:33,650 --> 00:19:35,540 i només jo sé perquè Vaig escriure el programa - 418 00:19:35,540 --> 00:19:38,930 hi ha un arxiu ara en el meu actual directori anomenat students.csv. 419 00:19:38,930 --> 00:19:40,420 Alguns de vosaltres heu vist aquests en el món real. 420 00:19:40,420 --> 00:19:42,980 >> Què és un arxiu CSV? 421 00:19:42,980 --> 00:19:44,170 Valors separats per comes. 422 00:19:44,170 --> 00:19:46,670 És com un home pobre versió d'un arxiu d'Excel. 423 00:19:46,670 --> 00:19:50,580 És una taula de files i columnes que pot obrir en un programa com Excel, 424 00:19:50,580 --> 00:19:51,800 o números en un Mac 425 00:19:51,800 --> 00:19:55,180 >> I si obro l'arxiu aquí a gedit, avís - i els números no hi són. 426 00:19:55,180 --> 00:19:57,360 Això és només gedit dient em números de línia. 427 00:19:57,360 --> 00:19:59,740 Recordeu que en la primera línia d'aquesta arxiu és David and Mather. 428 00:19:59,740 --> 00:20:01,450 La següent línia és Rob comes Kirkland. 429 00:20:01,450 --> 00:20:04,170 I la tercera línia és Lauren coma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Llavors, què he creat? 431 00:20:05,480 --> 00:20:09,580 Ara que he escrit un programa en C que efectivament pot generar fulls de càlcul 432 00:20:09,580 --> 00:20:11,840 que es pot obrir en un programa com Excel. 433 00:20:11,840 --> 00:20:15,520 No tot el que obligar a un conjunt de dades, però si té trossos molt grans de 434 00:20:15,520 --> 00:20:18,440 dades que en realitat es vol manipular i fer gràfiques i de les 435 00:20:18,440 --> 00:20:21,260 com, això és potser un manera de crear aquestes dades. 436 00:20:21,260 --> 00:20:25,370 D'altra banda, CSV són realment súper comú només per emmagatzemar dades simples - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, per exemple, si obté cotitzacions de borsa a través de la seva trucada 438 00:20:28,940 --> 00:20:33,180 API, el servei gratuït que li permet poseu-vos al dia proveir-se a la data 439 00:20:33,180 --> 00:20:35,650 les cotitzacions de les empreses, que donar les dades de nou en el 440 00:20:35,650 --> 00:20:37,800 súper format CSV simple. 441 00:20:37,800 --> 00:20:39,380 >> Llavors, com ho fem? 442 00:20:39,380 --> 00:20:42,530 Ben comunicat, la major part d'aquest programa de gairebé la mateixa. 443 00:20:42,530 --> 00:20:46,870 Però noti aquí baix, en lloc d'imprimir els estudiants de fora, en la línia 35 444 00:20:46,870 --> 00:20:51,040 en endavant, em diuen que m'estic estalviant el estudiants en el disc, així que guardar un arxiu. 445 00:20:51,040 --> 00:20:53,630 >> Llavors noto que estic declarant un FILE * - 446 00:20:53,630 --> 00:20:57,260 Ara, això és una espècie d'anomalia en C. Per alguna raó, FILE és tot en majúscules, 447 00:20:57,260 --> 00:21:00,690 que no és com la majoria d'altres tipus de dades de C. Però això és un predefinit 448 00:21:00,690 --> 00:21:02,320 tipus de dades, FILE *. 449 00:21:02,320 --> 00:21:05,900 I estic declarant un punter a un arxiu, és com es pot pensar en això. 450 00:21:05,900 --> 00:21:08,070 >> fopen significa obrir l'arxiu. 451 00:21:08,070 --> 00:21:09,470 Què fitxer que voleu obrir? 452 00:21:09,470 --> 00:21:12,620 Vull obrir un arxiu que jo vull arbitràriament truqui students.csv. 453 00:21:12,620 --> 00:21:14,480 Podria trucar a que qualsevol cosa que jo vulgui. 454 00:21:14,480 --> 00:21:15,200 >> I després prendre una conjectura. 455 00:21:15,200 --> 00:21:18,960 Què fa el segon argument a fopen probablement vol dir? 456 00:21:18,960 --> 00:21:21,480 Dreta, w per escriptura, podria ser r per a lectura. 457 00:21:21,480 --> 00:21:24,120 Hi ha una per append si voleu afegir files i no 458 00:21:24,120 --> 00:21:25,200 sobreescriure tot. 459 00:21:25,200 --> 00:21:28,005 >> Però jo només vull crear aquest arxiu una vegada, així que faré servir cita unquote w. 460 00:21:28,005 --> 00:21:31,880 I sé que només per haver llegit la documentació, o de la pàgina del manual. 461 00:21:31,880 --> 00:21:35,100 Si l'arxiu no és nul - en altres paraules, si res va sortir malament allà - 462 00:21:35,100 --> 00:21:37,820 m'ho dius recórrer en iteració els alumnes de 0 a 3. 463 00:21:37,820 --> 00:21:40,410 >> I ara noten que hi ha alguna cosa lleugerament diferent 464 00:21:40,410 --> 00:21:42,110 sobre la línia 41 aquí. 465 00:21:42,110 --> 00:21:42,960 No és printf. 466 00:21:42,960 --> 00:21:46,530 És fprintf d'arxiu printf. 467 00:21:46,530 --> 00:21:47,790 Així que va a escriure a l'arxiu. 468 00:21:47,790 --> 00:21:48,860 Què arxiu? 469 00:21:48,860 --> 00:21:53,630 Aquell el punter s'especifica com a primer argument. 470 00:21:53,630 --> 00:21:55,940 >> A continuació s'especifica una cadena de format. 471 00:21:55,940 --> 00:21:59,660 A continuació especifiquem quina cadena que volem connecti per primera cent s, i 472 00:21:59,660 --> 00:22:04,320 a continuació, una altra variable o la segona per cent s. 473 00:22:04,320 --> 00:22:06,760 Després tanquem l'arxiu amb fclose. 474 00:22:06,760 --> 00:22:09,380 Del que alliberar la memòria com abans, encara He tornar i afegir 475 00:22:09,380 --> 00:22:10,540 algunes comprovacions per null. 476 00:22:10,540 --> 00:22:12,090 >> I això és tot. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose em dóna la capacitat de crear arxius de text. 478 00:22:16,960 --> 00:22:19,640 Ara, vostè veurà en conjunt de problemes 5, que consisteix en imatges, es va a utilitzar 479 00:22:19,640 --> 00:22:20,990 arxius binaris en lloc. 480 00:22:20,990 --> 00:22:24,200 Però fonamentalment, la idea és la mateixa, tot i que les funcions que comptaràs 481 00:22:24,200 --> 00:22:28,710 veure són una mica diferents. 482 00:22:28,710 --> 00:22:32,580 >> Així gira llampec, però vostè rebrà molt familiaritzat amb l'arxiu I/O-- 483 00:22:32,580 --> 00:22:34,960 entrada i sortida - amb el conjunt de processadors 05:00. 484 00:22:34,960 --> 00:22:38,607 I qualsevol pregunta sobre l' fonaments inicials aquí? 485 00:22:38,607 --> 00:22:39,857 Sí? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Què passa si vostè tracta d'alliberar un valor nul? 488 00:22:43,710 --> 00:22:48,880 Crec que, a menys lliure ha aconseguit un poc més fàcil d'usar, es pot 489 00:22:48,880 --> 00:22:49,890 potencial violació de segment. 490 00:22:49,890 --> 00:22:54,160 Passar nul · la és dolent perquè no ho faig creure sense la molèstia de comprovar per tu, 491 00:22:54,160 --> 00:22:57,330 perquè podria ser potencialment una pèrdua de temps perquè ho faci per si mateix 492 00:22:57,330 --> 00:22:59,022 tots en el món. 493 00:22:59,022 --> 00:23:00,590 Bona pregunta, però. 494 00:23:00,590 --> 00:23:04,300 >> Bé, pel que aquest tipus de es nosaltres un tema interessant. 495 00:23:04,300 --> 00:23:07,010 El tema del butlletí de problemes 05:00 és forense. 496 00:23:07,010 --> 00:23:08,420 Almenys aquesta és una part del conjunt de problemes. 497 00:23:08,420 --> 00:23:12,030 Forense es refereix generalment a la la recuperació de la informació que pot o 498 00:23:12,030 --> 00:23:14,110 No pot haver estat esborrat deliberadament. 499 00:23:14,110 --> 00:23:18,680 I així que vaig pensar que li donaria una ràpida mostra del que realment està passant tot 500 00:23:18,680 --> 00:23:21,230 aquesta vegada per sota de la capó del seu ordinador. 501 00:23:21,230 --> 00:23:23,960 >> Per exemple, si vostè té dins del seu portàtil o l'ordinador d'escriptori a 502 00:23:23,960 --> 00:23:28,040 disc dur, o és un mecànic dispositiu que gira realitat - 503 00:23:28,040 --> 00:23:31,650 hi ha coses circulars anomenats plats que es veuen força com el que 504 00:23:31,650 --> 00:23:34,540 només tenia a la pantalla aquí, encara aquesta és l'escola cada vegada més vella. 505 00:23:34,540 --> 00:23:37,370 Aquesta és una de tres i mitja polzades unitat de disc dur. 506 00:23:37,370 --> 00:23:40,070 I 3:30 polzades es refereix de amb la de la cosa quan l'instal 507 00:23:40,070 --> 00:23:40,890 en un ordinador. 508 00:23:40,890 --> 00:23:44,890 >> Molts de vostès en els seus ordinadors portàtils ara que les unitats d'estat sòlid, o SSD, 509 00:23:44,890 --> 00:23:46,260 que no tenen parts mòbils. 510 00:23:46,260 --> 00:23:49,170 Són més com RAM i menys com aquests dispositius mecànics. 511 00:23:49,170 --> 00:23:51,450 Però les idees continuen sent les mateixes, sens dubte pel que fa 512 00:23:51,450 --> 00:23:52,790 al problema d'establir 05:00. 513 00:23:52,790 --> 00:23:57,400 >> I si ho penses ara d'un disc dur representa ser un cercle, el qual 514 00:23:57,400 --> 00:23:58,930 Vaig a dibuixar com això aquí. 515 00:23:58,930 --> 00:24:02,290 Quan es crea un arxiu en l'equip, si es tracta d'un SSD, o en 516 00:24:02,290 --> 00:24:06,610 aquest cas, una escola de disc dur més gran, arxiu que comprèn múltiples bits. 517 00:24:06,610 --> 00:24:10,510 Diguem que és 0 i 1, un munt de 0s i 1s. 518 00:24:10,510 --> 00:24:11,660 Així que aquest és el meu disc dur sencer. 519 00:24:11,660 --> 00:24:13,225 Aparentment és un arxiu bastant gran. 520 00:24:13,225 --> 00:24:18,080 I s'està utilitzant el 0 i 1 en aquest porció de la font física. 521 00:24:18,080 --> 00:24:19,750 >> Bé, el que és la part física? 522 00:24:19,750 --> 00:24:25,310 Bé, resulta que en un disc dur, almenys d'aquest tipus, hi ha 523 00:24:25,310 --> 00:24:27,340 aquestes petites partícules magnètiques petites. 524 00:24:27,340 --> 00:24:32,630 I ells tenen essencialment nord i pols sud a ells, de manera que si 525 00:24:32,630 --> 00:24:35,710 al seu torn una d'aquestes partícules magnètiques d'aquesta manera, es podria dir que es tracta d' 526 00:24:35,710 --> 00:24:36,720 que representa l'1. 527 00:24:36,720 --> 00:24:39,340 I si és a l'inrevés sud a nord, es podria dir que es tracta d' 528 00:24:39,340 --> 00:24:40,390 que representa un 0. 529 00:24:40,390 --> 00:24:43,660 >> Així que en el món físic real, això és com es pot representar alguna cosa en 530 00:24:43,660 --> 00:24:45,670 estat binari de 0 i 1. 531 00:24:45,670 --> 00:24:46,720 Així que això és tot un arxiu és. 532 00:24:46,720 --> 00:24:49,300 Hi ha un munt de magnètica partícules que són d'aquesta manera o el seu 533 00:24:49,300 --> 00:24:51,920 d'aquesta manera, la creació de patrons de 0 i 1. 534 00:24:51,920 --> 00:24:56,760 >> Però resulta que quan es guarda un arxiu, alguna informació es guarda per separat. 535 00:24:56,760 --> 00:25:00,000 Així que aquesta és una petita taula, un directori, per dir-ho. 536 00:25:00,000 --> 00:25:05,810 I vaig a trucar a aquest nom de columna i Vaig a trucar a aquesta ubicació de la columna. 537 00:25:05,810 --> 00:25:08,850 >> I jo vaig a dir, suposem aquesta és la meva full de vida. 538 00:25:08,850 --> 00:25:14,050 El meu resume.doc s'emmagatzema en ubicació, diguem 123. 539 00:25:14,050 --> 00:25:15,390 Sempre vaig per aquest nombre. 540 00:25:15,390 --> 00:25:18,810 Però cal dir que igual que en la memòria RAM, es pot prendre una unitat de disc dur 541 00:25:18,810 --> 00:25:22,350 Això és un gigabyte o 200 gigabytes o d'un terabyte, i es pot 542 00:25:22,350 --> 00:25:23,750 nombre de tots els bytes. 543 00:25:23,750 --> 00:25:26,480 Pot numerar totes trossos de 8 bits. 544 00:25:26,480 --> 00:25:29,030 >> Així que anem a dir que aquest és la ubicació 123. 545 00:25:29,030 --> 00:25:32,070 Així que aquest directori a de la meva intervenció sistema recorda que el meu 546 00:25:32,070 --> 00:25:34,250 full de vida és en la ubicació 123. 547 00:25:34,250 --> 00:25:36,850 Però es posa interessant quan s'elimina un arxiu. 548 00:25:36,850 --> 00:25:37,820 >> Així, per exemple - 549 00:25:37,820 --> 00:25:40,790 i per sort, la major part del món té atrapat en això - el que passa quan 550 00:25:40,790 --> 00:25:45,040 arrossega un arxiu al teu Mac OS Trash o la Paperera de reciclatge de Windows? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Quin és el propòsit de fer això? 553 00:25:50,510 --> 00:25:53,860 És obvi que és desfer-l'arxiu, però el que fa l'acte d'arrossegar i 554 00:25:53,860 --> 00:25:57,550 caure en la paperera o, si Recycle Bin fer en un ordinador? 555 00:25:57,550 --> 00:25:59,230 >> Absolutament res, de veritat. 556 00:25:59,230 --> 00:26:00,320 És com una carpeta. 557 00:26:00,320 --> 00:26:01,800 És una carpeta especial, per estar segur. 558 00:26:01,800 --> 00:26:04,460 Però realment esborrar l'arxiu? 559 00:26:04,460 --> 00:26:06,780 >> Bé, no, perquè alguns de vostès probablement han estat, oh maleïda sigui, no ho va fer 560 00:26:06,780 --> 00:26:07,420 vaig voler fer això. 561 00:26:07,420 --> 00:26:09,130 Així es fa doble clic al Trash o Paperera de reciclatge. 562 00:26:09,130 --> 00:26:11,630 Vostè ha furgar i que s'hagi recuperat l'arxiu simplement arrossegant 563 00:26:11,630 --> 00:26:12,110 d'aquí. 564 00:26:12,110 --> 00:26:14,420 Així que, clarament, no és necessàriament eliminar-lo. 565 00:26:14,420 --> 00:26:15,990 >> Bé, ets més intel · ligent que això. 566 00:26:15,990 --> 00:26:18,860 Vostè sap que només arrossegant-la a la Trash o Paperera de reciclatge no significa 567 00:26:18,860 --> 00:26:19,930 estàs buidar la paperera. 568 00:26:19,930 --> 00:26:24,110 Així que anar fins al menú, i vostè diu Buidar paperera o paperera de reciclatge buida. 569 00:26:24,110 --> 00:26:25,360 Llavors, què passa? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Sí, per la qual cosa s'elimina més. 572 00:26:32,530 --> 00:26:37,660 Però tot el que passa és això. 573 00:26:37,660 --> 00:26:45,350 L'ordinador s'oblida que resume.doc era. 574 00:26:45,350 --> 00:26:47,400 >> Però el que no ha canviat de parer a la foto? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Els bits del 0 i 1 que reclamo són en el lloc d'algun aspecte físic del 577 00:26:55,570 --> 00:26:56,280 el maquinari. 578 00:26:56,280 --> 00:26:57,110 Encara hi són. 579 00:26:57,110 --> 00:26:58,930 És només que l'equip té oblidat del que són. 580 00:26:58,930 --> 00:27:03,160 >> Pel que és essencialment alliberat del fitxer bits de manera que puguin ser reutilitzats. 581 00:27:03,160 --> 00:27:06,940 Però no és fins que es creu més arxius, i més arxius i més arxius 582 00:27:06,940 --> 00:27:12,150 probabilísticament, els 0s i 1s, les partícules magnètiques, es reutilitzen, 583 00:27:12,150 --> 00:27:16,220 banda a l'alça oa la dreta, si altres arxius, 0s i 1s. 584 00:27:16,220 --> 00:27:17,980 >> Pel que té aquesta finestra de temps. 585 00:27:17,980 --> 00:27:19,860 I no és d'predictible longitud, de veritat. 586 00:27:19,860 --> 00:27:22,240 Depèn de la mida del seu disc unitat i la quantitat d'arxius que té i 587 00:27:22,240 --> 00:27:23,490 la rapidesa amb què fer-ne de noves. 588 00:27:23,490 --> 00:27:27,050 Però hi ha aquesta finestra de temps durant el que aquest arxiu és encara perfectament 589 00:27:27,050 --> 00:27:27,770 recuperable. 590 00:27:27,770 --> 00:27:31,050 >> Així que si alguna vegada utilitza programes com McAfee o Norton per intentar recuperar 591 00:27:31,050 --> 00:27:35,680 dades, l'únic que estan fent és intentar recuperar la trucada directori per 592 00:27:35,680 --> 00:27:37,340 esbrinar on l'arxiu va ser. 593 00:27:37,340 --> 00:27:40,605 I a vegades Norton i dirà: arxiu és el 93% de reemborsament. 594 00:27:40,605 --> 00:27:42,020 Bé, què significa això? 595 00:27:42,020 --> 00:27:45,690 Això significa simplement que algú altre arxiu casualment va acabar usant, per exemple, 596 00:27:45,690 --> 00:27:48,920 aquests bits fora del seu arxiu original. 597 00:27:48,920 --> 00:27:51,950 >> Així que el que realment està involucrada en la recuperació de les dades? 598 00:27:51,950 --> 00:27:55,720 Bé, si vostè no té alguna cosa com Norton pre-instal lat al seu ordinador, 599 00:27:55,720 --> 00:27:59,510 el millor de vegades es pot fer és mirar en tot el disc dur a la recerca d' 600 00:27:59,510 --> 00:28:00,510 els patrons de bits. 601 00:28:00,510 --> 00:28:05,350 I un dels temes del conjunt de problemes 05:00 és que va a buscar el 602 00:28:05,350 --> 00:28:09,570 equivalent a un disc dur, un forense imatge d'una targeta Compact Flash d'un 603 00:28:09,570 --> 00:28:13,660 càmera digital, la recerca de la 0s i 1s que normalment, amb alta 604 00:28:13,660 --> 00:28:16,720 probabilitat, representar la l'inici d'una imatge JPEG. 605 00:28:16,720 --> 00:28:21,120 >> I vostès poden recuperar aquestes imatges per assumint, si veig a aquest patró de 606 00:28:21,120 --> 00:28:24,380 bits a la imatge forense, amb alta probabilitat, que marca 607 00:28:24,380 --> 00:28:25,650 l'inici d'un JPEG. 608 00:28:25,650 --> 00:28:29,520 I si veig el mateix patró altra vegada, que probablement marca l'inici de la 609 00:28:29,520 --> 00:28:32,440 altra JPEG, i un altre JPEG, JPEG i un altre. 610 00:28:32,440 --> 00:28:34,970 I això és en general la forma recuperació de dades funciona. 611 00:28:34,970 --> 00:28:37,870 El millor dels arxius JPEG és tot i que el mateix format de fitxer és una cosa 612 00:28:37,870 --> 00:28:44,400 complex, el començament de cada un d'aquests arxiu és en realitat bastant identificable 613 00:28:44,400 --> 00:28:47,370 i simple, com es veurà, si no tens ja. 614 00:28:47,370 --> 00:28:50,270 >> Així que anem a fer una ullada més de prop per sota la campana quant a exactament el que ha estat 615 00:28:50,270 --> 00:28:53,360 passant, i el que aquests 0s i 1s són, per donar-li una mica més d'un 616 00:28:53,360 --> 00:28:55,330 context per a aquest desafiament particular. 617 00:28:55,330 --> 00:28:55,510 >> [REPRODUIR VIDEO] 618 00:28:55,510 --> 00:28:58,700 >> -Quan el PC emmagatzema la majoria de les seves dades permanents. 619 00:28:58,700 --> 00:29:03,390 Per a això, les dades viatgen des de la RAM juntament amb els senyals de programari que li diuen 620 00:29:03,390 --> 00:29:06,110 el disc dur de la forma d'emmagatzemar les dades. 621 00:29:06,110 --> 00:29:09,410 Els circuits de disc dur es tradueixen aquests senyals en tensió 622 00:29:09,410 --> 00:29:10,870 fluctuacions. 623 00:29:10,870 --> 00:29:14,970 Aquests, al seu torn, controlen la unitat de disc peces en moviment, alguns dels pocs 624 00:29:14,970 --> 00:29:17,910 parts mòbils que queden al ordinador moderna. 625 00:29:17,910 --> 00:29:22,130 >> Algunes de les senyals de control d'un motor que fa girar discos de metall recoberts. 626 00:29:22,130 --> 00:29:25,470 Les seves dades s'emmagatzemen en realitat en aquests discos. 627 00:29:25,470 --> 00:29:28,610 Altres senyals es mouen de lectura / escriptura caps de lectura o 628 00:29:28,610 --> 00:29:30,710 escriure dades als discs. 629 00:29:30,710 --> 00:29:35,450 Aquest mecanisme tan precís que un ésser humà pèl ni tan sols podia passar entre el 630 00:29:35,450 --> 00:29:37,280 caps i plats giratoris. 631 00:29:37,280 --> 00:29:40,316 No obstant això, tot funciona a velocitats fenomenals. 632 00:29:40,316 --> 00:29:40,660 >> [FI REPRODUCCIÓ DE VÍDEO] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zoom en una petita més ara en el que és 634 00:29:42,190 --> 00:29:44,360 en realitat en els plats. 635 00:29:44,360 --> 00:29:44,720 >> [REPRODUIR VIDEO] 636 00:29:44,720 --> 00:29:47,660 >> -Fem una ullada al que acabem de va veure en càmera lenta. 637 00:29:47,660 --> 00:29:51,710 Quan un breu pols d'electricitat és enviat al capdavant de lectura / escriptura, si volteja 638 00:29:51,710 --> 00:29:54,650 en una petita electromagnètica per una fracció d'un segon. 639 00:29:54,650 --> 00:29:58,970 L'imam crea un camp, el qual canvia la polaritat d'un petit, petit 640 00:29:58,970 --> 00:30:02,850 part de les partícules de metall que abric de cada superfície del disc. 641 00:30:02,850 --> 00:30:05,940 >> Una sèrie de patrons d'aquests petits, àrees de càrrega-per amunt en el disc 642 00:30:05,940 --> 00:30:08,470 representa un sol bit d' les dades en el nombre binari 643 00:30:08,470 --> 00:30:10,530 sistema utilitzat per les computadores. 644 00:30:10,530 --> 00:30:13,775 Ara bé, si s'envia el corrent d'una manera a través de la lectura / escriptura del cap, la zona 645 00:30:13,775 --> 00:30:15,970 és polaritzada en una direcció. 646 00:30:15,970 --> 00:30:17,950 Si el corrent s'envia al direcció oposada, la 647 00:30:17,950 --> 00:30:19,930 polarització s'inverteix. 648 00:30:19,930 --> 00:30:22,370 >> Com obtenir les dades des del disc dur? 649 00:30:22,370 --> 00:30:24,090 Simplement revertir el procés. 650 00:30:24,090 --> 00:30:26,550 Així que les partícules en el disc que aconsegueix el corrent en el 651 00:30:26,550 --> 00:30:27,960 lectura / escriptura cap mòbil. 652 00:30:27,960 --> 00:30:30,700 Poseu a milions d'aquests segments magnetitzats, i 653 00:30:30,700 --> 00:30:32,160 vostè té un arxiu. 654 00:30:32,160 --> 00:30:36,060 >> Ara, les peces d'un sol arxiu pot estar dispersos per tota una unitat de 655 00:30:36,060 --> 00:30:39,970 plats, una mena el desordre de papers en el seu escriptori. 656 00:30:39,970 --> 00:30:43,500 Així que un arxiu sigui especial seguiment d'on està tot. 657 00:30:43,500 --> 00:30:45,985 No t'agradaria tenir una cosa així? 658 00:30:45,985 --> 00:30:46,470 >> [FI REPRODUCCIÓ DE VÍDEO] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, probablement no. 660 00:30:47,820 --> 00:30:52,070 Llavors, quants de vostès Vaig créixer amb ells? 661 00:30:52,070 --> 00:30:53,970 Acceptar, pel que és cada vegada menys mans cada any. 662 00:30:53,970 --> 00:30:56,550 Però m'alegro que estigui almenys familiaritzats amb ells, perquè això i la nostra pròpia 663 00:30:56,550 --> 00:31:00,520 Demo del llibre, per desgràcia, s'estan morint molt retardar la mort aquí de familiaritat. 664 00:31:00,520 --> 00:31:04,010 >> Però això és el que, almenys, de nou en l'escola secundària, l'ús s'utilitza per a còpies de seguretat. 665 00:31:04,010 --> 00:31:08,110 I va ser increïble, perquè podria emmagatzemar en 1,4 megabytes 666 00:31:08,110 --> 00:31:08,930 aquest disc en particular. 667 00:31:08,930 --> 00:31:12,260 I aquesta va ser la versió d'alta densitat, com s'indica per l'HD, que té 668 00:31:12,260 --> 00:31:14,240 és a dir, abans de vídeos d'alta definició d'avui en dia. 669 00:31:14,240 --> 00:31:16,400 >> La densitat estàndard va ser de 800 kilobytes. 670 00:31:16,400 --> 00:31:18,640 I abans d'això, havia Discos de 400 kilobytes. 671 00:31:18,640 --> 00:31:23,120 I abans d'això, hi havia 5 i 1/4 discos polzades, que eren veritablement flexible, 672 00:31:23,120 --> 00:31:25,680 i una mica més ample i més alt que aquestes coses aquí. 673 00:31:25,680 --> 00:31:29,150 Però en realitat es pot veure l'anomenada aspecte disquet d'aquests discos. 674 00:31:29,150 --> 00:31:32,630 >> I funcionalment, en realitat són molt similars als discs durs de l' 675 00:31:32,630 --> 00:31:33,570 menys d'aquest tipus. 676 00:31:33,570 --> 00:31:37,270 Un cop més, els SSD en els equips més nous treballar una mica diferent. 677 00:31:37,270 --> 00:31:41,530 Però si trasllada la llengüeta de metall petita, en realitat es pot veure una mica de galeta, 678 00:31:41,530 --> 00:31:42,560 o safates. 679 00:31:42,560 --> 00:31:43,830 >> No és de metall com aquest. 680 00:31:43,830 --> 00:31:46,000 Aquest és en realitat alguns més barats material plàstic. 681 00:31:46,000 --> 00:31:46,750 I vostè pot tipus de maniobra és. 682 00:31:46,750 --> 00:31:50,310 I has vaig apuntar només esborrat alguns nombre de bits o partícules magnètiques 683 00:31:50,310 --> 00:31:51,220 des d'aquest disc. 684 00:31:51,220 --> 00:31:52,710 >> Així que gràcies a Déu, no hi ha res en ell. 685 00:31:52,710 --> 00:31:55,790 Si això està en el camí - i cobrir els seus ulls i els del seu veí - 686 00:31:55,790 --> 00:31:58,865 vostè pot simplement llençar d'aquest tipus de conjunt de beina així. 687 00:31:58,865 --> 00:32:01,900 Però hi ha una mica de primavera, així que vés conscient que amb els ulls. 688 00:32:01,900 --> 00:32:03,620 Així que ara vostè té realment un disquet. 689 00:32:03,620 --> 00:32:07,090 >> I el que és notable sobre aquest és que en tant com aquest és un 690 00:32:07,090 --> 00:32:10,830 representació a petita escala d'un major disc dur, aquestes coses són super, 691 00:32:10,830 --> 00:32:11,590 super simple. 692 00:32:11,590 --> 00:32:15,170 Si es pessiga la part inferior de la mateixa, ja que aquesta cosa de metall està apagat, i la closca 693 00:32:15,170 --> 00:32:20,990 obrir-los, tot el que hi ha és dues peces de feltre i l'anomenada disquet 694 00:32:20,990 --> 00:32:22,930 amb una peça de metall a l'interior. 695 00:32:22,930 --> 00:32:25,990 >> I aquí va la meitat de el contingut del meu disc. 696 00:32:25,990 --> 00:32:27,540 Aquí va un altre mitjà d'ells. 697 00:32:27,540 --> 00:32:31,375 Però això és tot el que gira a l'interior del seu equip en antany. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> I a més, a posar això en perspectiva, el gran que és la major part de la seva 700 00:32:38,310 --> 00:32:39,560 discs durs d'avui en dia? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabytes, un terabyte potser en un ordinador d'escriptori, 2 terabytes, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, oi? 704 00:32:47,630 --> 00:32:52,480 Es tracta d'un megabyte, més o menys, que ni tan sols poden adaptar a una típica MP3 705 00:32:52,480 --> 00:32:55,310 anymore aquests dies, o alguns arxiu de música similar. 706 00:32:55,310 --> 00:32:59,500 >> Així que un petit record per a tu avui, i també per ajudar a contextualitzar el 707 00:32:59,500 --> 00:33:03,570 anem a prendre per fet ara en el problema d'establir 05:00. 708 00:33:03,570 --> 00:33:04,820 Així que aquests són teus per sempre. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Així que em va passar a on serà passar al següent conjunt de processadors també. 711 00:33:13,370 --> 00:33:18,470 Així que hem creat ara aquesta pàgina de - oh, un parell d'anuncis de forma ràpida. 712 00:33:18,470 --> 00:33:21,730 >> Aquest divendres, si vol unir-se a CS50 per dinar, anar al lloc de costum, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 I el projecte final - 715 00:33:25,100 --> 00:33:28,520 pel que el pla d'estudis, hem publicat la especificacions del projecte definitiu ja. 716 00:33:28,520 --> 00:33:31,410 Adonar-se que això no vol dir que és degut sobretot aviat. 717 00:33:31,410 --> 00:33:33,990 Ha publicat, en realitat, només per obtenir vostès pensar-hi. 718 00:33:33,990 --> 00:33:37,620 I, en efecte, un super significativa percentatge dels que s'afronta 719 00:33:37,620 --> 00:33:40,780 projectes fi de carrera en el material que ni tan sols han arribat a la classe, 720 00:33:40,780 --> 00:33:42,730 però serà tan aviat com la setmana que ve. 721 00:33:42,730 --> 00:33:45,530 >> Noteu, però, que l'especificació exigeix uns pocs components diferents de la 722 00:33:45,530 --> 00:33:46,190 projecte final. 723 00:33:46,190 --> 00:33:49,590 El primer, en unes poques setmanes, és una pre-proposta, un correu electrònic bastant informal per 724 00:33:49,590 --> 00:33:52,760 el TF per dir o què ets pensant per al seu projecte, amb 725 00:33:52,760 --> 00:33:53,650 sense compromís. 726 00:33:53,650 --> 00:33:56,710 La proposta serà la seva particular, compromís, dient aquí, això és el que 727 00:33:56,710 --> 00:33:57,770 M'agradaria fer per al meu projecte. 728 00:33:57,770 --> 00:33:58,250 Què pensa vostè? 729 00:33:58,250 --> 00:33:58,650 Massa gran? 730 00:33:58,650 --> 00:33:59,145 Massa petit? 731 00:33:59,145 --> 00:34:00,330 És manejable? 732 00:34:00,330 --> 00:34:02,230 I veuen l'especificació per a més detalls. 733 00:34:02,230 --> 00:34:05,060 >> Un parell de setmanes després que l'estat informe, que és una forma similar 734 00:34:05,060 --> 00:34:08,260 email informal al teu TF dir el molt per darrere es troba en la seva última 735 00:34:08,260 --> 00:34:12,360 aplicació del projecte, seguit per el CS50 Hackathon a la qual tots 736 00:34:12,360 --> 00:34:17,520 és convidat, que serà un esdeveniment de 20:00 una nit fins les 7:00 737 00:34:17,520 --> 00:34:19,150 Am del matí següent. 738 00:34:19,150 --> 00:34:22,560 Pizza, com jo ho he dit a la setmana zero, ho vagi a servir a les 9:00 PM, 739 00:34:22,560 --> 00:34:24,120 Menjar xinès a les 1:00 h. 740 00:34:24,120 --> 00:34:27,929 I si vostè encara està despert a les 5:00 PM, el portarem a IHOP per esmorzar. 741 00:34:27,929 --> 00:34:31,310 >> Així que la Hackathon és un dels més experiències memorables a la classe. 742 00:34:31,310 --> 00:34:35,290 A continuació, l'aplicació es deu, i llavors el clímax CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Més detalls sobre totes aquestes en les properes setmanes. 744 00:34:38,070 --> 00:34:40,739 >> Però tornem a alguna cosa vella escola - 745 00:34:40,739 --> 00:34:41,920 de nou, una matriu. 746 00:34:41,920 --> 00:34:45,040 Així que una sèrie estava molt bé, ja que resol problemes com vam veure només una 747 00:34:45,040 --> 00:34:49,290 fa actualment amb les estructures estudiantils posant una mica fora de control si 748 00:34:49,290 --> 00:34:52,405 vull tenir un estudiant, estudiant 2, 3 estudiants, estudiant dot dot dot, 749 00:34:52,405 --> 00:34:54,400 un nombre arbitrari dels estudiants. 750 00:34:54,400 --> 00:34:58,850 >> Així arrays, fa unes setmanes, es va abalançar a i resolt tots els nostres problemes de no 751 00:34:58,850 --> 00:35:03,340 sabent per endavant la quantitat de coses d'algun tipus que podríem desitjar. 752 00:35:03,340 --> 00:35:07,390 I hem vist que les estructures poden ajudar organitzar millor el nostre codi i mantenir 753 00:35:07,390 --> 00:35:11,660 les variables conceptualment similars, com un nom i una casa, junts, pel que 754 00:35:11,660 --> 00:35:15,570 es tracten com un sol entitat, a l'interior dels quals hi ha peces més petites. 755 00:35:15,570 --> 00:35:17,810 >> Però matrius tenen alguns desavantatges. 756 00:35:17,810 --> 00:35:19,780 Quines són algunes de les desavantatges ens hem trobat 757 00:35:19,780 --> 00:35:22,320 amb les matrius fins al moment? 758 00:35:22,320 --> 00:35:23,450 Què és això? 759 00:35:23,450 --> 00:35:28,130 Mida fix - pel que tot i que podria ser capaç d'assignar memòria per a una 760 00:35:28,130 --> 00:35:32,310 matriu, un cop heu escoltat el nombre d'estudiants vostè té, quants caràcters té 761 00:35:32,310 --> 00:35:35,460 per part de l'usuari, un cop ha assignat la matriu, has classe de pintades 762 00:35:35,460 --> 00:35:36,740 a tu mateix en una cantonada. 763 00:35:36,740 --> 00:35:40,600 >> Perquè no es pot inserir nous elements al centre d'una matriu. 764 00:35:40,600 --> 00:35:43,660 No es pot inserir més elements al final d'una matriu. 765 00:35:43,660 --> 00:35:47,750 Realment, cal recórrer a la creació d'un conjunt completament nou, com hem comentat, 766 00:35:47,750 --> 00:35:49,320 la còpia de l'antiga a la nova. 767 00:35:49,320 --> 00:35:52,610 I de nou, que és el mal de cap que GetString ofertes per tu. 768 00:35:52,610 --> 00:35:56,170 >> Però, de nou, ni tan sols es pot inserir alguna cosa al centre de la matriu 769 00:35:56,170 --> 00:35:58,200 si la taxa no s'omple completament. 770 00:35:58,200 --> 00:36:03,010 Per exemple, si aquesta matriu aquí de mida sis només té cinc coses en ella, 771 00:36:03,010 --> 00:36:06,080 així, vostè podria virar alguna cosa a l'extrem. 772 00:36:06,080 --> 00:36:08,200 Però el que si desitja inserir una cosa en el medi de la 773 00:36:08,200 --> 00:36:11,280 conjunt, tot i que podria tenir cinc dels sis que hi ha en ell? 774 00:36:11,280 --> 00:36:14,250 >> Bé, què podem fer quan teníem tot dels nostres voluntaris en l'escenari en 775 00:36:14,250 --> 00:36:15,110 setmana passat? 776 00:36:15,110 --> 00:36:18,710 Si volguéssim posar a algú aquí, ja sigui aquestes persones com moure aquest 777 00:36:18,710 --> 00:36:22,540 manera, o aquesta gent com moure aquest manera, i que es va convertir car. 778 00:36:22,540 --> 00:36:26,950 El desplaçament de persones a l'interior d'un array acabar sumant i costos 779 00:36:26,950 --> 00:36:31,240 nosaltres temps, per tant, gran part del nostre n quadrat temps de funcionament com l'ordenació per inserció, per 780 00:36:31,240 --> 00:36:32,550 exemple, en el pitjor dels casos. 781 00:36:32,550 --> 00:36:36,520 Així les matrius són grans, però cal sap per endavant la mida que voleu. 782 00:36:36,520 --> 00:36:38,030 >> Així que bé, aquí està la solució. 783 00:36:38,030 --> 00:36:43,860 Si no sé per endavant quantes estudiants que puguin tenir, i sé que un cop 784 00:36:43,860 --> 00:36:47,870 Jo decideixo, però, m'he de quedar amb aquesta molts estudiants, per què no ho faig jo sempre 785 00:36:47,870 --> 00:36:51,740 assignar el doble d'espai com podria pensar que necessito? 786 00:36:51,740 --> 00:36:54,450 ¿No és una solució raonable? 787 00:36:54,450 --> 00:36:58,240 >> Sent realistes, no crec que estem va a necessitar més de 50 ranures 788 00:36:58,240 --> 00:37:02,190 en un arranjament per una classe de grandària mitjana, així que anem a la tornada de dalt. 789 00:37:02,190 --> 00:37:07,040 Faré 100 slots en el meu matriu, només perquè puguem aconseguir definitivament la 790 00:37:07,040 --> 00:37:10,330 nombre d'estudiants que espero estar en alguna mena de grandària mitjana. 791 00:37:10,330 --> 00:37:14,320 Així que per què no reunir i assignar més memòria, en general, per a una matriu 792 00:37:14,320 --> 00:37:16,290 del que pensa que fins i tot podria necessitar? 793 00:37:16,290 --> 00:37:20,190 Què és aquest simple retrocés a aquesta idea? 794 00:37:20,190 --> 00:37:21,440 >> Estàs perdent la memòria. 795 00:37:21,440 --> 00:37:25,350 Literalment, cada programa s'escriu a continuació, és potser l'ús del doble de memòria que 796 00:37:25,350 --> 00:37:26,680 que realment necessita. 797 00:37:26,680 --> 00:37:28,990 I això simplement no se sent com un particularment elegant solució. 798 00:37:28,990 --> 00:37:31,990 D'altra banda, només es disminueix la probabilitat que un problema. 799 00:37:31,990 --> 00:37:35,300 Si li passa que té un curs molt popular un semestre i té 101 800 00:37:35,300 --> 00:37:39,610 els estudiants, el programa segueix sent s'enfronta fonamentalment el mateix problema. 801 00:37:39,610 --> 00:37:44,280 >> Així que per sort, hi ha una solució per a Aquest anunci de tots els nostres problemes en forma 802 00:37:44,280 --> 00:37:46,790 d'estructures de dades que estan més complexos que els 803 00:37:46,790 --> 00:37:47,970 que hem vist fins al moment. 804 00:37:47,970 --> 00:37:50,530 Això, afirmo, és una llista enllaçada. 805 00:37:50,530 --> 00:37:51,920 Aquesta és una llista dels números - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, i 34 - 807 00:37:54,970 --> 00:38:00,120 que han estat units entre si per mitjà del que he dibuixat com fletxes. 808 00:38:00,120 --> 00:38:03,580 >> En altres paraules, si jo volia representar una matriu, que podria fer 809 00:38:03,580 --> 00:38:04,910 alguna cosa com això. 810 00:38:04,910 --> 00:38:07,310 I vaig a posar això al cap en un moment. 811 00:38:07,310 --> 00:38:09,970 Que podia fer - 812 00:38:09,970 --> 00:38:12,520 hola, molt bé. 813 00:38:12,520 --> 00:38:14,470 En espera. 814 00:38:14,470 --> 00:38:17,360 Equip nou aquí, és clar - 815 00:38:17,360 --> 00:38:18,090 Està bé. 816 00:38:18,090 --> 00:38:21,730 >> Així que si tinc aquests números en ordre de batalla - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 no necessàriament a escala. 819 00:38:30,530 --> 00:38:33,730 Molt bé, així que aquí està la meva sèrie - 820 00:38:33,730 --> 00:38:34,980 oh el meu déu. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Molt bé, així que aquí està la meva matriu. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh, Déu meu. 825 00:38:45,050 --> 00:38:48,820 >> [El] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Pretend. 827 00:38:49,440 --> 00:38:52,330 És massa esforç per tornar i arreglar això, de manera que - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Així que tenim aquest conjunt de 9, 17, 22, 26, i 34. 830 00:38:57,650 --> 00:39:00,260 Per a aquells de vostès pot veure el vergonyós error que acaba de fer, 831 00:39:00,260 --> 00:39:00,830 aquí està. 832 00:39:00,830 --> 00:39:04,490 >> Per això afirmo que es tracta d'una solució molt eficient. 833 00:39:04,490 --> 00:39:07,310 He assignar tants punts com Necessito - un, dos, tres, 834 00:39:07,310 --> 00:39:09,100 quatre, cinc, o sis - 835 00:39:09,100 --> 00:39:11,660 i després m'he emmagatzemat els números dins d'aquesta gamma. 836 00:39:11,660 --> 00:39:15,220 Però suposem que, aleshores, vull inserir un valor com el número 8? 837 00:39:15,220 --> 00:39:16,100 Bé, on va? 838 00:39:16,100 --> 00:39:18,530 Suposem que vull inserir un nombre com 20. 839 00:39:18,530 --> 00:39:19,790 Bé, on va? 840 00:39:19,790 --> 00:39:23,160 En algun lloc en el medi, o el nombre 35 ha d'anar 841 00:39:23,160 --> 00:39:24,010 en algun lloc a l'extrem. 842 00:39:24,010 --> 00:39:25,320 Però m'he quedat sense espai. 843 00:39:25,320 --> 00:39:29,120 >> I així, aquest és un repte fonamental de matrius que no són la solució. 844 00:39:29,120 --> 00:39:32,280 Vaig afirmar fa un moment, GetString resol aquest problema. 845 00:39:32,280 --> 00:39:37,380 Per inserir un sisè nombre en aquesta matriu, el que és com a mínim un 846 00:39:37,380 --> 00:39:40,090 solució que vostè pot recórrer amb certesa, igual que fem amb GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Què és això? 849 00:39:46,030 --> 00:39:48,190 >> Bé, fer-lo més gran es més fàcil de dir que de fer. 850 00:39:48,190 --> 00:39:52,810 No podem necessàriament que la matriu més gran, però què podem fer? 851 00:39:52,810 --> 00:39:56,570 Fer una nova matriu que és més gran, de la mida d' 6, o potser de la mida 10, si volem 852 00:39:56,570 --> 00:40:00,490 per avançar-se a les coses i, a continuació, copiar l'antiga matriu a la nova, i després 853 00:40:00,490 --> 00:40:01,680 alliberar la vella matriu. 854 00:40:01,680 --> 00:40:05,770 >> Però quin és el temps d'execució ara d'aquest procés? 855 00:40:05,770 --> 00:40:09,870 És gran O de n, a causa que la còpia costarà algunes unitats de 856 00:40:09,870 --> 00:40:13,480 temps, així que no és tan ideal si hem de assignar una nova gamma, que va 857 00:40:13,480 --> 00:40:15,610 per consumir dues vegades com a molt memòria temporalment. 858 00:40:15,610 --> 00:40:16,660 Copieu vell en nou - 859 00:40:16,660 --> 00:40:18,800 Vull dir, és només un mal de cap, que és, de nou, per què escrivim 860 00:40:18,800 --> 00:40:19,920 GetString per a vostè. 861 00:40:19,920 --> 00:40:21,380 >> Llavors, què podríem fer en el seu lloc? 862 00:40:21,380 --> 00:40:25,000 Bé, i si la nostra estructura de dades en realitat té llacunes en ella? 863 00:40:25,000 --> 00:40:30,790 Suposem que em relaxo meu objectiu de tenir blocs contigus de memòria, en la seva 9 864 00:40:30,790 --> 00:40:34,500 està just al costat de 17, que és just al costat de 22, i així successivament. 865 00:40:34,500 --> 00:40:39,570 >> I suposem que el 9 pot ser aquí a RAM, i 17 poden estar aquí a la memòria RAM, 866 00:40:39,570 --> 00:40:40,990 i 22 poden estar aquí a la RAM. 867 00:40:40,990 --> 00:40:43,610 En altres paraules, jo no els necessito fins i tot Esquena amb esquena més. 868 00:40:43,610 --> 00:40:47,850 Només he de enfilar una agulla d'alguna manera a través de cada un d'aquests números, o cada un 869 00:40:47,850 --> 00:40:51,010 d'aquests nodes, ja que anem a cridar l' rectangles com jo els he dibuixat, a 870 00:40:51,010 --> 00:40:55,670 recordar com arribar a l'última tals node de la primera. 871 00:40:55,670 --> 00:40:59,940 >> Llavors, quina és la construcció de programació que hem vist fa poc amb la qual 872 00:40:59,940 --> 00:41:03,030 pot implementar aquest fil, o dibuixat aquí, amb la qual puc 873 00:41:03,030 --> 00:41:05,430 aplicar aquestes fletxes? 874 00:41:05,430 --> 00:41:06,500 Punters així, oi? 875 00:41:06,500 --> 00:41:09,560 Si no assigna només una int, però un node - i per 876 00:41:09,560 --> 00:41:10,810 node, em refereixo a contenidor. 877 00:41:10,810 --> 00:41:12,900 I visualment, em refereixo a un rectangle. 878 00:41:12,900 --> 00:41:16,420 Així aparentment necessita un node per contenir dos valors - 879 00:41:16,420 --> 00:41:21,490 el mateix int, i després, com es dedueix de la meitat inferior del rectangle, 880 00:41:21,490 --> 00:41:23,010 espai suficient per a un int. 881 00:41:23,010 --> 00:41:26,130 >> Així que pensant en el futur aquí, el gran que és aquest node, això 882 00:41:26,130 --> 00:41:27,170 contenidor de què es tracti? 883 00:41:27,170 --> 00:41:29,250 Quants bytes per al int? 884 00:41:29,250 --> 00:41:31,310 Presumiblement 4, si és la mateixa, com de costum. 885 00:41:31,310 --> 00:41:33,270 I llavors quants bytes per al punter? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Així que aquest contenidor o aquest node, és serà una estructura de 8 bytes. 888 00:41:37,940 --> 00:41:41,760 Ah, i això és una feliç coincidència que que acaba de presentar aquesta idea de 889 00:41:41,760 --> 00:41:44,400 una estructura o una estructura de C. 890 00:41:44,400 --> 00:41:48,890 >> Per això afirmo que vull donar un pas cap a aquest més sofisticat 891 00:41:48,890 --> 00:41:52,560 aplicació d'una llista de nombres, un llista enllaçada de nombres, he de fer una 892 00:41:52,560 --> 00:41:56,920 poc més de pensament en la davantera i declarar no només un int, però una estructura 893 00:41:56,920 --> 00:41:58,620 que vaig a trucar, convencionalment aquí, el node. 894 00:41:58,620 --> 00:42:01,630 Podríem dir qualsevol cosa que vulguem, però node serà temàtics en un munt 895 00:42:01,630 --> 00:42:03,560 de les coses que vam començar veient ara. 896 00:42:03,560 --> 00:42:06,480 >> A l'interior d'aquest node és un n int. 897 00:42:06,480 --> 00:42:09,350 I després aquesta sintaxi, una mica estrany a primera vista - 898 00:42:09,350 --> 00:42:12,960 struct node * següent. 899 00:42:12,960 --> 00:42:16,900 Bé il · lustrat, què és això? 900 00:42:16,900 --> 00:42:21,000 Aquesta és la part inferior de el rectangle que vam veure 901 00:42:21,000 --> 00:42:22,730 fa un moment. 902 00:42:22,730 --> 00:42:27,600 >> Però per què estic dient struct node * en lloc de només node *? 903 00:42:27,600 --> 00:42:31,370 Perquè si aquest punter apunta en un altre node, és només la 904 00:42:31,370 --> 00:42:32,760 direcció d'un node. 905 00:42:32,760 --> 00:42:35,630 Això és coherent amb el que hem discutit sobre els punters fins al moment. 906 00:42:35,630 --> 00:42:39,690 Però per què, si puc reclamar aquesta estructura és anomenat node, he de dir struct 907 00:42:39,690 --> 00:42:42,660 node dins d'aquesta llista? 908 00:42:42,660 --> 00:42:43,190 >> Exactament. 909 00:42:43,190 --> 00:42:46,490 És una espècie d'una realitat estúpida C. La definició de tipus, per així dir-ho, no té 910 00:42:46,490 --> 00:42:47,220 succeït encara. 911 00:42:47,220 --> 00:42:48,510 C és molt literal. 912 00:42:48,510 --> 00:42:51,050 Es llegeix el codi a la part superior baix, d'esquerra a dreta. 913 00:42:51,050 --> 00:42:54,930 I fins que arribi a aquest punt i coma a la línia de fons, suposo que el que no 914 00:42:54,930 --> 00:42:57,590 existir com un tipus de dades? 915 00:42:57,590 --> 00:42:59,060 Node, el node entre cometes. 916 00:42:59,060 --> 00:43:03,050 >> Però a causa de la més detallat declaració que vaig fer a la primera línia - 917 00:43:03,050 --> 00:43:05,340 node typedef struct - 918 00:43:05,340 --> 00:43:08,790 ja que va ser primer, abans de la claus, això és una cosa així com 919 00:43:08,790 --> 00:43:11,800 pre-educar Clang això, saber què, dóna'm una estructura 920 00:43:11,800 --> 00:43:13,570 anomenat node d'estructura. 921 00:43:13,570 --> 00:43:16,270 Francament, no m'agraden les coses de trucades struct node, struct node tot 922 00:43:16,270 --> 00:43:17,090 a través del meu codi. 923 00:43:17,090 --> 00:43:20,660 Però jo només vaig a utilitzar una vegada, just a l'interior, perquè jo pugui efectivament 924 00:43:20,660 --> 00:43:25,010 crear una mena de referència circular, no un punter a mi mateix per se, sinó un 925 00:43:25,010 --> 00:43:29,400 punter a un altre de un tipus idèntic. 926 00:43:29,400 --> 00:43:32,330 >> Per tant, resulta que en una estructura de dades així, hi ha uns quants 927 00:43:32,330 --> 00:43:34,470 operacions que podrien ser d'interès per a nosaltres. 928 00:43:34,470 --> 00:43:37,460 Potser voleu inserir en una llista com aquesta. 929 00:43:37,460 --> 00:43:39,850 Potser voleu suprimir a partir d'una llista com aquesta. 930 00:43:39,850 --> 00:43:43,490 Pot ser que vulgueu cercar a la llista de valor, o més en general, transversal. 931 00:43:43,490 --> 00:43:46,410 I travessa és només una forma elegant de dient començament a l'esquerra i seguir tot 932 00:43:46,410 --> 00:43:47,650 el camí a la dreta. 933 00:43:47,650 --> 00:43:52,640 >> I fixin-se, fins i tot amb aquest una mica més estructura de dades sofisticada, deixi 934 00:43:52,640 --> 00:43:56,510 em proposo que puguem demanar prestat una mica de les idees de les últimes dues setmanes i 935 00:43:56,510 --> 00:43:58,410 implementar una funció anomenada buscar així. 936 00:43:58,410 --> 00:44:01,360 Es va a tornar true o falsa, el que indica, si o 937 00:44:01,360 --> 00:44:03,390 no, n és a la llista. 938 00:44:03,390 --> 00:44:05,960 El seu segon argument és un punter a la llista en si pel que un 939 00:44:05,960 --> 00:44:07,920 punter a un node. 940 00:44:07,920 --> 00:44:10,350 >> Tot el que faré és declarar a continuació una variable temporal. 941 00:44:10,350 --> 00:44:12,730 L'anomenarem ptr per convenció, per al punter. 942 00:44:12,730 --> 00:44:15,220 I jo assigno igual a la principi de la llista. 943 00:44:15,220 --> 00:44:16,680 >> I ara observeu el bucle while. 944 00:44:16,680 --> 00:44:20,640 Mentre punter no és igual en nul, vaig a comprovar. 945 00:44:20,640 --> 00:44:24,520 És punter de fletxa n igual a n el que es va aprovar? 946 00:44:24,520 --> 00:44:26,410 I esperar un minut - nou tros de sintaxi. 947 00:44:26,410 --> 00:44:29,324 Què és la fletxa, de sobte? 948 00:44:29,324 --> 00:44:30,574 Sí? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Exactament. 951 00:44:34,810 --> 00:44:38,860 Així que mentre que fa uns minuts, es va utilitzar la notació de punts per accedir a alguna cosa 952 00:44:38,860 --> 00:44:43,080 a l'interior d'un l'estructura, si la variable que tenen no és l'estructura 953 00:44:43,080 --> 00:44:47,420 si mateix, sinó un punter a una estructura, per sort, un tros de sintaxi 954 00:44:47,420 --> 00:44:48,620 finalment té sentit intuïtiu. 955 00:44:48,620 --> 00:44:52,360 La fletxa significa seguir el punter, com les nostres fletxes normalment signifiquen 956 00:44:52,360 --> 00:44:56,570 gràficament, i anar a camp de dades a l'interior. 957 00:44:56,570 --> 00:44:59,700 Així fletxa és la mateixa cosa que punt, però utilitzar quan es té un punter. 958 00:44:59,700 --> 00:45:05,270 >> Així que per recapitular a continuació, si el camp n interior de l'estructura anomenada punter 959 00:45:05,270 --> 00:45:07,760 igual a igual a n, torni realitat. 960 00:45:07,760 --> 00:45:11,970 En cas contrari, aquesta línia aquí - punter és igual a punter següent. 961 00:45:11,970 --> 00:45:17,540 Llavors, què està fent això, avís, és si Actualment estic apuntant a l'estructura 962 00:45:17,540 --> 00:45:21,430 que conté 9, i 9 no és el nombre Busco - Suposo que estic buscant 963 00:45:21,430 --> 00:45:22,830 per n és igual a 50 - 964 00:45:22,830 --> 00:45:25,930 Vaig a actualitzar el meu punter temporal al no assenyalar en aquest node 965 00:45:25,930 --> 00:45:31,190 més, però punter de fletxa del costat, que em posarà aquí. 966 00:45:31,190 --> 00:45:34,270 >> Ara, em vaig adonar és un remolí la introducció. 967 00:45:34,270 --> 00:45:37,380 Dimecres farem realitat aquest amb alguns éssers humans i amb una mica més 968 00:45:37,380 --> 00:45:38,900 codi a un ritme més lent. 969 00:45:38,900 --> 00:45:42,990 Però adonar-se, ara estem fent els nostres dades estructures més complexes perquè el nostre 970 00:45:42,990 --> 00:45:45,780 algoritmes pot obtenir més eficient, el que serà necessari per 971 00:45:45,780 --> 00:45:50,500 PSET 6, quan carreguem en, de nou, els 150.000 paraules, però ho ha de fer 972 00:45:50,500 --> 00:45:55,650 eficient, i l'ideal és crear un programa que té una durada de nostres usuaris no 973 00:45:55,650 --> 00:46:00,460 lineal, no en n quadrat, però en constant de temps, en l'ideal. 974 00:46:00,460 --> 00:46:02,300 >> Ens veiem dimecres. 975 00:46:02,300 --> 00:46:07,240 >> ALTAVEU: En la següent CS50, David oblida el seu cas base. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: I aquesta és la forma d'enviar missatges de text amb C. El que el - 977 00:46:12,770 --> 00:46:14,020 >> [MISSATGE DE TEXT DIVERSOS NOTIFICACIÓ DE SONS] 978 00:46:14,020 --> 00:46:19,734