1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Setmana 4] 2 00:00:03,000 --> 00:00:05,000 [David J. Malan] [Harvard University] 3 00:00:05,000 --> 00:00:08,000 [Aquesta és CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Molt bé, això és CS50, i aquest és el començament de la setmana 4, 5 00:00:12,000 --> 00:00:16,000 i aquest és un dels algorismes d'ordenació més lenta possible. 6 00:00:16,000 --> 00:00:19,000 Quin era el que acabo de veure allà? 7 00:00:19,000 --> 00:00:24,000 Això era una mena de bombolla, per gran O (n ^ 2) + resum, 8 00:00:24,000 --> 00:00:28,000 i de fet no som els únics en aquest món sembla saber 9 00:00:28,000 --> 00:00:30,000 quin tipus bombolla o és el seu temps d'execució. 10 00:00:30,000 --> 00:00:33,000 En efecte, es tractava d'una entrevista amb Eric Schmidt de Google 11 00:00:33,000 --> 00:00:45,000 i l'ex senador Barack Obama només uns pocs anys enrere. 12 00:00:45,000 --> 00:00:48,000 >> Ara, el senador, que és aquí a Google, 13 00:00:48,000 --> 00:00:54,000 i m'agrada pensar en la presidència com una entrevista de treball. 14 00:00:54,000 --> 00:00:58,000 Ara, és difícil aconseguir una feina com a president, i vostè va a través dels rigors ara. 15 00:00:58,000 --> 00:01:00,000 També és difícil aconseguir una feina a Google. 16 00:01:00,000 --> 00:01:05,000 Tenim preguntes, i li demanem a les nostres preguntes candidats, 17 00:01:05,000 --> 00:01:10,000 i aquest és el de Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 Vostès pensen que estic fent broma? Està just aquí. 19 00:01:14,000 --> 00:01:18,000 Quina és la forma més eficient per ordenar un milió d'enters de 32 bits? 20 00:01:18,000 --> 00:01:21,000 [Rialles] 21 00:01:21,000 --> 00:01:24,000 Well- 22 00:01:24,000 --> 00:01:26,000 Em sap greu. >> No, no, no, no. 23 00:01:26,000 --> 00:01:34,000 Crec que l'ordenament de bombolla seria el camí equivocat. 24 00:01:34,000 --> 00:01:39,000 >> Anem, qui li va dir això? 25 00:01:39,000 --> 00:01:43,000 La setmana passada recordar que prenem un descans de codi, si més no per un dia, 26 00:01:43,000 --> 00:01:46,000 i va començar a concentrar-se en algunes idees d'alt nivell i resolució de problemes de manera més general 27 00:01:46,000 --> 00:01:49,000 en el context de recerca i classificació, 28 00:01:49,000 --> 00:01:53,000 i hem introduït una cosa que no teníem un copet aquest nom en la setmana passada, 29 00:01:53,000 --> 00:01:56,000 però notació asimptòtica, el Big O, l'Omega Big, 30 00:01:56,000 --> 00:02:00,000 i de vegades la notació gran Theta, i aquests eren simplement formes 31 00:02:00,000 --> 00:02:02,000 de descriure el temps d'execució d'algorismes, 32 00:02:02,000 --> 00:02:05,000 la quantitat de temps que li pren a un algoritme per executar. 33 00:02:05,000 --> 00:02:08,000 >> I vostè pot recordar que vostè va parlar sobre el temps d'execució en funció de la grandària 34 00:02:08,000 --> 00:02:11,000 de l'entrada, que generalment anomenem n, sigui quin sigui el problema que sigui, 35 00:02:11,000 --> 00:02:13,000 on n és el nombre de persones a l'habitació, 36 00:02:13,000 --> 00:02:17,000 el nombre de pàgines d'un llibre de telèfon, i ens vam posar a escriure les coses 37 00:02:17,000 --> 00:02:21,000 com O (n ^ 2) o O (n) o O (n log n), 38 00:02:21,000 --> 00:02:24,000 i fins i tot quan les matemàtiques no va tenir els resultats esperats amb tanta perfecció 39 00:02:24,000 --> 00:02:28,000 i va ser n ² - n / 2 o alguna cosa per l'estil 40 00:02:28,000 --> 00:02:31,000 que en canvi només llençar alguns dels termes d'ordre inferior, 41 00:02:31,000 --> 00:02:34,000 i la motivació no és que de veritat volem un 42 00:02:34,000 --> 00:02:37,000 espècie de manera objectiva d'avaluar 43 00:02:37,000 --> 00:02:39,000 l'acompliment dels programes o el rendiment dels algorismes 44 00:02:39,000 --> 00:02:42,000 que al final del dia no té res a fer, per exemple, 45 00:02:42,000 --> 00:02:45,000 amb la velocitat del seu equip avui. 46 00:02:45,000 --> 00:02:47,000 >> Per exemple, si implementa l'ordenació de bombolla, 47 00:02:47,000 --> 00:02:50,000 o implementar fusionar sort sort o selecció a l'ordinador d'avui, 48 00:02:50,000 --> 00:02:53,000 un equip de 2 GHz, i que l'executi, 49 00:02:53,000 --> 00:02:56,000 i es necessita un cert nombre de segons, l'any que ve hi ha un 3 GHz 50 00:02:56,000 --> 00:02:59,000 o un ordinador de 4 GHz, i vostè pot llavors afirmar que "Wow, el meu algorisme 51 00:02:59,000 --> 00:03:03,000 Ara és el doble de ràpid ", quan en realitat això no és òbviament el cas. 52 00:03:03,000 --> 00:03:06,000 És només el maquinari s'ha tornat més ràpid, però l'equip 53 00:03:06,000 --> 00:03:10,000 no té, i el que realment volen desfer-se de coses com 54 00:03:10,000 --> 00:03:13,000 múltiples de 2 o múltiples de 3, quan es tracta de descriure 55 00:03:13,000 --> 00:03:17,000 què tan ràpid o lent com un algorisme és just i realment es centren 56 00:03:17,000 --> 00:03:20,000 en n o algun factor d'aquest, 57 00:03:20,000 --> 00:03:24,000 una mica d'energia dels mateixos com en el cas de les classes de la setmana passada. 58 00:03:24,000 --> 00:03:27,000 I recordar que, amb l'ajuda de l'espècie de barreja 59 00:03:27,000 --> 00:03:31,000 hem estat capaços de fer-ho molt millor que l'ordenació de bombolla i ordenament per selecció 60 00:03:31,000 --> 00:03:33,000 i fins i tot la inserció de classificació. 61 00:03:33,000 --> 00:03:36,000 >> Ens vam posar mans a la n log n, i una altra, 62 00:03:36,000 --> 00:03:39,000 Recordem que log n generalment es refereix a alguna cosa que creix 63 00:03:39,000 --> 00:03:43,000 més lentament n, de manera que n log n fins ara era bo 64 00:03:43,000 --> 00:03:45,000 perquè era menys de ² n. 65 00:03:45,000 --> 00:03:47,000 Però per aconseguir n log n amb una mena de barreja 66 00:03:47,000 --> 00:03:51,000 el que va ser el germen d'una idea bàsica que havíem d'aprofitar 67 00:03:51,000 --> 00:03:54,000 que també va aprofitar de nou a la setmana 0? 68 00:03:54,000 --> 00:03:58,000 Com abordem el problema de classificació intel · ligent amb una mena de barreja? 69 00:03:58,000 --> 00:04:04,000 Quina va ser la idea clau, potser? 70 00:04:04,000 --> 00:04:07,000 Qualsevol persona en absolut. 71 00:04:07,000 --> 00:04:09,000 Bé, anem a fer un pas enrere. 72 00:04:09,000 --> 00:04:11,000 Descriure merge sort en les seves pròpies paraules. 73 00:04:11,000 --> 00:04:15,000 Com funciona? 74 00:04:15,000 --> 00:04:17,000 Bé, anem a remar de nou a 0 la setmana. 75 00:04:17,000 --> 00:04:19,000 Bé, sí. 76 00:04:19,000 --> 00:04:22,000 [Inaudible-alumne] 77 00:04:22,000 --> 00:04:26,000 Bé, bé, així que divideix el conjunt dels nombres en 2 peces. 78 00:04:26,000 --> 00:04:29,000 Hem classificat cadascuna d'aquestes peces, i després els van fusionar, 79 00:04:29,000 --> 00:04:33,000 i hem vist aquesta idea abans de prendre un problema que és tan gran 80 00:04:33,000 --> 00:04:36,000 i picant cap amunt en un problema que és tan gran o voluminós, aquesta. 81 00:04:36,000 --> 00:04:38,000 >> Recordem l'exemple guia telefònica. 82 00:04:38,000 --> 00:04:42,000 Recordem l'algorisme d'auto-recompte de setmanes enrere, 83 00:04:42,000 --> 00:04:45,000 espècie per fusionar va ser resumit per aquest pseudocodi aquí. 84 00:04:45,000 --> 00:04:48,000 Quan et donen n elements, primer va ser comprovació de validesa. 85 00:04:48,000 --> 00:04:51,000 Si n <2, llavors no faig res en absolut 86 00:04:51,000 --> 00:04:55,000 perquè si n <2 llavors n és 0 o 1, òbviament, 87 00:04:55,000 --> 00:04:57,000 i el que si és 0 o 1, no hi ha res a ordenar. 88 00:04:57,000 --> 00:04:59,000 Això és tot. 89 00:04:59,000 --> 00:05:01,000 La llista ja està trivialment ordenat. 90 00:05:01,000 --> 00:05:04,000 Però d'altra banda, si tens dos o més elements que endavant i dividir 91 00:05:04,000 --> 00:05:06,000 en 2 meitats, esquerra i dreta. 92 00:05:06,000 --> 00:05:09,000 Classifiqueu cadascuna d'aquestes meitats, i després fusionar les dues meitats ordenades. 93 00:05:09,000 --> 00:05:13,000 Però el problema aquí és que a primera vista això sembla que estem batea. 94 00:05:13,000 --> 00:05:17,000 Aquesta és una definició circular en què si jo he demanat que ordenar aquests n elements 95 00:05:17,000 --> 00:05:22,000 i que m'estàs dient "Està bé, està bé, anem a ordenar els elements n / 2 in aquells / 2" 96 00:05:22,000 --> 00:05:27,000 llavors la meva pregunta ve serà "bé, com classificar el n / 2 elements?" 97 00:05:27,000 --> 00:05:30,000 >> Però a causa de l'estructura d'aquest programa, 98 00:05:30,000 --> 00:05:33,000 perquè no és aquest el cas base, per així dir-ho, 99 00:05:33,000 --> 00:05:39,000 aquest cas especial que diu que si n és 00:05:42,000 No respongui amb aquesta resposta circular mateix. 101 00:05:42,000 --> 00:05:46,000 Aquest procés, aquesta ciclicitat finalment acabarà. 102 00:05:46,000 --> 00:05:50,000 Si et pregunto "Sort aquests n elements," i vostè diu: "Està bé, ordenar aquests n / 2" 103 00:05:50,000 --> 00:05:53,000 llavors dius, "una espècie bé, aquests n / 4, n / 8, N/16," 104 00:05:53,000 --> 00:05:56,000 eventualment podràs dividir per un nombre prou gran 105 00:05:56,000 --> 00:05:59,000 que tindrà només un element de l'esquerra, moment en què es pot dir, 106 00:05:59,000 --> 00:06:02,000 "Aquí, aquí hi ha un element ordenats simple". 107 00:06:02,000 --> 00:06:06,000 A continuació, la brillantor d'aquest algorisme aquí és derivar del fet 108 00:06:06,000 --> 00:06:09,000 que una vegada que tingui totes aquestes llistes individualment ordenats, 109 00:06:09,000 --> 00:06:12,000 tots els quals són de grandària 1, que sembla ser inútil, 110 00:06:12,000 --> 00:06:15,000 una vegada que iniciï la seva fusió i la fusió 111 00:06:15,000 --> 00:06:19,000 construir l'edifici finalment com Rob va fer en el vídeo finalment una llista ordenada. 112 00:06:19,000 --> 00:06:22,000 >> Però aquesta idea s'estén molt més enllà de la classificació. 113 00:06:22,000 --> 00:06:26,000 Hi ha aquesta idea incrustada en aquest programa es coneix com recursió, 114 00:06:26,000 --> 00:06:29,000 de manera que la idea és un programa, 115 00:06:29,000 --> 00:06:32,000 i per resoldre algun problema que et digui, 116 00:06:32,000 --> 00:06:36,000 o posar en el context dels llenguatges de programació que estan en funció, 117 00:06:36,000 --> 00:06:39,000 i amb la finalitat de resoldre un problema, la funció diu a si mateix 118 00:06:39,000 --> 00:06:42,000 una i altra vegada i una altra, però la funció 119 00:06:42,000 --> 00:06:44,000 no pot cridar-se a si mateix infinites vegades. 120 00:06:44,000 --> 00:06:47,000 Finalment, té fins arribar al fons, per dir-ho, 121 00:06:47,000 --> 00:06:49,000 i tenen alguna condició de base rígida que diu 122 00:06:49,000 --> 00:06:53,000 en aquest moment deixa de cridar vostè mateix perquè tot el procés 123 00:06:53,000 --> 00:06:56,000 Finalment és de fet aturar. 124 00:06:56,000 --> 00:06:58,000 Què significa això en realitat, a recurse? 125 00:06:58,000 --> 00:07:01,000 >> A veure si podem fer un exemple simple, trivial amb, diguem, 126 00:07:01,000 --> 00:07:03,000 3 persones amb mi fins aquí a l'escenari, si algú se senti còmode. 127 00:07:03,000 --> 00:07:06,000 1, anem a dalt, 2 i 3. 128 00:07:06,000 --> 00:07:09,000 3 Si volen venir aquí. 129 00:07:09,000 --> 00:07:12,000 Si vols estar al meu costat aquí a una línia, suposem que el problema en qüestió 130 00:07:12,000 --> 00:07:15,000 és molt trivial comptar el nombre de persones que són aquí. 131 00:07:15,000 --> 00:07:18,000 Però, francament, estic cansat de tots aquests exemples de comptatge. 132 00:07:18,000 --> 00:07:21,000 Això va a portar el seu temps, 1, 2, i punt, punt, punt. 133 00:07:21,000 --> 00:07:23,000 Això trigarà una eternitat. 134 00:07:23,000 --> 00:07:25,000 Prefereixo punt aquest problema en conjunt amb l'ajuda de quin és el teu nom? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, està bé. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly i? 137 00:07:29,000 --> 00:07:31,000 >> Willy. >> Willy, Sara, Kelly, i Willy. 138 00:07:31,000 --> 00:07:34,000 Ara mateix m'he fet la pregunta per algú 139 00:07:34,000 --> 00:07:37,000 nombre de persones que estiguin en aquesta etapa, i no tinc ni idea. 140 00:07:37,000 --> 00:07:40,000 Aquesta és una llista molt llarga, de manera que en lloc d'això faré aquest truc. 141 00:07:40,000 --> 00:07:43,000 Vaig a demanar a la persona al meu costat per fer la major part de l'obra, 142 00:07:43,000 --> 00:07:46,000 i una vegada que es porta a terme fent la majoria del treball 143 00:07:46,000 --> 00:07:49,000 Vaig a fer el mínim de treball possible i només ha d'afegir un 144 00:07:49,000 --> 00:07:51,000 al que la seva resposta és, així que aquí anem. 145 00:07:51,000 --> 00:07:54,000 M'han preguntat quantes persones hi ha a l'escenari. 146 00:07:54,000 --> 00:07:57,000 Quantes persones hi ha a l'escenari a l'esquerra de vostè? 147 00:07:57,000 --> 00:08:00,000 L'esquerra de mi? >> Està bé, però no facis trampa. 148 00:08:00,000 --> 00:08:04,000 Això és bo, això és correcte, però si volem seguir aquesta lògica 149 00:08:04,000 --> 00:08:08,000 suposarem que vol de manera similar a aclarir aquest problema a l'esquerra de vostè, 150 00:08:08,000 --> 00:08:11,000 així que en lloc de contestar directament endavant, passeu la pilota. 151 00:08:11,000 --> 00:08:14,000 Oh, quantes persones hi ha a l'esquerra de mi? 152 00:08:14,000 --> 00:08:16,000 Quantes persones hi ha a l'esquerra? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Rialles] 155 00:08:27,000 --> 00:08:30,000 Bé, 0, així que el que ha fet ara Willy 156 00:08:30,000 --> 00:08:33,000 s'ha tornat la seva resposta dient aquesta adreça 0. 157 00:08:33,000 --> 00:08:36,000 Ara, què ha de fer? >> 1. 158 00:08:36,000 --> 00:08:39,000 Bé, així que vostè és l'1, pel que diuen: "Està bé, vaig a afegir un 159 00:08:39,000 --> 00:08:41,000 a qualsevol nombre de Willy era, "així 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Vostè és ara 1 pel que la seva resposta a la dreta és ara 161 00:08:43,000 --> 00:08:45,000 1. >> I el meu seria 2. 162 00:08:45,000 --> 00:08:48,000 Bé, pel que està prenent la resposta anterior d'1, 163 00:08:48,000 --> 00:08:51,000 l'addició de la quantitat mínima de treball que vol fer, que és +1. 164 00:08:51,000 --> 00:08:55,000 Ara té 2, i després la mà que em valor? 165 00:08:55,000 --> 00:08:57,000 3, és a dir, ho sento, 2. 166 00:08:57,000 --> 00:08:59,000 Bé. 167 00:08:59,000 --> 00:09:02,000 >> Bé, vam tenir 0 a l'esquerra. 168 00:09:02,000 --> 00:09:05,000 Després vam tenir una, i després afegim 2, 169 00:09:05,000 --> 00:09:07,000 i ara m'estàs donant el número 2, 170 00:09:07,000 --> 00:09:10,000 i pel que estic dient, bé, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Hi ha en realitat tres persones de peu al meu costat en aquesta etapa, 172 00:09:13,000 --> 00:09:16,000 així que podria haver fet això, òbviament, molt lineal, 173 00:09:16,000 --> 00:09:19,000 en gran mesura de la manera òbvia, però què fem realment? 174 00:09:19,000 --> 00:09:21,000 Prenem un problema de tamany 3 inicialment. 175 00:09:21,000 --> 00:09:24,000 A continuació, es va trencar en un problema de mida 2, 176 00:09:24,000 --> 00:09:27,000 llavors un problema de mida 1 i, a continuació, finalment, el cas base 177 00:09:27,000 --> 00:09:29,000 Va ser molt, oh, no hi ha ningú allà, 178 00:09:29,000 --> 00:09:33,000 moment en què Willy va tornar efectivament una resposta codificada d'un parell de vegades, 179 00:09:33,000 --> 00:09:36,000 i el segon es va fer bombollejar després cap amunt, brollava, bombollejava, 180 00:09:36,000 --> 00:09:39,000 i després afegint en aquest addicional 1 181 00:09:39,000 --> 00:09:41,000 hem implementat aquesta idea bàsica de la recursivitat. 182 00:09:41,000 --> 00:09:44,000 >> Ara, en aquest cas, realment no resoldre un problema 183 00:09:44,000 --> 00:09:46,000 qualsevol forma més eficaç llavors que hem vist fins ara. 184 00:09:46,000 --> 00:09:48,000 Però pensa en els algoritmes que hem fet a l'escenari fins al moment. 185 00:09:48,000 --> 00:09:51,000 Vam tenir a 8 fulls de paper a la pissarra, 186 00:09:51,000 --> 00:09:55,000 Al vídeo quan Sean estava buscant el número 7, i què va fer realment? 187 00:09:55,000 --> 00:09:58,000 Bé, ell no va fer cap tipus de divideix i venceràs. 188 00:09:58,000 --> 00:10:01,000 Ell no va fer cap tipus de recursió. 189 00:10:01,000 --> 00:10:03,000 Més aviat, ell acaba de fer aquest algorisme lineal. 190 00:10:03,000 --> 00:10:07,000 No obstant això, quan es va introduir la idea de nombres ordenats a l'escenari en viu la setmana passada 191 00:10:07,000 --> 00:10:09,000 després vam tenir aquest instint d'anar cap al centre, 192 00:10:09,000 --> 00:10:13,000 moment en el qual teníem una llista més petita de mida 4 o altra llista de mida 4, 193 00:10:13,000 --> 00:10:17,000 i després vam tenir el mateix problema, de manera que repeteix, repeteix, repeteix. 194 00:10:17,000 --> 00:10:19,000 En altres paraules, recursed. 195 00:10:19,000 --> 00:10:24,000 Moltes gràcies als nostres 3 voluntaris aquí per demostrar la recursivitat amb nosaltres. 196 00:10:24,000 --> 00:10:28,000 >> A veure si podem fer això ara concretar una mica més, 197 00:10:28,000 --> 00:10:30,000 la solució d'un problema que una vegada més podem fer amb força facilitat, 198 00:10:30,000 --> 00:10:34,000 però utilitzarem com a punt de partida per a l'aplicació d'aquesta idea bàsica. 199 00:10:34,000 --> 00:10:37,000 Per calcular la suma d'un munt de nombres, 200 00:10:37,000 --> 00:10:39,000 per exemple, si es passa al número 3, 201 00:10:39,000 --> 00:10:42,000 Vull donar-li el valor de sigma 3, 202 00:10:42,000 --> 00:10:46,000 de manera que la suma de 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Vull tornar a la resposta 6, 204 00:10:48,000 --> 00:10:51,000 així que anem a implementar aquesta funció sigma, aquesta funció suma 205 00:10:51,000 --> 00:10:54,000 que, de nou, presa en entrada i, a continuació torna la suma 206 00:10:54,000 --> 00:10:57,000 d'aquest nombre tot el camí cap avall a 0. 207 00:10:57,000 --> 00:10:59,000 Podríem fer això bastant simple, no? 208 00:10:59,000 --> 00:11:01,000 Podem fer això amb algun tipus d'estructura de bucle, 209 00:11:01,000 --> 00:11:04,000 així que vaig a seguir endavant i que això vagi. 210 00:11:04,000 --> 00:11:07,000 >> Incloure stdio.h. 211 00:11:07,000 --> 00:11:09,000 Déjame entrar principal per treballar aquí. 212 00:11:09,000 --> 00:11:12,000 Anem a guardar això com sigma.c. 213 00:11:12,000 --> 00:11:14,000 Llavors em vaig a anar d'aquí, i vaig a declarar un int n, 214 00:11:14,000 --> 00:11:18,000 i jo vaig a fer el següent mentre l'usuari no cooperar. 215 00:11:18,000 --> 00:11:22,000 Mentre l'usuari no m'ha donat un nombre positiu 216 00:11:22,000 --> 00:11:26,000 m'ho dius a mi anar davant i li demanarà que per an = getInt, 217 00:11:26,000 --> 00:11:28,000 i m'ho dius a mi donar-los algunes instruccions sobre què fer, 218 00:11:28,000 --> 00:11:33,000 així printf ("enter positiu si us plau"). 219 00:11:33,000 --> 00:11:39,000 Només és fàcil en com aquest, així que per quan arribem a la línia 14 220 00:11:39,000 --> 00:11:42,000 ara tenim un nombre enter positiu, presumiblement al n. 221 00:11:42,000 --> 00:11:44,000 >> Ara farem alguna cosa amb ell. 222 00:11:44,000 --> 00:11:50,000 Deixa anar per davant i calcular la suma, de manera que int suma = sigma (n). 223 00:11:50,000 --> 00:11:54,000 Sigma és només la suma, així que estic escrivint en la forma més elegant. 224 00:11:54,000 --> 00:11:56,000 Anem a cridar sigma allà. 225 00:11:56,000 --> 00:11:58,000 Aquesta és la suma, i ara em vaig a imprimir el resultat, 226 00:11:58,000 --> 00:12:08,000 printf ("La suma és% d \ n", suma). 227 00:12:08,000 --> 00:12:11,000 I després vaig a tornar 0 per a una bona mesura. 228 00:12:11,000 --> 00:12:15,000 Hem fet tot el que aquest programa requereix excepte la part interessant, 229 00:12:15,000 --> 00:12:18,000 que és per aplicar a la pràctica la funció de sigma. 230 00:12:18,000 --> 00:12:22,000 >> Deixa aquí baix a la part inferior, i m'ho dius a mi declarar funció sigma. 231 00:12:22,000 --> 00:12:26,000 Ha de prendre una variable és de tipus sencer, 232 00:12:26,000 --> 00:12:30,000 i quin tipus de dades és el que vull tornar presumiblement de sigma? 233 00:12:30,000 --> 00:12:34,000 Int, perquè vull que les meves expectatives en la línia 15. 234 00:12:34,000 --> 00:12:37,000 En aquí m'ho dius a mi seguir endavant i posar en pràctica aquest 235 00:12:37,000 --> 00:12:41,000 d'una manera força senzilla. 236 00:12:41,000 --> 00:12:45,000 >> Seguirem endavant i dir: int suma = 0, 237 00:12:45,000 --> 00:12:47,000 i ara em vaig a anar a prendre una mica de bucle aquí 238 00:12:47,000 --> 00:12:50,000 que dirà alguna cosa com això, 239 00:12:50,000 --> 00:13:01,000 for (int i = 0; I <= nombre, i + +) suma + = i. 240 00:13:01,000 --> 00:13:05,000 I després em vaig a tornar suma. 241 00:13:05,000 --> 00:13:07,000 Que podria haver implementat aquest en qualsevol nombre de maneres. 242 00:13:07,000 --> 00:13:09,000 Podria haver fet servir un bucle while. 243 00:13:09,000 --> 00:13:11,000 Podria haver omès utilitzant la variable suma si realment volia, 244 00:13:11,000 --> 00:13:15,000 però en fi, només tenim una funció que si no ho feia babau declara suma és 0. 245 00:13:15,000 --> 00:13:18,000 Llavors es repeteix des de 0 a dalt a través del número, 246 00:13:18,000 --> 00:13:23,000 i en cada iteració s'afegeix que el valor actual de suma i després torna suma. 247 00:13:23,000 --> 00:13:25,000 >> Ara, hi ha una lleugera optimització d'aquí. 248 00:13:25,000 --> 00:13:29,000 Això és probablement un pas perdut, però que així sigui. Això està bé per ara. 249 00:13:29,000 --> 00:13:32,000 Estem almenys ser exhaustiu i va tot el camí de 0 a endavant. 250 00:13:32,000 --> 00:13:34,000 No és molt dur i directe bonic, 251 00:13:34,000 --> 00:13:37,000 però resulta que amb la funció sigma tenim la mateixa oportunitat 252 00:13:37,000 --> 00:13:39,000 com ho vam fer aquí a l'escenari. 253 00:13:39,000 --> 00:13:42,000 A l'escenari que acabem de comptar quantes persones estaven al meu costat, 254 00:13:42,000 --> 00:13:47,000 però en canvi si volem comptar el número 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 cap avall a 0 vam poder similar punt a una funció 256 00:13:51,000 --> 00:13:55,000 que en lloc descriurem com recursiu. 257 00:13:55,000 --> 00:13:57,000 Aquí farem un judici ràpid comprovar i assegurar-se que no em babau. 258 00:13:57,000 --> 00:14:00,000 >> Sé que hi ha almenys una cosa en aquest programa que em va fer mal. 259 00:14:00,000 --> 00:14:04,000 Quan vaig arribar a entrar aconseguiré qualsevol tipus de cridar? 260 00:14:04,000 --> 00:14:06,000 Què vaig a cridar a això? 261 00:14:06,000 --> 00:14:11,000 Sí, es va oblidar el prototip, així que estic fent servir una funció anomenada sigma en la línia 15, 262 00:14:11,000 --> 00:14:16,000 però no es va declarar fins a la línia 22, així que millor manera proactiva pujar aquí 263 00:14:16,000 --> 00:14:22,000 i declarar un prototip, i diré sigma int (int número), i això és tot. 264 00:14:22,000 --> 00:14:24,000 S'implementa a la part inferior. 265 00:14:24,000 --> 00:14:27,000 >> O una altra manera que pogués resoldre això, 266 00:14:27,000 --> 00:14:30,000 Podia moure la funció-hi, cosa que no és dolent, 267 00:14:30,000 --> 00:14:32,000 però almenys quan els programes comencen a fer llarga, francament, 268 00:14:32,000 --> 00:14:35,000 Crec que hi ha alguna cosa de valor a tenir sempre principal a la part superior 269 00:14:35,000 --> 00:14:38,000 perquè en el lector pot obrir l'arxiu i veure immediatament 270 00:14:38,000 --> 00:14:40,000 el que està fent el programa sense haver de buscar a través d'ella 271 00:14:40,000 --> 00:14:42,000 buscant que la funció principal. 272 00:14:42,000 --> 00:14:49,000 Anirem a la meva finestra de terminal aquí, tracti de fer sigma sigma fer, 273 00:14:49,000 --> 00:14:51,000 i vaig ficar la pota aquí també. 274 00:14:51,000 --> 00:14:55,000 Declaració implícita de la funció getInt significa que m'hagi oblidat de fer allò altre? 275 00:14:55,000 --> 00:14:57,000 [Inaudible-alumne] 276 00:14:57,000 --> 00:15:00,000 Bé, per la qual cosa pel que sembla un error molt comú, així que anem a posar això aquí, 277 00:15:00,000 --> 00:15:04,000 cs50.h, i ara anem a tornar a la meva finestra de terminal. 278 00:15:04,000 --> 00:15:08,000 >> Vaig a esborrar la pantalla, i vaig a fer tornar a executar sigma. 279 00:15:08,000 --> 00:15:11,000 Sembla que s'ha compilat. Permetin-me ara s'executen sigma. 280 00:15:11,000 --> 00:15:15,000 Vaig a escriure el número 3, i em van donar 6, així que no és un xec rigorós, 281 00:15:15,000 --> 00:15:18,000 però almenys sembla estar funcionant a primera vista, però ara anem a destrossar, 282 00:15:18,000 --> 00:15:21,000 i anem a gaudir de la idea de la repetició, de nou, 283 00:15:21,000 --> 00:15:24,000 en un context molt simple, així que d'aquí a unes setmanes 284 00:15:24,000 --> 00:15:27,000 quan vam començar a explorar més elegants estructures de dades d'arrays 285 00:15:27,000 --> 00:15:30,000 tenim una altra eina en la caixa d'eines amb les quals 286 00:15:30,000 --> 00:15:33,000 manipular les estructures de dades, com veurem. 287 00:15:33,000 --> 00:15:36,000 Aquest és l'enfocament iteratiu, l'enfocament basat en bucle. 288 00:15:36,000 --> 00:15:39,000 >> Permetin-me ara fer aquesta vegada. 289 00:15:39,000 --> 00:15:44,000 Permetin-me dir que en lloc de la suma del nombre de 290 00:15:44,000 --> 00:15:48,000 baix a 0 és realment la mateixa cosa que 291 00:15:48,000 --> 00:15:53,000 nombre + sigma (nombre - 1). 292 00:15:53,000 --> 00:15:57,000 En altres paraules, igual que en l'escenari em va trepitjar a cadascuna de les persones al meu, 293 00:15:57,000 --> 00:16:00,000 i ells al seu torn manté expulsar fins que finalment va tocar fons en Willy, 294 00:16:00,000 --> 00:16:03,000 qui va haver de tornar una resposta codificada com a 0. 295 00:16:03,000 --> 00:16:07,000 Aquí ara estem igualment bat per sigma 296 00:16:07,000 --> 00:16:10,000 la mateixa funció que va ser anomenat originalment, però aquí la idea clau 297 00:16:10,000 --> 00:16:12,000 és que no estem cridant sigma idèntica. 298 00:16:12,000 --> 00:16:14,000 No estem de pas en el núm. 299 00:16:14,000 --> 00:16:17,000 Estem passant clarament en nombre - 1, 300 00:16:17,000 --> 00:16:20,000 de manera que un problema una mica més petit, lleugerament més petit problema. 301 00:16:20,000 --> 00:16:23,000 >> Malauradament, això no és del tot una solució, però, i abans de fixar 302 00:16:23,000 --> 00:16:26,000 el que podria saltar tan evident en alguns de vostès 303 00:16:26,000 --> 00:16:28,000 m'ho dius a mi seguir endavant i tornar a executar fer. 304 00:16:28,000 --> 00:16:30,000 Sembla que compili bé. 305 00:16:30,000 --> 00:16:32,000 Permetin-me tornar a executar sigma amb 6. 306 00:16:32,000 --> 00:16:37,000 Vaja, deixa tornar a executar sigma amb 6. 307 00:16:37,000 --> 00:16:42,000 Hem vist això abans, encara que sigui accidentalment temps passat també. 308 00:16:42,000 --> 00:16:48,000 Per què em surt aquest error de segmentació críptic? Si. 309 00:16:48,000 --> 00:16:50,000 [Inaudible-alumne] 310 00:16:50,000 --> 00:16:53,000 No hi ha cas base, i més específicament, el que probablement va succeir? 311 00:16:53,000 --> 00:16:58,000 Aquest és un símptoma del que el comportament? 312 00:16:58,000 --> 00:17:00,000 Diguem que una mica més fort. 313 00:17:00,000 --> 00:17:02,000 [Inaudible-alumne] 314 00:17:02,000 --> 00:17:05,000 És un bucle infinit eficaçment, i el problema amb els bucles infinits 315 00:17:05,000 --> 00:17:08,000 quan impliquen recursió en aquest cas, una funció que es fa dir, 316 00:17:08,000 --> 00:17:10,000 el que passa cada vegada que es crida a una funció? 317 00:17:10,000 --> 00:17:13,000 Bé, pensi en la manera com va exposar la memòria en un ordinador. 318 00:17:13,000 --> 00:17:16,000 Hem dit que hi ha aquesta quantitat de memòria anomenat la pila que està en el fons, 319 00:17:16,000 --> 00:17:19,000 i cada vegada que es crida a una funció de memòria una mica més es va posar 320 00:17:19,000 --> 00:17:24,000 en aquesta pila de trucada que conté les variables locals de la funció o paràmetres, 321 00:17:24,000 --> 00:17:27,000 pel que si sigma sigma sigma Les trucades crida sigma 322 00:17:27,000 --> 00:17:29,000  diu sigma on acaba aquesta història? 323 00:17:29,000 --> 00:17:31,000 >> Bé, amb el temps els excessos de la quantitat total 324 00:17:31,000 --> 00:17:33,000 de memòria que té disponible al seu ordinador. 325 00:17:33,000 --> 00:17:37,000 Vostè envair el segment que se suposa que has de romandre a l'interior, 326 00:17:37,000 --> 00:17:40,000 i s'obté aquest error de segmentació, el nucli de dúmping, 327 00:17:40,000 --> 00:17:43,000 i què core dumped significa és que ara tinc un arxiu anomenat nucli 328 00:17:43,000 --> 00:17:46,000 que és un arxiu que conté zeros i uns 329 00:17:46,000 --> 00:17:49,000 que en realitat en el futur serà útil per al diagnòstic. 330 00:17:49,000 --> 00:17:52,000 Si no et resulta obvi que el seu error és 331 00:17:52,000 --> 00:17:54,000 en realitat es pot fer una mica d'anàlisi forense, per dir-ho, 332 00:17:54,000 --> 00:17:58,000 a l'arxiu bolcat de memòria, que, de nou, és només un munt de zeros i uns 333 00:17:58,000 --> 00:18:02,000 que en essència representa l'estat del seu programa a la memòria 334 00:18:02,000 --> 00:18:05,000 el moment en què va caure d'aquesta manera. 335 00:18:05,000 --> 00:18:11,000 >> La solució aquí és que no podem tornar a cegues sigma, 336 00:18:11,000 --> 00:18:14,000 el nombre sigma + d'un problema una mica més petit. 337 00:18:14,000 --> 00:18:16,000 Hem de tenir algun tipus de cas base aquí, 338 00:18:16,000 --> 00:18:19,000 i el que el cas base probablement ser? 339 00:18:19,000 --> 00:18:22,000 [Inaudible-alumne] 340 00:18:22,000 --> 00:18:25,000 Està bé, sempre que el nombre és positiu que en realitat hauria de tornar això, 341 00:18:25,000 --> 00:18:29,000 o dit d'una altra manera, si el nombre és, per exemple, <= a 0 342 00:18:29,000 --> 00:18:32,000 Saps què, vaig a seguir endavant i tornar 0, 343 00:18:32,000 --> 00:18:36,000 igual que Willy ho va fer, i una altra cosa, jo seguiré endavant 344 00:18:36,000 --> 00:18:41,000 i tornar aquest, pel que no és molt més curt 345 00:18:41,000 --> 00:18:44,000 que la versió iterativa que fustigar primer usant un bucle for, 346 00:18:44,000 --> 00:18:48,000 notar que hi ha aquest tipus d'elegància a la mateixa. 347 00:18:48,000 --> 00:18:51,000 En lloc de tornar un nombre i realitzar tota aquesta matemàtica 348 00:18:51,000 --> 00:18:54,000 i l'addició de les coses amb les variables locals 349 00:18:54,000 --> 00:18:57,000 Quan estiguis dient: "Bé, si això és un problema fàcil de super, 350 00:18:57,000 --> 00:19:01,000 igual que el nombre és <0, deixa immediatament tornarà 0. " 351 00:19:01,000 --> 00:19:03,000 >> No anem a molestar suport nombres negatius, 352 00:19:03,000 --> 00:19:05,000 així que vaig a codificar el valor de 0. 353 00:19:05,000 --> 00:19:08,000 Però d'altra banda, per posar en pràctica aquesta idea de sumar 354 00:19:08,000 --> 00:19:11,000 tots aquests nombres junts que efectivament pot fer un mos petit 355 00:19:11,000 --> 00:19:14,000 per sortir del problema, igual que ho vam fer aquí a l'escenari, 356 00:19:14,000 --> 00:19:18,000 llavors bat la resta del problema a la següent persona, 357 00:19:18,000 --> 00:19:20,000 però en aquest cas la següent persona és un mateix. 358 00:19:20,000 --> 00:19:22,000 Es tracta d'una funció amb el mateix nom. 359 00:19:22,000 --> 00:19:25,000 Només has de passar un problema cada vegada més petits i més petits cada vegada, 360 00:19:25,000 --> 00:19:28,000 i tot i que no tenen les coses molt formalitzats en el codi aquí 361 00:19:28,000 --> 00:19:33,000 això és exactament el que estava passant a la setmana 0 amb la guia telefònica. 362 00:19:33,000 --> 00:19:36,000 Això és exactament el que estava succeint en les últimes setmanes amb Sean 363 00:19:36,000 --> 00:19:39,000 i amb les nostres demostracions de la recerca de nombres. 364 00:19:39,000 --> 00:19:42,000 Es tracta de prendre un problema i dividint una i altra vegada. 365 00:19:42,000 --> 00:19:44,000 >> En altres paraules, hi ha una manera de traduir ara 366 00:19:44,000 --> 00:19:47,000 aquesta construcció del món real, aquesta construcció d'alt nivell 367 00:19:47,000 --> 00:19:51,000 de dividir i conquerir i fer alguna cosa una i altra vegada 368 00:19:51,000 --> 00:19:56,000 en el codi, així que això és una cosa que anem a veure una vegada més amb el temps. 369 00:19:56,000 --> 00:20:00,000 Ara, en un apart, si ets nou en la recursivitat almenys d'entendre ara 370 00:20:00,000 --> 00:20:02,000 per què això és divertit. 371 00:20:02,000 --> 00:20:05,000 Vaig a anar a google.com, 372 00:20:05,000 --> 00:20:17,000 i jo vaig a buscar alguns consells i trucs sobre la recursivitat, introdueixi. 373 00:20:17,000 --> 00:20:21,000 Digues a la persona al teu costat si no estiguessin rient ara. 374 00:20:21,000 --> 00:20:23,000 Vols dir la recursivitat? 375 00:20:23,000 --> 00:20:25,000 Potser volíeu dir-ah, aquí anem. 376 00:20:25,000 --> 00:20:28,000 Bé, ara que està la resta de tot el món. 377 00:20:28,000 --> 00:20:30,000 Una mica ou de Pasqua incrustat en algun lloc a Google. 378 00:20:30,000 --> 00:20:33,000 Com acotació al marge, un dels enllaços que posem a la pàgina web del curs 379 00:20:33,000 --> 00:20:36,000 d'avui és precisament aquesta xarxa de diversos algoritmes d'ordenació, 380 00:20:36,000 --> 00:20:39,000 algunes de les quals vam veure la setmana passada, però el bo d'aquesta visualització 381 00:20:39,000 --> 00:20:43,000 a mesura que tracten d'embolicar la seva ment al voltant de diverses coses relacionades amb algoritmes 382 00:20:43,000 --> 00:20:46,000 Sabia que pot molt fàcilment ara començar amb diferents tipus d'entrades. 383 00:20:46,000 --> 00:20:50,000 Les entrades de tots invertida, sobretot les entrades ordenades, les entrades a l'atzar i així successivament. 384 00:20:50,000 --> 00:20:53,000 En intentar, una vegada més, distingir aquestes coses en la teva ment 385 00:20:53,000 --> 00:20:57,000 adonar-se que aquesta adreça URL a la pàgina web de l'assignatura a la pàgina de Conferències 386 00:20:57,000 --> 00:21:00,000 podria ajudar a raonar a través d'alguns d'ells. 387 00:21:00,000 --> 00:21:05,000 >> Avui finalment podem resoldre aquest problema des de fa un temps, 388 00:21:05,000 --> 00:21:08,000 que era que aquesta funció d'intercanvi no va funcionar, 389 00:21:08,000 --> 00:21:12,000 i quin va ser el problema fonamental amb aquest canvi funció, 390 00:21:12,000 --> 00:21:15,000 l'objectiu va ser, de nou, per intercanviar un valor aquí i aquí 391 00:21:15,000 --> 00:21:17,000 de tal manera que això passa? 392 00:21:17,000 --> 00:21:20,000 Això en realitat no funciona. Per què? 393 00:21:20,000 --> 00:21:22,000 Si. 394 00:21:22,000 --> 00:21:28,000 [Inaudible-alumne] 395 00:21:28,000 --> 00:21:31,000 Exactament, l'explicació d'aquest bugginess 396 00:21:31,000 --> 00:21:34,000 simplement perquè quan es diu a funcions en C 397 00:21:34,000 --> 00:21:38,000 i aquestes funcions prendre arguments, com aib aquí, 398 00:21:38,000 --> 00:21:42,000 està de pas en les còpies de qualsevol valor que estem oferint a aquesta funció. 399 00:21:42,000 --> 00:21:46,000 No està proporcionant els valors originals ells mateixos, 400 00:21:46,000 --> 00:21:49,000 així que vam veure això en el context de buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, que semblava una mica alguna cosa com això. 402 00:21:52,000 --> 00:21:57,000 >> Recordem que teníem x i i inicialitza a 1 i 2, respectivament. 403 00:21:57,000 --> 00:21:59,000 A continuació, imprimeix el que eren. 404 00:21:59,000 --> 00:22:03,000 Llavors em va dir que jo els estava cridant intercanvi swap de x, i. 405 00:22:03,000 --> 00:22:06,000 Però el problema era que l'intercanvi de treball, 406 00:22:06,000 --> 00:22:10,000 però només en l'àmbit d'aplicació de la pròpia permuta funcionar. 407 00:22:10,000 --> 00:22:13,000 Així que vam arribar a la línia 40 els valors intercanviats 408 00:22:13,000 --> 00:22:16,000 van ser rebutjats, i per tant res 409 00:22:16,000 --> 00:22:21,000 en la funció original va ser canviat realment en absolut, 410 00:22:21,000 --> 00:22:26,000 llavors si li sembla llavors que l'aspecte que té en termes de la nostra memòria 411 00:22:26,000 --> 00:22:29,000 si aquesta part esquerra de la placa representació 412 00:22:29,000 --> 00:22:33,000 i vaig a fer el meu millor esforç perquè tots la vegin això: si aquesta part esquerra de la taula 413 00:22:33,000 --> 00:22:37,000 representa, per exemple, la memòria RAM, i la pila es creixerà en aquesta forma, 414 00:22:37,000 --> 00:22:43,000 i cridem a una funció com a principal i principal té 2 variables locals, x i i, 415 00:22:43,000 --> 00:22:48,000 descriurem a aquells que x aquí, i anem a descriure com i aquí, 416 00:22:48,000 --> 00:22:55,000 i posarem en els valors 1 i 2, de manera que aquesta aquí és principal, 417 00:22:55,000 --> 00:22:58,000 i quan es crida a la funció principal d'intercanvi del sistema operatiu 418 00:22:58,000 --> 00:23:02,000 dóna la funció d'intercanvi en la seva pròpia franja de memòria a la pila, 419 00:23:02,000 --> 00:23:04,000 seu propi marc a la pila, per així dir-ho. 420 00:23:04,000 --> 00:23:08,000 També assigna 32 bits per aquests sencers. 421 00:23:08,000 --> 00:23:11,000 Li passa a cridar-a i b, però això és totalment arbitrària. 422 00:23:11,000 --> 00:23:13,000 Podria haver anomenat el que vulgui, però el que passa quan principal 423 00:23:13,000 --> 00:23:19,000 intercanvi de trucades és que pren aquest 1, posa una còpia allà, posa una còpia allà. 424 00:23:19,000 --> 00:23:23,000 >> Hi ha una altra variable local a swap, però, diu què? Tmp. >> 425 00:23:23,000 --> 00:23:27,000 Tmp, així que em dono altres 32 bits d'aquí, 426 00:23:27,000 --> 00:23:29,000 I què faig en aquesta funció? 427 00:23:29,000 --> 00:23:34,000 Vaig dir int tmp rep una, pel que té 1, així que ho vaig fer l'última vegada que va jugar amb aquest exemple. 428 00:23:34,000 --> 00:23:39,000 A continuació, es posa a b, llavors b és 2, de manera que ara això es converteix en 2, 429 00:23:39,000 --> 00:23:42,000 i ara arriba b temp, temp així és 1, 430 00:23:42,000 --> 00:23:44,000 de manera que ara es converteix en aquest b. 431 00:23:44,000 --> 00:23:46,000 Això és genial. Va funcionar. 432 00:23:46,000 --> 00:23:49,000 Però tan bon punt la funció retorna 433 00:23:49,000 --> 00:23:52,000 d'intercanvi de memòria de forma eficaç desapareix perquè pugui ser reutilitzat 434 00:23:52,000 --> 00:23:58,000 per alguna altra funció en el futur, i principal és òbviament completament inalterat. 435 00:23:58,000 --> 00:24:00,000 Necessitem una manera de resoldre aquest problema fonamental, 436 00:24:00,000 --> 00:24:03,000 i avui per fi vaig a tenir una manera de fer això mitjançant el qual 437 00:24:03,000 --> 00:24:06,000 podem introduir una cosa que es diu un punter. 438 00:24:06,000 --> 00:24:09,000 Resulta que podem resoldre aquest problema 439 00:24:09,000 --> 00:24:12,000 no passant en còpies de x i i 440 00:24:12,000 --> 00:24:18,000 però no pel que passa a, creus que, a la funció d'intercanvi? 441 00:24:18,000 --> 00:24:20,000 Sí, què passa amb la direcció? 442 00:24:20,000 --> 00:24:22,000 Realment no hem parlat sobre les adreces en molt detall, 443 00:24:22,000 --> 00:24:25,000 però si això pissarra representa la memòria del meu ordinador 444 00:24:25,000 --> 00:24:28,000 sens dubte podríem començar a numerar els bytes de RAM en el meu 445 00:24:28,000 --> 00:24:31,000 i dir que aquest és el byte # 1, aquest és el byte # 2, # 3 byte, 446 00:24:31,000 --> 00:24:35,000 byte # 4, # byte ... 2 milions de dòlars si tinc 2 GB de RAM, 447 00:24:35,000 --> 00:24:38,000 per la qual cosa sens dubte podria arribar a algun esquema de numeració arbitrari 448 00:24:38,000 --> 00:24:41,000 per a tots els bytes individuals en la memòria del meu ordinador. 449 00:24:41,000 --> 00:24:43,000 >> Què passa si en lloc quan dic intercanvi 450 00:24:43,000 --> 00:24:47,000 en lloc de passar còpies de x i y 451 00:24:47,000 --> 00:24:51,000 ¿Per què no en lloc de passar la direcció de x aquí, 452 00:24:51,000 --> 00:24:55,000 la direcció de i aquí, essencialment l'adreça postal 453 00:24:55,000 --> 00:24:59,000 de x i i perquè després d'intercanvi, si està informat 454 00:24:59,000 --> 00:25:01,000 de la direcció en la memòria de x i y, 455 00:25:01,000 --> 00:25:04,000 després d'intercanvi, si ho va entrenar una mica, 456 00:25:04,000 --> 00:25:07,000 que potencialment podria conduir a aquesta direcció, per així dir-ho, 457 00:25:07,000 --> 00:25:11,000 x, i canviar el nombre allà, després en cotxe a la direcció de i, 458 00:25:11,000 --> 00:25:16,000 canviar el nombre allà, encara que en realitat no obtenir còpies d'ell mateix aquests valors, 459 00:25:16,000 --> 00:25:19,000 així que, encara que ja parlem d'això com memòria principal 460 00:25:19,000 --> 00:25:23,000 i aquest swap com la memòria dels poderosos i la part perillosa de C 461 00:25:23,000 --> 00:25:28,000 és que qualsevol funció pot tocar qualsevol part de la memòria de l'ordinador, 462 00:25:28,000 --> 00:25:32,000 i això és de gran abast en la qual es poden fer coses molt elegants amb programes d'ordinador en C. 463 00:25:32,000 --> 00:25:36,000 Això és perillós perquè també es pot ficar la pota molt fàcilment. 464 00:25:36,000 --> 00:25:39,000 De fet, una de les formes més comunes per als programes d'aquests dies per ser explotats 465 00:25:39,000 --> 00:25:42,000 encara no és per a un programador per realitzar 466 00:25:42,000 --> 00:25:45,000 que ell o ella està permetent una dada 467 00:25:45,000 --> 00:25:49,000 per ser escrita en una ubicació de memòria que no es pretenia. 468 00:25:49,000 --> 00:25:51,000 >> Per exemple, ell o ella declara una matriu de mida 10 469 00:25:51,000 --> 00:25:56,000 però, accidentalment, tracta de posar 11 bytes en la matriu de la memòria, 470 00:25:56,000 --> 00:25:59,000 i comences a tocar parts de la memòria que ja no són vàlids. 471 00:25:59,000 --> 00:26:02,000 Només per aquest context, alguns de vostès sabran que 472 00:26:02,000 --> 00:26:06,000 programari sovint li demana els números de sèrie o claus de registre, 473 00:26:06,000 --> 00:26:08,000 Photoshop i Word i programes com aquest. 474 00:26:08,000 --> 00:26:12,000 Hi ha esquerdes, com alguns de vostès saben, en línia on vostè pot executar un petit programa, 475 00:26:12,000 --> 00:26:14,000 i llest, no demanar més d'un número de sèrie. 476 00:26:14,000 --> 00:26:16,000 Com és que funciona? 477 00:26:16,000 --> 00:26:21,000 En molts casos, aquestes coses són simplement trobar en els ordinadors 478 00:26:21,000 --> 00:26:24,000 segments de text en zeros reals de l'ordinador i éssers 479 00:26:24,000 --> 00:26:28,000 On és aquesta funció en la qual es demana el número de sèrie, 480 00:26:28,000 --> 00:26:31,000 i sobreescriure aquest espai, o mentre el programa s'està executant 481 00:26:31,000 --> 00:26:33,000 vostè pot esbrinar on la clau s'emmagatzema 482 00:26:33,000 --> 00:26:37,000 utilitzen una part anomenat un depurador, i es pot esquerdar programari d'aquesta manera. 483 00:26:37,000 --> 00:26:40,000 Això no vol dir que aquest és el nostre objectiu per al pròxim parell de dies, 484 00:26:40,000 --> 00:26:42,000 però té molt reals ramificacions. 485 00:26:42,000 --> 00:26:45,000 Que un li passa a implicar el robatori de programari, 486 00:26:45,000 --> 00:26:47,000 però també hi ha compromís de les màquines senceres. 487 00:26:47,000 --> 00:26:50,000 >> De fet, quan aquests llocs web dia són explotats 488 00:26:50,000 --> 00:26:53,000 i compromesa i les dades es van filtrar i contrasenyes robades es 489 00:26:53,000 --> 00:26:58,000 molt sovint es relaciona amb la mala gestió de la memòria, 490 00:26:58,000 --> 00:27:01,000 o, en el cas de bases de dades, manca d'anticipació 491 00:27:01,000 --> 00:27:03,000 entrada contradicció, de manera que més que en les pròximes setmanes, 492 00:27:03,000 --> 00:27:07,000 però per ara només un avançament de la classe de dany que es pot fer 493 00:27:07,000 --> 00:27:11,000 per no prou entendre com funcionen les coses sota la caputxa. 494 00:27:11,000 --> 00:27:14,000 Anem a anar sobre la comprensió de per què això està trencat 495 00:27:14,000 --> 00:27:17,000 amb una eina que es farà més i més útil 496 00:27:17,000 --> 00:27:19,000 ja que els nostres programes es tornen més complexos. 497 00:27:19,000 --> 00:27:21,000 Fins ara quan s'ha tingut un error en el seu programa 498 00:27:21,000 --> 00:27:23,000 Com ha anat depurant sobre ell? 499 00:27:23,000 --> 00:27:25,000 Quines han estat les teves tècniques fins ara, ja sigui impartit pel TF 500 00:27:25,000 --> 00:27:27,000 o simplement autodidacta? 501 00:27:27,000 --> 00:27:29,000 [Estudiant] printf. 502 00:27:29,000 --> 00:27:31,000 Printf, així printf probablement ha estat el seu amic que si vostè vol veure 503 00:27:31,000 --> 00:27:33,000 el que està succeint dins del seu programa de 504 00:27:33,000 --> 00:27:36,000 vostè acaba de posar printf aquí, printf aquí, printf aquí. 505 00:27:36,000 --> 00:27:38,000 A continuació, executar, i et donen un munt de coses a la pantalla 506 00:27:38,000 --> 00:27:43,000 que es pot utilitzar per deduir llavors el que realment està passant malament en el seu programa. 507 00:27:43,000 --> 00:27:45,000 >> Printf tendeix a ser alguna cosa molt poderós, 508 00:27:45,000 --> 00:27:47,000 però és un procés molt manual. 509 00:27:47,000 --> 00:27:49,000 Has de posar un printf aquí, un printf aquí, 510 00:27:49,000 --> 00:27:51,000 i si ho poses dins d'un bucle podria obtenir 100 línies 511 00:27:51,000 --> 00:27:53,000 de sortida que vostè llavors ha de tamisar a través. 512 00:27:53,000 --> 00:27:58,000 No és un mecanisme molt fàcil d'utilitzar o interactius per als programes de depuració, 513 00:27:58,000 --> 00:28:00,000 però per sort hi ha alternatives. 514 00:28:00,000 --> 00:28:03,000 Hi ha un programa, per exemple, diu GDB, el depurador de GNU, 515 00:28:03,000 --> 00:28:06,000 que és un arcà molt poc en com l'utilitza. 516 00:28:06,000 --> 00:28:08,000 És una mica complex, però, francament, 517 00:28:08,000 --> 00:28:11,000 aquesta és una d'aquelles coses que si vostè posa en aquesta setmana i la propera 518 00:28:11,000 --> 00:28:14,000 l'hora extra a entendre alguna cosa com GDB 519 00:28:14,000 --> 00:28:18,000 que li estalviarà probablement desenes d'hores al llarg termini, 520 00:28:18,000 --> 00:28:21,000 Així que amb això, et vaig a donar un avançament de com funciona això. 521 00:28:21,000 --> 00:28:23,000 >> Estic en la meva finestra de terminal. 522 00:28:23,000 --> 00:28:26,000 Deixin-me seguir endavant i compilar aquest programa, buggy3. 523 00:28:26,000 --> 00:28:28,000 Ja està actualitzat. 524 00:28:28,000 --> 00:28:31,000 Deixa córrer tal com ho vam fer fa un temps, i de fet, està trencada. 525 00:28:31,000 --> 00:28:34,000 Però per què és això? Potser el arruïni la funció d'intercanvi. 526 00:28:34,000 --> 00:28:37,000 Potser és a i b. No estic molt a moure correctament. 527 00:28:37,000 --> 00:28:39,000 Deixa anar endavant i fer-ho. 528 00:28:39,000 --> 00:28:43,000 En comptes de córrer buggy3 m'ho dius a mi en lloc d'executar aquest programa de GDB, 529 00:28:43,000 --> 00:28:48,000 i jo ho diré a executar buggy3, 530 00:28:48,000 --> 00:28:52,000 i vaig a incloure un argument de línia d'ordres,-tui, 531 00:28:52,000 --> 00:28:55,000 i posarem això en futurs problemes d'especificació per recordar. 532 00:28:55,000 --> 00:28:57,000 I ara aquesta interfície en blanc i negre que va aparèixer, de nou, 533 00:28:57,000 --> 00:28:59,000 És una mica aclaparador al principi, perquè hi ha tota aquesta 534 00:28:59,000 --> 00:29:02,000 informació sobre la garantia aquí, però almenys hi ha alguna cosa familiar. 535 00:29:02,000 --> 00:29:04,000 A la part superior de la finestra és el meu codi actual, 536 00:29:04,000 --> 00:29:08,000 i si em desplaço fins aquí permetin-me desplaçar a la part superior del meu arxiu, 537 00:29:08,000 --> 00:29:11,000 i, de fet, hi ha buggy3.c i observi en la part inferior d'aquesta finestra 538 00:29:11,000 --> 00:29:13,000 Tinc aquest missatge GDB. 539 00:29:13,000 --> 00:29:16,000 >> Aquest no és el mateix que el meu suau de John Harvard. 540 00:29:16,000 --> 00:29:19,000 Aquest és un missatge que permetrà que controli GDB. 541 00:29:19,000 --> 00:29:21,000 GDB és un depurador. 542 00:29:21,000 --> 00:29:24,000 Un depurador és un programa que li permet caminar a través de 543 00:29:24,000 --> 00:29:27,000 execució del seu programa de línia a línia per línia, 544 00:29:27,000 --> 00:29:30,000 en el camí fent el que vulguis amb el programa, 545 00:29:30,000 --> 00:29:33,000 fins i tot trucar a funcions, oa la recerca, sobretot, 546 00:29:33,000 --> 00:29:35,000 en valors de les variables de diversos. 547 00:29:35,000 --> 00:29:37,000 Seguirem endavant i fer això. 548 00:29:37,000 --> 00:29:40,000 Vaig a seguir endavant i escriure en carrera en el símbol del BGF, 549 00:29:40,000 --> 00:29:43,000 per notarà en la part inferior esquerra de la pantalla que he escrit córrer, 550 00:29:43,000 --> 00:29:45,000 i he prem enter, i què va fer això? 551 00:29:45,000 --> 00:29:50,000 És, literalment, corrent el meu programa, però que en realitat no veig molt anar d'aquí 552 00:29:50,000 --> 00:29:55,000 perquè jo no ho he dit el depurador 553 00:29:55,000 --> 00:29:57,000 per fer una pausa en un moment particular en el temps. 554 00:29:57,000 --> 00:29:59,000 Simplement escrivint run executa el programa. 555 00:29:59,000 --> 00:30:01,000 Jo en realitat no veig res. No ho puc manipular. 556 00:30:01,000 --> 00:30:03,000 >> En el seu lloc farem això. 557 00:30:03,000 --> 00:30:08,000 En aquest missatge GDB m'ho dius a mi en comptes escrigui break, entrar. 558 00:30:08,000 --> 00:30:10,000 Això no és el que vaig voler escriure. 559 00:30:10,000 --> 00:30:13,000 En lloc d'això escriure ruptura principal. 560 00:30:13,000 --> 00:30:15,000 En altres paraules, vull parlar d'una cosa que es diu un punt d'interrupció, 561 00:30:15,000 --> 00:30:18,000 que es nomena convenient perquè va a trencar o fer una pausa 562 00:30:18,000 --> 00:30:21,000 execució del seu programa en aquest lloc en particular. 563 00:30:21,000 --> 00:30:23,000 Principal és el nom del meu funció. 564 00:30:23,000 --> 00:30:25,000 Recordeu que GDB és molt intel · ligent. 565 00:30:25,000 --> 00:30:28,000 Es va descobrir que la principal passa a començar aproximadament a la línia 18 566 00:30:28,000 --> 00:30:32,000 de buggy3.c i observi aquí, a la part superior esquerra 567 00:30:32,000 --> 00:30:34,000 + B és just al costat de la línia 18. 568 00:30:34,000 --> 00:30:38,000 Això em recorda que he posat un punt d'interrupció en la línia 18. 569 00:30:38,000 --> 00:30:42,000 Aquesta vegada, quan jo escrigui run, em vaig a córrer el meu programa 570 00:30:42,000 --> 00:30:45,000 fins que arribi a aquest punt de ruptura, 571 00:30:45,000 --> 00:30:48,000 de manera que el programa farà una pausa per a mi en la línia 18. 572 00:30:48,000 --> 00:30:50,000 Aquí anem, corre. 573 00:30:50,000 --> 00:30:53,000 Res sembla haver passat, però va deixar avís a la part inferior 574 00:30:53,000 --> 00:30:58,000 programa d'inici, buggy3, 1 a punt d'interrupció en la línia principal buggy3.c 18. 575 00:30:58,000 --> 00:31:00,000 Què puc fer ara? 576 00:31:00,000 --> 00:31:03,000 >> Recordeu que començar a escriure coses com la impressió, 577 00:31:03,000 --> 00:31:08,000 No printf, print x, i això sí que és estrany. 578 00:31:08,000 --> 00:31:11,000 Els $ 1 és només una curiositat, com veurem 579 00:31:11,000 --> 00:31:14,000 cada vegada que imprimeixi alguna cosa que s'obté un nou valor $. 580 00:31:14,000 --> 00:31:18,000 Això és el que es pot fer referència als valors anteriors per si de cas, 581 00:31:18,000 --> 00:31:21,000 però per ara el que em diu impressió és que el valor de x en aquest punt de la història 582 00:31:21,000 --> 00:31:26,000 és aparentment 134514032. 583 00:31:26,000 --> 00:31:29,000 Què? D'on vi que fins i tot ve? 584 00:31:29,000 --> 00:31:31,000 [Inaudible-alumne] 585 00:31:31,000 --> 00:31:34,000 De fet, això és el que anomenarem a un valor escombraries, i nosaltres no hem parlat d'això, però, 586 00:31:34,000 --> 00:31:37,000 però la raó per la qual establir variables 587 00:31:37,000 --> 00:31:40,000 òbviament perquè tinguin algun valor que desitja que tinguin. 588 00:31:40,000 --> 00:31:44,000 Però el problema és recordar que vostè pot declarar variables 589 00:31:44,000 --> 00:31:46,000 com ho vaig fer fa un moment al meu exemple sigma 590 00:31:46,000 --> 00:31:48,000 sense arribar a donar un valor. 591 00:31:48,000 --> 00:31:50,000 Recordem el que vaig fer aquí a sigma. 592 00:31:50,000 --> 00:31:52,000 Declarar n, però quin valor tenia el dono? 593 00:31:52,000 --> 00:31:56,000 Cap, perquè sabia que en les pròximes línies 594 00:31:56,000 --> 00:31:59,000 GetInt s'ocuparia del problema de posar un valor dins de n. 595 00:31:59,000 --> 00:32:02,000 >> Però en aquest punt de la història de la línia 11 596 00:32:02,000 --> 00:32:05,000 i la línia 12 i la línia 13 i la línia 14 597 00:32:05,000 --> 00:32:08,000 al llarg d'aquestes línies de diversos quin és el valor de n? 598 00:32:08,000 --> 00:32:10,000 En C simplement no ho sé. 599 00:32:10,000 --> 00:32:14,000 En general és un valor escombraries, un nombre completament a l'atzar 600 00:32:14,000 --> 00:32:17,000 que sobra essencialment d'alguna funció anterior 601 00:32:17,000 --> 00:32:21,000 després d'haver estat executat, i també el programa s'executa 602 00:32:21,000 --> 00:32:24,000 Recordem que la funció té funció, la funció, la funció. 603 00:32:24,000 --> 00:32:27,000 Tots aquests marcs d'aconseguir posar en la memòria i després els retornen les funcions, 604 00:32:27,000 --> 00:32:31,000 i igual que vaig suggerir amb la goma d'esborrar la seva memòria és eventualment reutilitzats. 605 00:32:31,000 --> 00:32:37,000 Bé, el que passa és que aquesta variable x en aquest programa 606 00:32:37,000 --> 00:32:41,000 sembla haver contingut algun valor com escombraries 134514032 607 00:32:41,000 --> 00:32:44,000 d'alguna funció anterior, no un que jo vaig escriure. 608 00:32:44,000 --> 00:32:47,000 Podria ser una cosa que ve efectivament amb el sistema operatiu, 609 00:32:47,000 --> 00:32:49,000 alguna funció sota la caputxa. 610 00:32:49,000 --> 00:32:52,000 >> Està bé, està bé, però ara anem a passar a la següent línia. 611 00:32:52,000 --> 00:32:55,000 Si escric "següent" en el meu GDB ràpid i vaig arribar a entrar, 612 00:32:55,000 --> 00:32:58,000 compte que el selector es desplaça fins a la línia 19, 613 00:32:58,000 --> 00:33:01,000 sinó la conseqüència lògica és que la línia 18 614 00:33:01,000 --> 00:33:06,000 ha acabat d'executar, de manera que si torno a escriure "print x" 615 00:33:06,000 --> 00:33:10,000 Ara heu de veure 1, i de fet, així és. 616 00:33:10,000 --> 00:33:14,000 Un cop més, les coses $ és una forma de GDB li recorda 617 00:33:14,000 --> 00:33:17,000 el que la història de les impressions són que vostè ha fet. 618 00:33:17,000 --> 00:33:21,000 Ara vaig a seguir endavant i imprimir i, de fet, i és un valor boig també, 619 00:33:21,000 --> 00:33:24,000 però no és gran cosa ja que a la línia 19 estem a punt de cedir 620 00:33:24,000 --> 00:33:27,000 el valor 2, així que vaig a escriure "Següent" de nou. 621 00:33:27,000 --> 00:33:29,000 I ara estem en la línia printf. 622 00:33:29,000 --> 00:33:31,000 Permetin-me fer x impressió. 623 00:33:31,000 --> 00:33:34,000 Déjame fer i d'impressió. Francament, estic una mica cansat de la impressió d'aquest. 624 00:33:34,000 --> 00:33:38,000 Deixa en comptes escriure "x pantalla" i "i la pantalla", 625 00:33:38,000 --> 00:33:41,000 i ara cada vegada que escrigui una ordre en el futur 626 00:33:41,000 --> 00:33:45,000 Vaig a recordar el que és x i i, el que és x i i, el que és x i i. 627 00:33:45,000 --> 00:33:48,000 >> També puc, en un apart, escriviu "locals d'informació." 628 00:33:48,000 --> 00:33:50,000 Info és comandes especials. 629 00:33:50,000 --> 00:33:52,000 Els locals significa que em mostra les variables locals. 630 00:33:52,000 --> 00:33:55,000 Només en cas d'oblit o es tracta d'una funció boig i complicat 631 00:33:55,000 --> 00:33:57,000 que jo o algú més va escriure vilatans informació li dirà 632 00:33:57,000 --> 00:34:00,000 ¿Quines són les variables locals dins d'aquesta funció local 633 00:34:00,000 --> 00:34:03,000 que és possible que es preocupen per si vols tafanejar. 634 00:34:03,000 --> 00:34:07,000 Ara, printf està a punt d'executar, així que vaig a seguir endavant i només has d'escriure "següent". 635 00:34:07,000 --> 00:34:10,000 Perquè estem en aquest entorn no estem realment veient 636 00:34:10,000 --> 00:34:14,000 executar fins aquí, però noti que està fent una mica destrossat aquí. 637 00:34:14,000 --> 00:34:17,000 Però noti que està anul · lant la pantalla hi ha, 638 00:34:17,000 --> 00:34:21,000 així que no és un programa perfecte aquí, però això està bé, perquè sempre puc furgar 639 00:34:21,000 --> 00:34:23,000 mitjançant impressió si vull. 640 00:34:23,000 --> 00:34:26,000 >> Deixa escriure al costat de nou, i ara ve la part interessant. 641 00:34:26,000 --> 00:34:29,000 En aquest punt de la història i és 2, i x és 1, 642 00:34:29,000 --> 00:34:32,000 com es suggereix aquí, i de nou, 643 00:34:32,000 --> 00:34:35,000 la raó d'això és automàticament mostrant ara és perquè he utilitzat la comanda 644 00:34:35,000 --> 00:34:40,000 display x i i visualització, de manera que el moment de tipus I següent 645 00:34:40,000 --> 00:34:43,000 en teoria x i i s'han de convertir intercanvien. 646 00:34:43,000 --> 00:34:45,000 Ara, ja sabem que no serà el cas, 647 00:34:45,000 --> 00:34:49,000 però ja veurem d'aquí a un moment com podem aprofundir més per entendre per què això és cert. 648 00:34:49,000 --> 00:34:54,000 A continuació, i per desgràcia, i és encara 2 x segueix sent 1, i puc confirmar el mateix. 649 00:34:54,000 --> 00:34:56,000 Imprimir x, imprimir i. 650 00:34:56,000 --> 00:34:59,000 De fet, cap intercanvi que realment ha succeït, així que començarem aquest cop. 651 00:34:59,000 --> 00:35:01,000 Clarament intercanvi està trencat. 652 00:35:01,000 --> 00:35:04,000 En lloc d'això escriu "Executar" de nou. 653 00:35:04,000 --> 00:35:07,000 Permetin-me dir que sí, vull que reiniciar des del principi, entrar. 654 00:35:07,000 --> 00:35:09,000 >> Ara estic de tornada cap amunt en la línia 18. 655 00:35:09,000 --> 00:35:11,000 Ara noti x i i són valors d'escombraries de nou. 656 00:35:11,000 --> 00:35:15,000 Següent, següent, següent, següent. 657 00:35:15,000 --> 00:35:17,000 Si m'avorreixo jo també puc poseu n pel proper. 658 00:35:17,000 --> 00:35:21,000 Es pot abreujar amb la seqüència més curta possible de caràcters. 659 00:35:21,000 --> 00:35:23,000 Intercanviar està trencat. 660 00:35:23,000 --> 00:35:25,000 Anem a bussejar, així que en comptes de teclejar següent, 661 00:35:25,000 --> 00:35:30,000 ara vaig a escriure el que pas Estic caminant dins d'aquesta funció 662 00:35:30,000 --> 00:35:33,000 perquè jo pugui caminar a través d'ell, així que em va colpejar pas i després entra. 663 00:35:33,000 --> 00:35:37,000 Recordeu que els salts que destaquen més avall en el meu programa a la línia 36. 664 00:35:37,000 --> 00:35:39,000 Ara, quines són les variables locals? 665 00:35:39,000 --> 00:35:41,000 Informació dels locals. 666 00:35:41,000 --> 00:35:43,000 No hi ha res encara perquè no hem arribat a aquesta línia, 667 00:35:43,000 --> 00:35:47,000 així que seguirem endavant i dir "següent". 668 00:35:47,000 --> 00:35:50,000 Ara sembla que tenim tmp tmp impressió. 669 00:35:50,000 --> 00:35:52,000 Valor escombraries, no? Crec que sí. 670 00:35:52,000 --> 00:35:55,000 Què tal una impressió, impressió b, 1 i 2? 671 00:35:55,000 --> 00:35:58,000 En un moment, així que em escrigui de nou al costat 672 00:35:58,000 --> 00:36:02,000 tmp tindrà un valor d'1, amb sort, 673 00:36:02,000 --> 00:36:05,000 tmp perquè serà assignat el valor de a. 674 00:36:05,000 --> 00:36:08,000 >> Ara farem imprimir a, b, impressió, 675 00:36:08,000 --> 00:36:11,000 però ara imprimir tmp, i és de fet 1. 676 00:36:11,000 --> 00:36:14,000 Deixa fer a continuació. Deixa fer a continuació. 677 00:36:14,000 --> 00:36:16,000 He acabat la funció d'intercanvi. 678 00:36:16,000 --> 00:36:19,000 Estic encara dins de la mateixa en la línia 40, així que em imprimiu una, 679 00:36:19,000 --> 00:36:22,000 print b, i no m'importa el que tmp és. 680 00:36:22,000 --> 00:36:27,000 Sembla intercanvi és correcte quan es tracta d'intercanvi de a i b. 681 00:36:27,000 --> 00:36:31,000 Però si ara introduït a continuació, salt de nou a la línia 25, 682 00:36:31,000 --> 00:36:34,000 i per descomptat, si escric en x i i d'impressió 683 00:36:34,000 --> 00:36:38,000 segueixen sent sense canvis, de manera que no han solucionat el problema. 684 00:36:38,000 --> 00:36:41,000 No obstant això, el diagnòstic ara potser amb aquest programa GDB 685 00:36:41,000 --> 00:36:44,000 hem aconseguit almenys un pas més a prop d'entendre 686 00:36:44,000 --> 00:36:47,000 el que va malament sense necessitat d'escombraries nostre codi per posar un printf aquí, 687 00:36:47,000 --> 00:36:50,000 printf aquí, printf aquí i després s'executa una i altra vegada 688 00:36:50,000 --> 00:36:52,000 tractant d'esbrinar el que va malament. 689 00:36:52,000 --> 00:36:55,000 >> Vaig a seguir endavant i deixar fora d'aquest conjunt amb deixar de fumar. 690 00:36:55,000 --> 00:36:57,000 Això dirà a continuació, "Sortir de totes maneres?" Sí 691 00:36:57,000 --> 00:37:00,000 Ara estic de tornada en el meu sistema normal, i he acabat amb GDB. 692 00:37:00,000 --> 00:37:03,000 Com acotació al marge, no cal utilitzar aquesta bandera-tui. 693 00:37:03,000 --> 00:37:07,000 De fet, si ho omet obtenir essencialment la meitat inferior de la pantalla. 694 00:37:07,000 --> 00:37:11,000 Si a continuació, escriviu ruptura principal i executeu 695 00:37:11,000 --> 00:37:15,000 Encara puc executar el meu programa, però el que farà és més textual 696 00:37:15,000 --> 00:37:18,000 només em mostra la línia actual al mateix temps. 697 00:37:18,000 --> 00:37:21,000 El tui-, la interfície d'usuari textual, 698 00:37:21,000 --> 00:37:25,000 només li mostra més del programa al mateix temps, que és probablement una mica conceptualment més fàcil. 699 00:37:25,000 --> 00:37:27,000 Però, en realitat, només es pot fer següent, següent, següent, 700 00:37:27,000 --> 00:37:30,000 i vaig a veure una línia al mateix temps, i si realment vols veure el que està passant 701 00:37:30,000 --> 00:37:35,000 Em pot escriure la llista i veure un munt de línies veïnes. 702 00:37:35,000 --> 00:37:39,000 >> Hi ha un vídeo que li hem demanat que vostè mira per a butlletins de problemes 3 703 00:37:39,000 --> 00:37:43,000 en la qual Nate es tracten algunes de les complexitats de GDB, 704 00:37:43,000 --> 00:37:46,000 i aquesta és una d'aquestes coses, de veritat, on un percentatge no trivial que 705 00:37:46,000 --> 00:37:49,000 mai tocarà GDB, i això serà una cosa dolenta 706 00:37:49,000 --> 00:37:53,000 perquè, literalment, vostè acabarà gastant més temps a finals d'aquest semestre 707 00:37:53,000 --> 00:37:56,000 perseguint els insectes llavors vostè tindria si vostè posa en aquesta mitja hora / hora 708 00:37:56,000 --> 00:38:00,000 aquesta setmana i l'aprenentatge al costat de sentir còmode amb GDB. 709 00:38:00,000 --> 00:38:02,000 Printf era el seu amic. 710 00:38:02,000 --> 00:38:05,000 GDB ara ha de ser el seu amic. 711 00:38:05,000 --> 00:38:08,000 >> Teniu alguna pregunta respecte GDB? 712 00:38:08,000 --> 00:38:12,000 I aquí hi ha una llista ràpida d'alguns dels comandaments més poderosos i útils. 713 00:38:12,000 --> 00:38:15,000 Si. >> Pot imprimir una cadena? 714 00:38:15,000 --> 00:38:17,000 Pot imprimir una cadena? Per descomptat. 715 00:38:17,000 --> 00:38:19,000 No ha de ser només nombres enters. 716 00:38:19,000 --> 00:38:22,000 Si una variable s és una cadena que, simplement introduïu s d'impressió. 717 00:38:22,000 --> 00:38:24,000 Se li mostrarà el que és variable de cadena. 718 00:38:24,000 --> 00:38:26,000 [Inaudible-alumne] 719 00:38:26,000 --> 00:38:28,000 Se li donarà la direcció i la pròpia cadena. 720 00:38:28,000 --> 00:38:32,000 Es mostrarà als dos. 721 00:38:32,000 --> 00:38:34,000 I una última cosa, només perquè es tracta d'un notable coneixement massa. 722 00:38:34,000 --> 00:38:37,000 Backtrace i el marc, deixa submergir-se en aquesta última vegada, 723 00:38:37,000 --> 00:38:39,000 mateix programa amb GDB. 724 00:38:39,000 --> 00:38:44,000 Deixin-me seguir endavant i executar la versió de la interfície d'usuari textual, 725 00:38:44,000 --> 00:38:46,000 trencar principal. 726 00:38:46,000 --> 00:38:49,000 Deixin-me seguir endavant i córrer de nou. Sóc aquí. 727 00:38:49,000 --> 00:38:55,000 Ara aniré a següent, següent, següent, següent, següent, pas, entrar. 728 00:38:55,000 --> 00:39:00,000 >> I ara suposo que ara estic en intercanvi deliberadament, però jo sóc com "Maleïda sigui, ¿quin era el valor de x?" 729 00:39:00,000 --> 00:39:02,000 No puc fer x més. 730 00:39:02,000 --> 00:39:05,000 No puc fer-ho i perquè no estan en el seu abast. 731 00:39:05,000 --> 00:39:07,000 No estan en el seu context, però no hi ha problema. 732 00:39:07,000 --> 00:39:09,000 Puc escriure backtrace. 733 00:39:09,000 --> 00:39:13,000 Això em mostra totes les funcions que s'han realitzat fins aquest punt en el temps. 734 00:39:13,000 --> 00:39:16,000 Observeu que l'una en la part inferior, la principal, s'alinea amb principal 735 00:39:16,000 --> 00:39:18,000 estar en el fons de la nostra imatge aquí. 736 00:39:18,000 --> 00:39:22,000 El fet que està per sobre de canvi que s'alineï amb el canvi d'estar per sobre d'ella en la memòria aquí, 737 00:39:22,000 --> 00:39:26,000 i si vull tornar a principal temporalment el que puc dir "marc". 738 00:39:26,000 --> 00:39:30,000 Quin nombre? Principal és el quadre número 1. 739 00:39:30,000 --> 00:39:32,000 Vaig a seguir endavant i dir "quadre 1". 740 00:39:32,000 --> 00:39:36,000 >> Ara estic de tornada en main, i puc imprimir x, i puc imprimir i, 741 00:39:36,000 --> 00:39:40,000 però no puc imprimir a ob. 742 00:39:40,000 --> 00:39:43,000 Però puc si dic: "Bé, esperi un minut. On era el canvi?" 743 00:39:43,000 --> 00:39:46,000 Deixin-me seguir endavant i dir "0 marc". 744 00:39:46,000 --> 00:39:48,000 Ara estic de tornada on vull estar, i en un apart, 745 00:39:48,000 --> 00:39:52,000 hi ha altres ordres també, com si realment estàs aconseguint mecanografiar avorrit següent, següent, següent, següent, 746 00:39:52,000 --> 00:39:56,000 en general, es pot dir coses com "el 10", i que passarà pels següents 10 línies. 747 00:39:56,000 --> 00:39:59,000 També pot escriure "continuar" quan realment fart de caminar a través d'ella. 748 00:39:59,000 --> 00:40:05,000 Continuar s'executarà el programa sense interrupció fins que arriba a un altre punt d'interrupció, 749 00:40:05,000 --> 00:40:07,000 ja sigui en un bucle o més avall en el seu programa. 750 00:40:07,000 --> 00:40:11,000 >> En aquest cas es va continuar fins al final, i el programa surt normalment. 751 00:40:11,000 --> 00:40:13,000 Aquesta és una forma elegant, procés inferior. 752 00:40:13,000 --> 00:40:16,000 Només el seu programa va acabar normalment. 753 00:40:16,000 --> 00:40:24,000 Més sobre això en el vídeo i en la depuració de les sessions per venir. 754 00:40:24,000 --> 00:40:26,000 Això era molt. 755 00:40:26,000 --> 00:40:35,000 Anem a prendre el nostre fill de 5 minuts de descans aquí, i anem a tornar amb les estructures i els arxius. 756 00:40:35,000 --> 00:40:38,000 >> Si ha bussejat en conjunt de processadors d'aquesta setmana ja 757 00:40:38,000 --> 00:40:41,000 vostè sabrà que utilitzem en el codi de distribució, 758 00:40:41,000 --> 00:40:45,000 la font de codi que us proporcionem a vostè com un punt de partida, algunes tècniques noves. 759 00:40:45,000 --> 00:40:50,000 En particular, hem introduït aquesta nova paraula clau es diu estructura, l'estructura, 760 00:40:50,000 --> 00:40:53,000 de manera que puguem crear variables personalitzades de tot tipus. 761 00:40:53,000 --> 00:40:57,000 També va introduir la noció d'arxiu de l'arxiu d'entrada d'E / S i de sortida, 762 00:40:57,000 --> 00:41:00,000 i això és el que podem guardar l'estat 763 00:41:00,000 --> 00:41:03,000 del seu tauler Scramble en un arxiu en disc 764 00:41:03,000 --> 00:41:06,000 perquè els companys docents i comprenc 765 00:41:06,000 --> 00:41:09,000 el que està succeint dins del seu programa sense haver de jugar de forma manual 766 00:41:09,000 --> 00:41:11,000 desenes de jocs de baralla. 767 00:41:11,000 --> 00:41:13,000 Podem fer-ho més automatitzadament. 768 00:41:13,000 --> 00:41:18,000 >> Aquesta idea d'una estructura resol un problema bastant convincent. 769 00:41:18,000 --> 00:41:21,000 Suposem que volem implementar algun programa 770 00:41:21,000 --> 00:41:25,000 que d'alguna manera fa un seguiment de la informació sobre els estudiants, 771 00:41:25,000 --> 00:41:28,000 i els estudiants podrien tenir, per exemple, una identificació, un nom 772 00:41:28,000 --> 00:41:31,000 i una casa en un lloc com Harvard, així que aquests són tres peces d'informació 773 00:41:31,000 --> 00:41:34,000 volem mantenir al seu voltant, així que permetin-me seguir endavant i començar a escriure un petit programa aquí, 774 00:41:34,000 --> 00:41:38,000 incloure stdio.h. 775 00:41:38,000 --> 00:41:42,000 Deixa fer incloure cs50.h. 776 00:41:42,000 --> 00:41:44,000 I després començar la meva funció principal. 777 00:41:44,000 --> 00:41:46,000 No em molestaré amb els arguments de línia de comandes, 778 00:41:46,000 --> 00:41:49,000 i aquí vull tenir un estudiant, així que vaig a dir 779 00:41:49,000 --> 00:41:54,000 un estudiant té un nom, així que vaig a dir "nom de cadena." 780 00:41:54,000 --> 00:41:59,000 Llavors jo vaig a dir un estudiant també té un ID, aneu int així, 781 00:41:59,000 --> 00:42:03,000 i un estudiant té una casa, així que també vaig a dir "casa de corda". 782 00:42:03,000 --> 00:42:06,000 Llavors vaig a demanar aquest una mica més neta d'aquesta manera. 783 00:42:06,000 --> 00:42:11,000 Bé, ara tinc 3 variables amb les que representen a un estudiant, de manera que "un estudiant". 784 00:42:11,000 --> 00:42:15,000 >> I ara vull omplir aquests valors, així que vaig a seguir endavant i dir alguna cosa com 785 00:42:15,000 --> 00:42:18,000 "Aneu = 123". 786 00:42:18,000 --> 00:42:21,000 Nom es posarà a David. 787 00:42:21,000 --> 00:42:24,000 Diguem que la casa es posarà Mather, 788 00:42:24,000 --> 00:42:31,000 i després em vaig a fer alguna cosa arbitràriament com printf ("% s, 789 00:42:31,000 --> 00:42:37,000 amb identificador% d, viu a% s. 790 00:42:37,000 --> 00:42:41,000 I ara, què és el que vull connectar aquí, una després de l'altra? 791 00:42:41,000 --> 00:42:47,000 Nom, id, casa, retorna 0. 792 00:42:47,000 --> 00:42:50,000 Bé, llevat que vaig ficar la pota en algun lloc aquí 793 00:42:50,000 --> 00:42:54,000 Crec que tenim un programa molt bo que emmagatzema un estudiant. 794 00:42:54,000 --> 00:42:57,000 Per descomptat, això no és tan interessant. I si vull tenir 2 estudiants? 795 00:42:57,000 --> 00:42:59,000 Això no és gran cosa. Puc suportar 2 persones. 796 00:42:59,000 --> 00:43:03,000 Deixin-me seguir endavant i posar en relleu aquest i baixar aquí, 797 00:43:03,000 --> 00:43:09,000 i el que puc dir "id = 456" per algú com Rob que viu a Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Bé, espera, però no puc cridar a aquests el mateix, 799 00:43:12,000 --> 00:43:15,000 i sembla que vaig a haver de copiar això, 800 00:43:15,000 --> 00:43:19,000 així que permetin-me dir que aquests seran variables de David, 801 00:43:19,000 --> 00:43:23,000 i em deixes algunes còpies d'aquests per Rob. 802 00:43:23,000 --> 00:43:27,000 Anomenarem a aquests Rob, però això no funcionarà ara 803 00:43:27,000 --> 00:43:33,000 perquè he-espera, canviarem a ID1, Nom1 i house1. 804 00:43:33,000 --> 00:43:35,000 Rob serà 2, 2. 805 00:43:35,000 --> 00:43:42,000 He de canviar això aquí, aquí, aquí, aquí, aquí, aquí. 806 00:43:42,000 --> 00:43:45,000 Espera, què passa amb Tommy? Farem això de nou. 807 00:43:45,000 --> 00:43:49,000 Òbviament, si vostè encara pensa que això és una bona manera de fer això, no ho és, 808 00:43:49,000 --> 00:43:52,000 així copiar / enganxar malament. 809 00:43:52,000 --> 00:43:55,000 Però hem resolt aquest fa una setmana. 810 00:43:55,000 --> 00:43:59,000 >> Quina era la nostra solució quan volíem tenir diverses instàncies del mateix tipus de dades? 811 00:43:59,000 --> 00:44:01,000 [Els estudiants] Matriu. 812 00:44:01,000 --> 00:44:03,000 Una matriu, així que tractarem de netejar això. 813 00:44:03,000 --> 00:44:07,000 Vull deixar una mica d'espai per a mi mateix a la part superior, i m'ho dius a mi fer això en lloc aquí. 814 00:44:07,000 --> 00:44:12,000 Anomenarem a aquestes persones, i en el seu lloc vaig a dir "ids int" 815 00:44:12,000 --> 00:44:14,000 i jo vaig a donar suport a 3 de nosaltres per ara. 816 00:44:14,000 --> 00:44:18,000 Vaig a dir "noms de cadena," i vaig a donar suport a 3 de nosaltres, 817 00:44:18,000 --> 00:44:22,000 i després vaig a dir "cases de corda", i jo vaig a donar suport a tres de nosaltres. 818 00:44:22,000 --> 00:44:26,000 Ara aquí en lloc de David obtenir les seves pròpies variables locals 819 00:44:26,000 --> 00:44:28,000 podem desfer-nos d'ells. 820 00:44:28,000 --> 00:44:30,000 Això se sent bé que estem netejant això. 821 00:44:30,000 --> 00:44:35,000 Llavors puc dir que David serà [0] i noms [0] 822 00:44:35,000 --> 00:44:38,000 i cases [0]. 823 00:44:38,000 --> 00:44:41,000 I després tenim a Rob semblant pot estalviar en això. 824 00:44:41,000 --> 00:44:46,000 Anem a posar això aquí, així que serà arbitràriament ids [1]. 825 00:44:46,000 --> 00:44:50,000 Ell serà noms [1], 826 00:44:50,000 --> 00:44:53,000 i després, finalment, les cases [1]. 827 00:44:53,000 --> 00:44:57,000 >> Encara una mica tediós, i ara he de resoldre això, 828 00:44:57,000 --> 00:45:03,000 així que anem a dir "noms [0], id [0], cases [0], 829 00:45:03,000 --> 00:45:06,000 i anem a pluralitzar això. 830 00:45:06,000 --> 00:45:09,000 Ids, IDS, IDS. 831 00:45:09,000 --> 00:45:12,000 I de nou, ho estic fent, així que de nou, ja estic recorrent a copiar / enganxar de nou, 832 00:45:12,000 --> 00:45:14,000 el més probable és que hi ha una altra solució aquí. 833 00:45:14,000 --> 00:45:18,000 És probable que pugui netejar això més lluny amb un bucle o alguna cosa així, 834 00:45:18,000 --> 00:45:21,000 Així que en resum, és una mica millor, però encara se sent com 835 00:45:21,000 --> 00:45:24,000 Estic recorrent a copiar / enganxar, però fins i tot això, sostinc, 836 00:45:24,000 --> 00:45:27,000 és realment no és fonamentalment la solució adequada perquè 837 00:45:27,000 --> 00:45:29,000 I si en algun moment vam decidir que vostè sap què? 838 00:45:29,000 --> 00:45:32,000 En realitat, hauríem d'haver estat emmagatzemant les adreces de correu electrònic de David i Rob 839 00:45:32,000 --> 00:45:34,000 i tots els altres en aquest programa. 840 00:45:34,000 --> 00:45:36,000 També cal guardar els números de telèfon. 841 00:45:36,000 --> 00:45:39,000 També cal guardar els números de contacte d'emergència. 842 00:45:39,000 --> 00:45:41,000 Tenim totes aquestes peces de dades que voleu emmagatzemar, 843 00:45:41,000 --> 00:45:43,000 Llavors, com fa vostè per fer això? 844 00:45:43,000 --> 00:45:46,000 >> Vostè declara altra matriu a la part superior, a continuació, afegir manualment 845 00:45:46,000 --> 00:45:49,000 una adreça de correu electrònic [0], l'adreça de correu electrònic [1] 846 00:45:49,000 --> 00:45:51,000 per David i Rob i així successivament. 847 00:45:51,000 --> 00:45:56,000 Però no hi ha realment només una suposició subjacent en aquest disseny 848 00:45:56,000 --> 00:45:59,000 que estic fent servir el sistema d'honor saber que 849 00:45:59,000 --> 00:46:03,000 [I] en cada un dels diversos arrays 850 00:46:03,000 --> 00:46:06,000 que passa és que es refereixen a la mateixa persona, 851 00:46:06,000 --> 00:46:10,000 de manera que [0] a ids és el número 123, 852 00:46:10,000 --> 00:46:13,000 i vaig a assumir que els noms [0] 853 00:46:13,000 --> 00:46:16,000 és la mateixa persona el nom i cases [0] 854 00:46:16,000 --> 00:46:21,000 és la casa de la mateixa persona i així successivament per a tots els arrays diferents que creen. 855 00:46:21,000 --> 00:46:24,000 Però cal notar que no hi ha vincle fonamental 856 00:46:24,000 --> 00:46:27,000 entre els 3 trossos d'informació, id, nom i la casa, 857 00:46:27,000 --> 00:46:32,000 tot i que l'entitat que estem tractant de modelar en aquest programa no és arrays. 858 00:46:32,000 --> 00:46:35,000 Les matrius són precisament d'aquesta manera programàtica de fer-ho. 859 00:46:35,000 --> 00:46:38,000 El que realment volem per modelar en el nostre programa és una persona 860 00:46:38,000 --> 00:46:41,000 igual que David, una persona com Rob dins dels quals 861 00:46:41,000 --> 00:46:46,000 o encapsulació és un nom i una ID i una casa. 862 00:46:46,000 --> 00:46:49,000 >> Podem d'alguna manera expressar aquesta idea de l'encapsulació 863 00:46:49,000 --> 00:46:52,000 mitjançant el qual una persona té una identitat, un nom i una casa 864 00:46:52,000 --> 00:46:55,000 i no recórrer a aquest truc pel que realment ens 865 00:46:55,000 --> 00:46:58,000 Confiem que alguna cosa suport 866 00:46:58,000 --> 00:47:02,000 es refereix a la mateixa entitat humana en cada un d'aquests conjunts diferents? 867 00:47:02,000 --> 00:47:04,000 De fet, podem fer això. 868 00:47:04,000 --> 00:47:08,000 Deixa anar més important per ara, i em deixa crear el meu propi tipus de dades 869 00:47:08,000 --> 00:47:10,000 realment per primera vegada. 870 00:47:10,000 --> 00:47:14,000 Es va utilitzar aquesta tècnica en Scramble, 871 00:47:14,000 --> 00:47:17,000 però aquí vaig a seguir endavant i crear un tipus de dades, 872 00:47:17,000 --> 00:47:19,000 i saps què, jo vaig a dir estudiant o persona, 873 00:47:19,000 --> 00:47:23,000 i jo vaig a utilitzar typedef per definir un tipus. 874 00:47:23,000 --> 00:47:25,000 Vaig a dir que es tracta d'una estructura, 875 00:47:25,000 --> 00:47:29,000 i després aquesta estructura serà d'estudiant tipus, direm, 876 00:47:29,000 --> 00:47:31,000 encara que és una mica antiquat ara per a mi. 877 00:47:31,000 --> 00:47:33,000 Direm "int id." 878 00:47:33,000 --> 00:47:35,000 Anem a dir "nom de cadena." 879 00:47:35,000 --> 00:47:37,000 Llavors direm "casa de Cordes", 880 00:47:37,000 --> 00:47:40,000 de manera que ara el final d'aquestes línies de codi 881 00:47:40,000 --> 00:47:45,000 Acabo ensenyat so metàl · lic que hi ha 882 00:47:45,000 --> 00:47:49,000 a més d'un tipus de dades sencers, a més de cordes, a més de dobles, a més de carrosses. 883 00:47:49,000 --> 00:47:54,000 >> A partir d'aquest moment en la línia de temps de 11, ara hi ha un nou tipus de dades anomenat als estudiants, 884 00:47:54,000 --> 00:47:58,000 i ara puc declarar una variable d'estudiant en qualsevol lloc que desitgi, 885 00:47:58,000 --> 00:48:01,000 així que em baixi aquí a la gent. 886 00:48:01,000 --> 00:48:05,000 Ara puc desfer d'això, i puc anar de nou a David aquí, 887 00:48:05,000 --> 00:48:10,000 i David realment puc dir que David, 888 00:48:10,000 --> 00:48:13,000 literalment podem anomenar la variable de mi mateix, 889 00:48:13,000 --> 00:48:16,000 serà de tipus estudiantil. 890 00:48:16,000 --> 00:48:18,000 Això pot semblar una mica estrany, però això no és tan diferent 891 00:48:18,000 --> 00:48:22,000 de declarar una cosa com un enter o una cadena o un flotador. 892 00:48:22,000 --> 00:48:24,000 El que passa a dir-se estudiant ara, 893 00:48:24,000 --> 00:48:28,000 i si vull posar alguna cosa dins d'aquesta estructura 894 00:48:28,000 --> 00:48:31,000 Ara he de fer servir una nova peça de sintaxi, però és bastant senzill, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "David" a la capital de D, 896 00:48:39,000 --> 00:48:42,000 i david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 i ara puc desfer d'aquesta cosa aquí. 898 00:48:46,000 --> 00:48:51,000 Notificació ara hem redissenyat el nostre programa en realitat una forma molt millor 899 00:48:51,000 --> 00:48:54,000 en què ara el nostre programa reflecteix el món real. 900 00:48:54,000 --> 00:48:57,000 >> Hi ha una noció real d'una persona o un estudiant. 901 00:48:57,000 --> 00:49:02,000 Aquí tenim ara una versió C d'una persona o més específicament un estudiant. 902 00:49:02,000 --> 00:49:05,000 A l'interior d'aquesta persona són aquestes característiques pertinents, 903 00:49:05,000 --> 00:49:10,000 ID, nom i casa, així que Rob es converteix essencialment la mateixa cosa aquí baix, 904 00:49:10,000 --> 00:49:14,000 estudiant per robar, i ara rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob". 906 00:49:17,000 --> 00:49:20,000 El fet que la variable es diu Rob és una espècie de sentit. 907 00:49:20,000 --> 00:49:22,000 Podríem haver dit x o i z. 908 00:49:22,000 --> 00:49:25,000 Ens va cridar a Rob a ser semànticament consistent, 909 00:49:25,000 --> 00:49:28,000 però en realitat el nom és dins d'aquest mateix camp, 910 00:49:28,000 --> 00:49:30,000 així que ara tinc això. 911 00:49:30,000 --> 00:49:33,000 Això també no se sent com el millor disseny que he codificat David. 912 00:49:33,000 --> 00:49:35,000 He codificat Rob. 913 00:49:35,000 --> 00:49:39,000 I encara he de recórrer a una còpia i pega cada vegada que vull noves variables. 914 00:49:39,000 --> 00:49:43,000 D'altra banda, he de donar-li pel que sembla cadascuna d'aquestes variables un nom, 915 00:49:43,000 --> 00:49:46,000 encara que jo preferiria descriure aquestes variables 916 00:49:46,000 --> 00:49:48,000  estudiants més genèricament. 917 00:49:48,000 --> 00:49:52,000 >> Ara podem combinar les idees que han estat treballant bé per a nosaltres 918 00:49:52,000 --> 00:49:56,000 i en lloc de dir: "Saps què, dóna'm uns estudiants anomenats variables, 919 00:49:56,000 --> 00:50:01,000 i haurem de ser de mida 3 ", de manera que ara pot refinar més a fons, 920 00:50:01,000 --> 00:50:04,000 desfer-se del manual declarar David, 921 00:50:04,000 --> 00:50:08,000 i que en el seu lloc pot dir una cosa així com estudiants [0] aquí. 922 00:50:08,000 --> 00:50:11,000 Llavors puc dir que els estudiants [0] aquí, 923 00:50:11,000 --> 00:50:14,000 estudiants [0] aquí, i així successivament, i em pot donar la volta 924 00:50:14,000 --> 00:50:16,000 i netejar això per Rob. 925 00:50:16,000 --> 00:50:19,000 Jo també podria anar I ara potser afegint un bucle 926 00:50:19,000 --> 00:50:23,000 i l'ús de GetString i getInt per aconseguir realment aquests valors per part de l'usuari. 927 00:50:23,000 --> 00:50:27,000 Podria seguir sobre com afegir una constant perquè això és generalment una mala pràctica 928 00:50:27,000 --> 00:50:29,000 per codificar un nombre arbitrari com 3 aquí 929 00:50:29,000 --> 00:50:33,000 i llavors només recorda que has de triar un màxim de 3 alumnes al mateix. 930 00:50:33,000 --> 00:50:36,000 Probablement seria millor fer servir # defineix a la part superior del meu arxiu 931 00:50:36,000 --> 00:50:40,000 i el factor que fos, així que en realitat, deixa seguir endavant i generalitzar això. 932 00:50:40,000 --> 00:50:43,000 >> Permetin-me obrir un exemple que es troba entre l'actual 933 00:50:43,000 --> 00:50:46,000 exemples d'antelació, structs1. 934 00:50:46,000 --> 00:50:49,000 Es tracta d'un programa més complet que utilitza # defineix aquí 935 00:50:49,000 --> 00:50:51,000 i diu que tindrem 3 estudiants per defecte. 936 00:50:51,000 --> 00:50:54,000 Aquí estic declarant un valor de classe dels estudiants, 937 00:50:54,000 --> 00:50:57,000 de manera que un saló de classes dels estudiants, i ara estic fent servir un bucle 938 00:50:57,000 --> 00:51:00,000 només per fer el codi una mica més elegant, popular la classe 939 00:51:00,000 --> 00:51:05,000 amb l'entrada de l'usuari, de manera iterar des i = 0 en fins a estudiants, que és 3. 940 00:51:05,000 --> 00:51:07,000 I llavors demanar a l'usuari en aquesta versió 941 00:51:07,000 --> 00:51:10,000  Quin és l'ID de l'estudiant, i ho aconsegueix amb getInt. 942 00:51:10,000 --> 00:51:13,000 Quin és el nom de l'estudiant, i després em poso amb GetString. 943 00:51:13,000 --> 00:51:15,000 Què és la casa de l'estudiant? Ho entenc amb GetString. 944 00:51:15,000 --> 00:51:19,000 I després al final aquí em vaig decidir a canviar 945 00:51:19,000 --> 00:51:22,000 com estic imprimint aquests i utilitzar realment un bucle, 946 00:51:22,000 --> 00:51:24,000 I qui sóc jo imprimir? 947 00:51:24,000 --> 00:51:27,000 D'acord amb el comentari que estic imprimint a ningú en Mather, 948 00:51:27,000 --> 00:51:30,000 i això és tot el que Rob i Tommy i així successivament en realitat-de Tommy en Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy i David s'imprimiria en aquest cas, però, com funciona això? 950 00:51:34,000 --> 00:51:40,000 No hem vist aquesta funció abans, però prendre una conjectura pel que fa al que fa. 951 00:51:40,000 --> 00:51:42,000 Compara cadenes. 952 00:51:42,000 --> 00:51:45,000 >> És una mica no és evident com es compara cadenes perquè resulta 953 00:51:45,000 --> 00:51:49,000 si retorna 0, que significa que les cadenes són iguals. 954 00:51:49,000 --> 00:51:53,000 Si torna un -1 significa que un ve alfabèticament abans que l'altre, 955 00:51:53,000 --> 00:51:57,000 i si retorna una paraula que significa l'altre ve alfabèticament 956 00:51:57,000 --> 00:52:00,000 abans que l'altre, i es pot veure en línia oa la pàgina de manual 957 00:52:00,000 --> 00:52:04,000 per veure exactament on és el que, però tot això està fent ara és el que està dient 958 00:52:04,000 --> 00:52:09,000 si el [i]. casa és igual a "Mather" 959 00:52:09,000 --> 00:52:13,000 a continuació, seguir endavant i imprimir això i allò altre està en Mather. 960 00:52:13,000 --> 00:52:16,000 Però això és una cosa que no hem vist abans, i tornarem a això. 961 00:52:16,000 --> 00:52:21,000 Jo no recordo haver hagut de fer això en qualsevol dels meus programes. 962 00:52:21,000 --> 00:52:24,000 Gratuït aparentment en referència a la memòria, alliberant la memòria, 963 00:52:24,000 --> 00:52:31,000 però el que la memòria m'estic alliberant pel que sembla en aquest bucle a la part inferior d'aquest programa? 964 00:52:31,000 --> 00:52:34,000 Sembla que m'estic alliberant a nom d'una persona 965 00:52:34,000 --> 00:52:37,000 i la casa d'una persona, però per què és això? 966 00:52:37,000 --> 00:52:41,000 >> Resulta que totes aquestes setmanes que he estat usant GetString 967 00:52:41,000 --> 00:52:45,000 hem anat introduint tipus d'un error en cada un dels seus programes. 968 00:52:45,000 --> 00:52:51,000 GetString per disseny assigna memòria perquè pugui tornar a que una cadena, 969 00:52:51,000 --> 00:52:55,000 com David, o Rob, i llavors pot fer el que vulguis 970 00:52:55,000 --> 00:52:59,000 amb aquesta cadena en el seu programa, ja que hem reservat la memòria per a vostè. 971 00:52:59,000 --> 00:53:02,000 El problema és que tot aquest temps cada vegada que truqui GetString 972 00:53:02,000 --> 00:53:05,000 Nosaltres, els autors de GetString, han estat sol · licitant al sistema operatiu 973 00:53:05,000 --> 00:53:07,000 per donar-nos una mica de RAM per a aquesta cadena. 974 00:53:07,000 --> 00:53:09,000 Dóna'ns una mica de RAM per a aquesta cadena següent. 975 00:53:09,000 --> 00:53:11,000 Dóna'ns una mica més RAM per a aquesta cadena següent. 976 00:53:11,000 --> 00:53:13,000 El que vostè, el programador, mai han estat fent 977 00:53:13,000 --> 00:53:15,000 que ens està donant de nou la memòria, 978 00:53:15,000 --> 00:53:17,000 de manera que per a aquestes setmanes tots els programes que has escrit 979 00:53:17,000 --> 00:53:20,000 han tingut el que es diu un salt memòria pel de seguir utilitzant 980 00:53:20,000 --> 00:53:24,000 més memòria i més cada vegada que truqui GetString, i això està bé. 981 00:53:24,000 --> 00:53:27,000 Ens deliberadament fer que en les primeres setmanes, perquè no és tan interessant 982 00:53:27,000 --> 00:53:29,000 haver de preocupar d'on la cadena està venint. 983 00:53:29,000 --> 00:53:34,000 Tot el que vull és la paraula Rob tornar quan l'usuari ho tipus polz 984 00:53:34,000 --> 00:53:38,000 >> Però avançar ara hem de començar a aconseguir més sofisticat sobre això. 985 00:53:38,000 --> 00:53:42,000 Cada vegada que assignar memòria serà millor que eventualment tornar. 986 00:53:42,000 --> 00:53:45,000 En cas contrari, en el món real en el teu Mac o PC que pugui tenir de tant en tant amb experiència 987 00:53:45,000 --> 00:53:50,000 símptomes que el seu equip està a punt de paralitzar-eventualment 988 00:53:50,000 --> 00:53:54,000 o la pilota de platja estúpid gir s'acaba d'ocupar l'ordinador de 989 00:53:54,000 --> 00:53:56,000 atenció sencera i no pots fer les coses. 990 00:53:56,000 --> 00:54:00,000 Això pot ser explicat per qualsevol nombre d'errors, però entre els possibles errors 991 00:54:00,000 --> 00:54:03,000 són coses que es diuen pèrdues de memòria mitjançant el qual una persona que va escriure aquest tros de programari 992 00:54:03,000 --> 00:54:07,000 que està utilitzant no recordava per alliberar memòria 993 00:54:07,000 --> 00:54:10,000 que ell o ella li va demanar al sistema operatiu per, 994 00:54:10,000 --> 00:54:14,000 no utilitzar GetString, perquè això és una cosa CS50, però utilitzant funcions similars 995 00:54:14,000 --> 00:54:16,000 que demanen que el sistema operatiu per a la memòria. 996 00:54:16,000 --> 00:54:19,000 Si vostè o fiquen la pota i que en realitat mai tornar memòria 997 00:54:19,000 --> 00:54:24,000 un símptoma que pot ser que un programa s'alenteix i retarda i redueix la velocitat 998 00:54:24,000 --> 00:54:26,000 llevat que recordi trucar gratis. 999 00:54:26,000 --> 00:54:28,000 >> Tornarem a quan i per què es diu lliure, 1000 00:54:28,000 --> 00:54:32,000 però seguirem endavant només per si de cas i tractar d'executar aquest programa en especial. 1001 00:54:32,000 --> 00:54:35,000 Això va ser anomenat structs1, introdueixi. 1002 00:54:35,000 --> 00:54:40,000 Deixin-me seguir endavant i executar structs1, 123, David Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Tommy Mather, i veiem a David en Mather, de Tommy en Mather. 1005 00:54:50,000 --> 00:54:53,000 Això és només una prova de seny poc que el programa està funcionant. 1006 00:54:53,000 --> 00:54:56,000 Ara, per desgràcia, aquest programa és una mica frustrant que 1007 00:54:56,000 --> 00:55:00,000 Vaig fer tot aquest treball, vaig escriure en 9 diferents cordes, prem enter, 1008 00:55:00,000 --> 00:55:04,000 se li va dir que estava en Mather, però òbviament jo sabia que estava en Mather i perquè el va escriure. 1009 00:55:04,000 --> 00:55:07,000 Seria bo si almenys aquest programa s'assembla més a una base de dades 1010 00:55:07,000 --> 00:55:10,000 i que en realitat recorda el que he escrit en 1011 00:55:10,000 --> 00:55:12,000 així que mai més hagi d'introduir aquests registres estudiantils. 1012 00:55:12,000 --> 00:55:15,000 Potser és com un sistema registrarial. 1013 00:55:15,000 --> 00:55:21,000 >> Podem fer això usant aquesta tècnica coneguda com a entrada d'arxiu de l'arxiu d'E / S i de sortida, 1014 00:55:21,000 --> 00:55:24,000 una manera molt genèrica de dir en qualsevol moment que desitgi llegir o escriure arxius dels arxius 1015 00:55:24,000 --> 00:55:26,000 vostè pot fer això amb un cert conjunt de funcions. 1016 00:55:26,000 --> 00:55:29,000 Deixin-me seguir endavant i obrir aquest structs2.c exemple, 1017 00:55:29,000 --> 00:55:33,000 que és gairebé idèntic, però anem a veure el que fa ara. 1018 00:55:33,000 --> 00:55:36,000 A la part superior de l'arxiu de declarar una classe d'estudiants. 1019 00:55:36,000 --> 00:55:38,000 I a continuació, omplir la classe amb l'entrada de l'usuari, 1020 00:55:38,000 --> 00:55:41,000 de manera que aquestes línies de codi són exactament com abans. 1021 00:55:41,000 --> 00:55:45,000 Llavors, si em desplaço fins aquí puc imprimir tots els que estan en Mather arbitràriament com abans, 1022 00:55:45,000 --> 00:55:47,000 però aquesta és una nova característica interessant. 1023 00:55:47,000 --> 00:55:51,000 Aquestes línies de codi són nous, i introdueixen alguna cosa aquí, 1024 00:55:51,000 --> 00:55:55,000 De arxius, tot en majúscules, i té * aquí també. 1025 00:55:55,000 --> 00:55:58,000 Permetin-me passar això aquí, a * per aquí també. 1026 00:55:58,000 --> 00:56:00,000 >> Aquesta funció no hem vist abans, fopen, 1027 00:56:00,000 --> 00:56:03,000 però significa obrir l'arxiu, així que anem a llegir-lo a través d'ells, 1028 00:56:03,000 --> 00:56:05,000 i això és una cosa que anem a tornar a conjunts de processadors futurs, 1029 00:56:05,000 --> 00:56:10,000 però aquesta línia aquí essencialment obre un arxiu anomenat base de dades, 1030 00:56:10,000 --> 00:56:13,000 i, específicament, s'obre de manera que pot fer el que a ell? 1031 00:56:13,000 --> 00:56:15,000 [Inaudible-alumne] 1032 00:56:15,000 --> 00:56:19,000 Bé, llavors "w" només vol dir que està dient al sistema operatiu 1033 00:56:19,000 --> 00:56:21,000 obrir aquest arxiu de manera que podia escriure-hi. 1034 00:56:21,000 --> 00:56:23,000 No vull que ho llegeixi. Jo no vull mirar només a ell. 1035 00:56:23,000 --> 00:56:26,000 Vull canviar i afegir coses potencialment a la mateixa, 1036 00:56:26,000 --> 00:56:28,000 i l'arxiu es dirà base de dades. 1037 00:56:28,000 --> 00:56:30,000 Això podria anomenar qualsevol cosa. 1038 00:56:30,000 --> 00:56:32,000 Això podria ser database.txt. Això podria ser. Db. 1039 00:56:32,000 --> 00:56:37,000 Això podria ser una paraula com foo, però arbitràriament va escollir el nom de la base de dades d'arxiu. 1040 00:56:37,000 --> 00:56:42,000 Aquesta és una prova de seny poc que tornarem en detall en el temps, 1041 00:56:42,000 --> 00:56:47,000 si dóna, per al punter d'arxiu, no significa NULL com tot està bé. 1042 00:56:47,000 --> 00:56:51,000 >> Llarga història curta, funciona com fopen vegades fallen. 1043 00:56:51,000 --> 00:56:53,000 Potser el fitxer no existeix. Potser t'has quedat sense espai de disc. 1044 00:56:53,000 --> 00:56:55,000 No sé si vostè té permís per a aquesta carpeta, 1045 00:56:55,000 --> 00:56:58,000 pel que si fopen retorna alguna cosa nul dolent ha passat. 1046 00:56:58,000 --> 00:57:02,000 En canvi, si no torna fopen nul tot està bé 1047 00:57:02,000 --> 00:57:04,000 i puc començar a escriure en aquest arxiu. 1048 00:57:04,000 --> 00:57:06,000 Aquest és un truc nou. 1049 00:57:06,000 --> 00:57:08,000 Es tracta d'un bucle perquè es itera sobre cadascun dels meus estudiants, 1050 00:57:08,000 --> 00:57:10,000 i això es veu molt similar al que hem fet abans, 1051 00:57:10,000 --> 00:57:15,000 però aquesta funció és un cosí de l'anomenada printf printf fprintf per arxiu, 1052 00:57:15,000 --> 00:57:18,000 i nota que és diferent en tan sols 2 maneres. 1053 00:57:18,000 --> 00:57:20,000 Un d'ells, que comença amb F en lloc de p, 1054 00:57:20,000 --> 00:57:23,000 però després el seu primer argument és aparentment el que? 1055 00:57:23,000 --> 00:57:25,000 [Els estudiants] de l'arxiu. >> Es tracta d'un arxiu. 1056 00:57:25,000 --> 00:57:30,000 Aquesta cosa anomenada fp, que finalment va separar el que és un apuntador d'arxiu, 1057 00:57:30,000 --> 00:57:35,000 però per ara simplement fp representa l'arxiu que he obert, 1058 00:57:35,000 --> 00:57:41,000 fprintf aquí per imprimir aquesta dient ID de l'usuari a l'arxiu, no a la pantalla. 1059 00:57:41,000 --> 00:57:44,000 Imprimir el vostre nom en el fitxer, no a la pantalla, 1060 00:57:44,000 --> 00:57:47,000 la casa a l'arxiu, no a la pantalla, i després aquí, òbviament, 1061 00:57:47,000 --> 00:57:50,000 tancar el fitxer, i després cap avall aquí lliurement la memòria. 1062 00:57:50,000 --> 00:57:53,000 >> L'única diferència entre aquesta versió i la versió 1 feb 1063 00:57:53,000 --> 00:57:58,000 és la introducció d'fopen i aquest fitxer * 1064 00:57:58,000 --> 00:58:01,000 i aquesta noció de fprintf, així que anem a veure el que el resultat final és. 1065 00:58:01,000 --> 00:58:03,000 Deixa anar al meu finestra de terminal. 1066 00:58:03,000 --> 00:58:06,000 Deixa córrer structs2, introdueixi. 1067 00:58:06,000 --> 00:58:09,000 Sembla que tot està bé. Anem a tornar a executar structs2. 1068 00:58:09,000 --> 00:58:15,000 123, David Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Tommy Mather, introdueixi. 1070 00:58:19,000 --> 00:58:23,000 Sembla que es comportaven de la mateixa, però si ara faig ls 1071 00:58:23,000 --> 00:58:28,000 compte del que està a l'arxiu aquí entre tota la meva codi, base de dades, 1072 00:58:28,000 --> 00:58:32,000 així que anem a obrir aquesta, gedit de base de dades, i veure això. 1073 00:58:32,000 --> 00:58:34,000 No és la més sexy de formats d'arxiu. 1074 00:58:34,000 --> 00:58:38,000 Realment és un tros de línia de dades per línia per línia, 1075 00:58:38,000 --> 00:58:42,000 però aquells de vostès que fan servir arxius d'Excel o CSV, valors separats per comes, 1076 00:58:42,000 --> 00:58:47,000 Certament podria haver utilitzat fprintf fer en el seu lloc potser una mica com això 1077 00:58:47,000 --> 00:58:50,000 pel que jo podia crear l'equivalent d'un arxiu d'Excel 1078 00:58:50,000 --> 00:58:53,000 en separar amb comes coses, no només les noves línies. 1079 00:58:53,000 --> 00:58:56,000 >> En aquest cas, si hagués utilitzat en lloc comes en lloc de línies noves 1080 00:58:56,000 --> 00:59:01,000 Jo, literalment, podria obrir el fitxer de base de dades en Excel si en canvi ho va fer veure com això. 1081 00:59:01,000 --> 00:59:03,000 En resum, ara que tenim el poder per escriure en arxius 1082 00:59:03,000 --> 00:59:07,000 ara podem començar a dades persistents, mantenint al voltant del disc 1083 00:59:07,000 --> 00:59:10,000 perquè puguem mantenir la informació al voltant d'una i una altra. 1084 00:59:10,000 --> 00:59:14,000 Tingueu en compte un parell de coses més que ara són una mica més familiar. 1085 00:59:14,000 --> 00:59:16,000 A la part superior d'aquest arxiu C tenim un typedef 1086 00:59:16,000 --> 00:59:21,000 perquè volíem crear un tipus de dades que representa una paraula, 1087 00:59:21,000 --> 00:59:25,000 pel que aquest tipus s'anomena paraula, ia l'interior d'aquesta estructura 1088 00:59:25,000 --> 00:59:27,000 que és una mica més de luxe ara. 1089 00:59:27,000 --> 00:59:30,000 Per què és una paraula composta de semblar una matriu? 1090 00:59:30,000 --> 00:59:33,000 Què és una paraula que només intuïtivament? 1091 00:59:33,000 --> 00:59:35,000 >> És una sèrie de caràcters. 1092 00:59:35,000 --> 00:59:37,000 És una seqüència de caràcters esquena amb esquena amb esquena. 1093 00:59:37,000 --> 00:59:41,000 Lletres en majúscules resulta ser arbitràriament dir la longitud màxima 1094 00:59:41,000 --> 00:59:44,000 de qualsevol paraula al diccionari que utilitzeu per Scramble. 1095 00:59:44,000 --> 00:59:46,000 Per què tinc un +1? 1096 00:59:46,000 --> 00:59:48,000 El caràcter nul. 1097 00:59:48,000 --> 00:59:51,000 Recordem quan vam fer l'exemple Bananagrams necessitàvem un valor especial 1098 00:59:51,000 --> 00:59:55,000 al final de la paraula per tal de seguir la pista 1099 00:59:55,000 --> 00:59:59,000 d'on les paraules en realitat va acabar, i com l'especificació del conjunt de problema, diu 1100 00:59:59,000 --> 01:00:03,000 aquí estem associant amb una paraula donada un valor boolean, 1101 01:00:03,000 --> 01:00:05,000 una bandera, per dir-ho, certa o falsa. 1102 01:00:05,000 --> 01:00:09,000 Has trobat ja aquesta paraula, perquè ens adonem de 1103 01:00:09,000 --> 01:00:13,000 Realment necessitem una manera de recordar no només el que una paraula està en Scramble 1104 01:00:13,000 --> 01:00:15,000 però si no és així, l'humà, ho he trobat 1105 01:00:15,000 --> 01:00:20,000 així que si vostè troba la paraula "the" No es pot escriure el, entrar, el, entrar, la, introduïu 1106 01:00:20,000 --> 01:00:23,000 i obtenir 3 punts, 3 punts, 3 punts, 3 punts. 1107 01:00:23,000 --> 01:00:26,000 Volem ser capaços de posar en llista negra la paraula mitjançant l'establiment d'un bool 1108 01:00:26,000 --> 01:00:29,000 en true si ja l'has trobat, i per això ens 1109 01:00:29,000 --> 01:00:31,000 encapsulada en aquesta estructura. 1110 01:00:31,000 --> 01:00:35,000 >> Ara, aquí a Scramble hi ha aquesta altra estructura anomenada diccionari. 1111 01:00:35,000 --> 01:00:39,000 En absència d'aquí és la paraula typedef perquè en aquest cas 1112 01:00:39,000 --> 01:00:43,000 necessitàvem per encapsular la idea d'un diccionari, 1113 01:00:43,000 --> 01:00:46,000 i un diccionari conté un munt de paraules, 1114 01:00:46,000 --> 01:00:49,000 com es dedueix d'aquesta matriu, i quantes d'aquestes paraules hi ha? 1115 01:00:49,000 --> 01:00:51,000 Bé, sigui aquesta mida variable anomenada diu. 1116 01:00:51,000 --> 01:00:53,000 Però només tenim un diccionari. 1117 01:00:53,000 --> 01:00:55,000 No necessitem un tipus de dades anomenat diccionari. 1118 01:00:55,000 --> 01:00:58,000 Només tenim un d'ells, pel que resulta en C 1119 01:00:58,000 --> 01:01:03,000 que si no dius typedef, que acaba de dir struct, a continuació, dins de les claus 1120 01:01:03,000 --> 01:01:05,000 vostè posa les seves variables, a continuació, posar el nom. 1121 01:01:05,000 --> 01:01:09,000 Això es declara una variable anomenada diccionari 1122 01:01:09,000 --> 01:01:11,000 que són aquestes. 1123 01:01:11,000 --> 01:01:16,000 Per contra, aquestes línies estan creant una estructura de dades reutilitzable anomenat paraula 1124 01:01:16,000 --> 01:01:19,000 que es poden crear múltiples còpies d', igual que hem creat 1125 01:01:19,000 --> 01:01:22,000 diverses còpies dels estudiants. 1126 01:01:22,000 --> 01:01:24,000 >> Què significa aquest darrer terme ens permet fer? 1127 01:01:24,000 --> 01:01:30,000 Deixa tornar a, diguem, un exemple més simple de temps més senzills, 1128 01:01:30,000 --> 01:01:34,000 i em va deixar obrir, diguem, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 El problema en qüestió és en realitat pelar 1130 01:01:38,000 --> 01:01:41,000 la capa d'una cadena i començar a enlairar aquestes rodes d'entrenament 1131 01:01:41,000 --> 01:01:44,000 perquè resulta que una cadena tot aquest temps 1132 01:01:44,000 --> 01:01:47,000 és com vam prometre en la setmana 1 realment només un sobrenom, 1133 01:01:47,000 --> 01:01:51,000 un sinònim de la biblioteca CS50 per a alguna cosa que s'assembla una mica més críptic, 1134 01:01:51,000 --> 01:01:53,000 char *, i hem vist aquest estel abans. 1135 01:01:53,000 --> 01:01:55,000 Ho vam veure en el context dels arxius. 1136 01:01:55,000 --> 01:01:59,000 >> Ara veurem per què hem estat ocultant aquest detall des de fa algun temps. 1137 01:01:59,000 --> 01:02:02,000 Aquí hi ha un arxiu anomenat compare1.c, 1138 01:02:02,000 --> 01:02:07,000 i, pel que sembla, li demana a l'usuari 2 cadenes, s i t, 1139 01:02:07,000 --> 01:02:11,000 i després es tracta de comparar aquestes cadenes per a la igualtat en la línia 26, 1140 01:02:11,000 --> 01:02:14,000 i si són iguals es diu, "Vostè va escriure la mateixa cosa" 1141 01:02:14,000 --> 01:02:17,000 i si no som iguals diu: "Ha escrit coses diferents". 1142 01:02:17,000 --> 01:02:19,000 Deixin-me seguir endavant i executar aquest programa. 1143 01:02:19,000 --> 01:02:23,000 Deixa anar al meu directori d'origen, faci una compare1. Es compila bé. 1144 01:02:23,000 --> 01:02:25,000 Deixa córrer compare1. 1145 01:02:25,000 --> 01:02:27,000 Vaig a apropar, introduir. 1146 01:02:27,000 --> 01:02:29,000 Digui alguna cosa. HELLO. 1147 01:02:29,000 --> 01:02:32,000 Vaig a dir alguna cosa nova. HELLO. 1148 01:02:32,000 --> 01:02:34,000 Sens dubte no escrigui coses diferents. 1149 01:02:34,000 --> 01:02:37,000 >> Déjame intentar-ho de nou. BYE BYE. 1150 01:02:37,000 --> 01:02:40,000 Definitivament no és diferent, així que el que està passant aquí? 1151 01:02:40,000 --> 01:02:44,000 Bé, el que realment es comparen en la línia 26? 1152 01:02:44,000 --> 01:02:46,000 [Inaudible-alumne] 1153 01:02:46,000 --> 01:02:49,000 Sí, pel que resulta que una cadena, tipus de dades, és una mena de mentida piadosa. 1154 01:02:49,000 --> 01:02:53,000 Una cadena és un char *, però el que és un char *? 1155 01:02:53,000 --> 01:02:56,000 Un char *, com es diu, és un punter, 1156 01:02:56,000 --> 01:03:00,000 i un punter és una adreça efectiva, 1157 01:03:00,000 --> 01:03:05,000 suma una ubicació en la memòria, i, si per casualitat vostè ha escrit en una paraula com HOLA 1158 01:03:05,000 --> 01:03:08,000 Recordo les discussions anteriors de cadenes 1159 01:03:08,000 --> 01:03:16,000 això és com la paraula HOLA. 1160 01:03:16,000 --> 01:03:19,000 Recordeu que una paraula com HOLA es pot representar 1161 01:03:19,000 --> 01:03:22,000 com una sèrie de personatges com aquest 1162 01:03:22,000 --> 01:03:25,000 i després amb un caràcter especial a l'extrem anomenat el caràcter nul, 1163 01:03:25,000 --> 01:03:27,000 com la denota \. 1164 01:03:27,000 --> 01:03:29,000 Què és en realitat una cadena? 1165 01:03:29,000 --> 01:03:32,000 Observi que aquest és diversos fragments de memòria, 1166 01:03:32,000 --> 01:03:36,000 i de fet, al final d'ella només es coneix un cop vista a través de tota la cadena 1167 01:03:36,000 --> 01:03:38,000 buscant el caràcter nul especial. 1168 01:03:38,000 --> 01:03:41,000 Però si això és un tros de memòria de la memòria del meu ordinador, 1169 01:03:41,000 --> 01:03:44,000 direm arbitràriament que aquesta cadena només vam tenir sort, 1170 01:03:44,000 --> 01:03:47,000 i es va quedar col · locat al començament mateix de la RAM del meu ordinador. 1171 01:03:47,000 --> 01:03:54,000 Aquest byte és 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Quan dic alguna cosa com GetString i faig string s = GetString 1173 01:04:02,000 --> 01:04:04,000 el que realment es retorna? 1174 01:04:04,000 --> 01:04:08,000 Per aquestes últimes setmanes, el que realment està sent emmagatzemat en s 1175 01:04:08,000 --> 01:04:13,000 no és aquesta cadena per se, però en aquest cas és el que s'està emmagatzemat 1176 01:04:13,000 --> 01:04:18,000 el nombre 0, perquè el que en realitat fa GetString 1177 01:04:18,000 --> 01:04:20,000 és que no físicament tornar una cadena. 1178 01:04:20,000 --> 01:04:22,000 Això no té molt sentit conceptual. 1179 01:04:22,000 --> 01:04:24,000 El que fa de retorn és un nombre. 1180 01:04:24,000 --> 01:04:28,000 Aquest nombre és l'adreça de HOLA en la memòria, 1181 01:04:28,000 --> 01:04:32,000 i la cadena de s llavors, si pelar aquesta capa, la cadena no existeix realment. 1182 01:04:32,000 --> 01:04:35,000 No és més que una simplificació a la biblioteca CS50. 1183 01:04:35,000 --> 01:04:38,000 >> Això realment és una cosa que es diu char *. 1184 01:04:38,000 --> 01:04:41,000 Char té sentit perquè, què és una paraula, com HOLA? 1185 01:04:41,000 --> 01:04:44,000 Bé, és una sèrie de caràcters, una sèrie de caràcters. 1186 01:04:44,000 --> 01:04:47,000 Char * vol dir que la direcció d'un personatge, 1187 01:04:47,000 --> 01:04:50,000 així que, què significa per tornar una cadena? 1188 01:04:50,000 --> 01:04:53,000 Una manera agradable i senzilla de retornar una cadena 1189 01:04:53,000 --> 01:04:57,000 és més aviat que tractar d'esbrinar com torno a 5 o 6 bytes diferents 1190 01:04:57,000 --> 01:05:01,000 permetin-me tornar a la direcció de la qual byte? 1191 01:05:01,000 --> 01:05:03,000 La primera d'elles. 1192 01:05:03,000 --> 01:05:06,000 En altres paraules, et vaig a donar la direcció d'un personatge en la memòria. 1193 01:05:06,000 --> 01:05:10,000 Això és el que representa char *, la direcció d'un únic caràcter en la memòria. 1194 01:05:10,000 --> 01:05:12,000 Truqui a aquesta variable s. 1195 01:05:12,000 --> 01:05:15,000 Conservar en aquesta direcció particular s, el que em va dir és arbitràriament 0, 1196 01:05:15,000 --> 01:05:19,000 només per mantenir les coses simples, però en realitat és en general un nombre més gran. 1197 01:05:19,000 --> 01:05:21,000 >> Espera un minut. 1198 01:05:21,000 --> 01:05:23,000 Si només em dóna la direcció del primer caràcter, com puc saber quina és la direcció és 1199 01:05:23,000 --> 01:05:25,000 el segon caràcter, la tercera, la quarta i cinquena de la? 1200 01:05:25,000 --> 01:05:27,000 [Inaudible-alumne] 1201 01:05:27,000 --> 01:05:31,000 Només se sap on és el final de la cadena és per mitjà d'aquest truc molt útil, 1202 01:05:31,000 --> 01:05:35,000 així que quan vostè fa servir alguna cosa com printf, el que printf, literalment, pren com a argument, 1203 01:05:35,000 --> 01:05:39,000 Recordem que usem aquest marcador de posició% s, i després es passa a 1204 01:05:39,000 --> 01:05:41,000 la variable que s'emmagatzema una cadena. 1205 01:05:41,000 --> 01:05:47,000 El que en realitat passa és la direcció del primer caràcter de la cadena. 1206 01:05:47,000 --> 01:05:50,000 Printf continuació, utilitza un bucle for o un bucle while com rebi l'esmentada direcció, 1207 01:05:50,000 --> 01:05:53,000 per exemple, 0, així que vaig a fer això ara, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n", s); 1209 01:06:02,000 --> 01:06:07,000 Quan dic printf ("% s \ n", s), el que realment estic proporcionant amb printf 1210 01:06:07,000 --> 01:06:13,000 és la direcció del primer caràcter en si, que en aquest cas és arbitrari H. 1211 01:06:13,000 --> 01:06:16,000 >> Com printf saber què és exactament el que es mostrarà a la pantalla? 1212 01:06:16,000 --> 01:06:19,000 La persona que va implementar printf implementat un bucle while o bucle for 1213 01:06:19,000 --> 01:06:23,000 que diu que aquest personatge és igual al caràcter nul especial? 1214 01:06:23,000 --> 01:06:25,000 Si no, ho imprimeixi. Com va aquest? 1215 01:06:25,000 --> 01:06:28,000 Si no s'imprimeix, imprimir, imprimir, imprimir-la. 1216 01:06:28,000 --> 01:06:32,000 Oh, aquest és especial. La impressió s'atura i retorna a l'usuari. 1217 01:06:32,000 --> 01:06:35,000 I això és literalment tot el que ha estat succeint per sota de la campana, 1218 01:06:35,000 --> 01:06:38,000 i això és molt per pair el primer dia de classe, 1219 01:06:38,000 --> 01:06:43,000 però per ara és realment la clau de volta de tot enteniment 1220 01:06:43,000 --> 01:06:46,000 que ha estat succeint dins de la memòria del nostre ordinador, 1221 01:06:46,000 --> 01:06:49,000 i, finalment, anem a molestar aquest part amb una mica d'ajuda 1222 01:06:49,000 --> 01:06:51,000 d'un dels nostres amics de Stanford. 1223 01:06:51,000 --> 01:06:56,000 >> El professor Nick Parlant de Stanford ha fet aquesta seqüència meravellós vídeo 1224 01:06:56,000 --> 01:06:58,000 de tot tipus de llengües diferents que van introduir 1225 01:06:58,000 --> 01:07:00,000 aquest Claymation poc Binky caràcter. 1226 01:07:00,000 --> 01:07:03,000 La veu que vostè està a punt d'escoltar un avançament en només pocs segons Sneak 1227 01:07:03,000 --> 01:07:05,000 és el d'un professor de Stanford, i vostè està rebent 1228 01:07:05,000 --> 01:07:07,000 només 5 o 6 segons d'això ara mateix, 1229 01:07:07,000 --> 01:07:09,000 però aquesta és la nota en la que celebrarem avui 1230 01:07:09,000 --> 01:07:11,000 i començarà dimecres. 1231 01:07:11,000 --> 01:07:15,000 Et dono Fun punter amb Binky, la vista prèvia. 1232 01:07:15,000 --> 01:07:18,000 [♪ ♪ Music] [Professor Parlant] Hey, Binky. 1233 01:07:18,000 --> 01:07:21,000 Desperta. És temps per a la diversió punter. 1234 01:07:21,000 --> 01:07:24,000 [Binky] Què és això? Aprendre sobre els punters? 1235 01:07:24,000 --> 01:07:26,000 Oh, que bé! 1236 01:07:26,000 --> 01:07:29,000 >> Ens veiem el dimecres. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]