1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Setmana 2, continuació] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [Aquesta és CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Està bé. Això és CS50, i aquest és el cap de setmana 2. 5 00:00:10,990 --> 00:00:14,410 Si vostè espera a tenir gana voltant d'aquesta hora matí, 6 00:00:14,410 --> 00:00:18,620 Sabem que celebrarem com un petit grup de matí, dijous, 1:15 pm. 7 00:00:18,620 --> 00:00:21,360 Hi ha un URL aquí si voleu confirmar la seva assistència. 8 00:00:21,360 --> 00:00:26,740 L'espai és limitat, així que si us plau, perdoneu si el formulari s'omple en el moment d'omplir això. 9 00:00:26,740 --> 00:00:29,300 Una altra URL, però, que podria ser d'interès és la següent. 10 00:00:29,300 --> 00:00:32,369 En gairebé un mes, el curs es posarà a disposició 11 00:00:32,369 --> 00:00:36,890 tant més àmpliament a través de EDX, a través del qual la gent a l'Internet serà capaç de seguir endavant, 12 00:00:36,890 --> 00:00:39,380 participar en el curs molt activament, de fet. 13 00:00:39,380 --> 00:00:42,270 Es va a utilitzar l'aparell CS50 CS50 i Comenta 14 00:00:42,270 --> 00:00:45,490 i la majoria de les eines de programari diferents que ja han estat usant aquest semestre. 15 00:00:45,490 --> 00:00:48,710 I una de les iniciatives que ens agradaria prendre com un experiment d'aquest any 16 00:00:48,710 --> 00:00:51,930 és veure fins a quin punt podem traduir el contingut 17 00:00:51,930 --> 00:00:53,960 a altres llengües parlades i escrites. 18 00:00:53,960 --> 00:00:57,500 Així que si vostè podria tenir interès a participar en aquest projecte 19 00:00:57,500 --> 00:01:02,270 pel que oferirem transcripcions en anglès i subtítols per a les conferències del curs 20 00:01:02,270 --> 00:01:05,450 i els pantalons curts i seminaris i seccions i similars, 21 00:01:05,450 --> 00:01:08,200 si vostè parla amb fluïdesa i escriure amb fluïdesa un altre idioma, 22 00:01:08,200 --> 00:01:12,290 ens encantaria participar en aquest projecte mitjançant el qual es pren en un o més dels vídeos, 23 00:01:12,290 --> 00:01:15,200 traduir a un llenguatge que conec bastant bé. 24 00:01:15,200 --> 00:01:18,700 >> Perquè us feu una idea de la interfície, hi ha una interfície d'usuari basada en web 25 00:01:18,700 --> 00:01:22,090 que utilitzarem, que crearà essencialment una interfície d'usuari d'aquesta manera. 26 00:01:22,090 --> 00:01:24,290 Això m'estava ensenyant alguns Halloween fa, 27 00:01:24,290 --> 00:01:27,390 i en la part dreta hi ha en negre al costat d'aquestes marques de temps, 28 00:01:27,390 --> 00:01:31,210 podràs veure les diverses coses que van sortir de la meva boca aquest dia, 29 00:01:31,210 --> 00:01:34,850 i després per sota de la mateixa serà capaç de traduir a un altre idioma 30 00:01:34,850 --> 00:01:38,690 exactament el que la cartografia és el mitjà, en aquest cas, Anglès i, per exemple, l'espanyol. 31 00:01:38,690 --> 00:01:40,440 Així que en realitat és un molt fàcil d'utilitzar eina. 32 00:01:40,440 --> 00:01:43,370 Pot rebobinar i avançar ràpidament molt fàcilment amb el teclat. 33 00:01:43,370 --> 00:01:47,490 Així que si vol participar en aquest experiment i que les seves paraules vist i llegit 34 00:01:47,490 --> 00:01:51,850 per milers de potencials persones per aquí, si us plau, no dubti a participar. 35 00:01:51,850 --> 00:01:54,350 Una paraula sobre el gatet de dilluns. 36 00:01:54,350 --> 00:02:00,350 Perquè no ens han enviat un missatge massa por, s'adonen que, com indiquen les hores d'oficina 37 00:02:00,350 --> 00:02:03,300 i com suggereixen les seccions, el disseny del recorregut és molt 38 00:02:03,300 --> 00:02:07,360 perquè els estudiants col · laborant i parlant de treballar a través dels butlletins de problemes 39 00:02:07,360 --> 00:02:11,260 i els problemes junts, i realment la línia només es redueix a, 40 00:02:11,260 --> 00:02:16,010 una vegada més, el treball que en última instància ha de ser presentar el seu propi. 41 00:02:16,010 --> 00:02:18,860 I així, amb tota sinceritat, en horari d'oficina és totalment normal, 42 00:02:18,860 --> 00:02:22,240 està totalment d'esperar, fins i tot, a estar xatejant amb algun amic al teu costat. 43 00:02:22,240 --> 00:02:24,370 >> Si ell o ella està lluitant amb alguns temes i vostè és com, 44 00:02:24,370 --> 00:02:27,940 "Oh, bé, et vaig a donar una idea d'alguna línia de codi que vaig escriure," això està bé, 45 00:02:27,940 --> 00:02:31,250 que passa, i això és molt favorable, crec que, amb el procés d'aprenentatge. 46 00:02:31,250 --> 00:02:36,750 Quan la línia es creua quan el cap és una espècie d'inclinació cap aquí durant uns segons massa 47 00:02:36,750 --> 00:02:41,160 o minuts perquè realment haver estat només una oportunitat de desbloqueig per al seu amic, 48 00:02:41,160 --> 00:02:44,160 i, certament, quan les coses s'intercanvien a través de correu electrònic i Dropbox i similars, 49 00:02:44,160 --> 00:02:45,640 allà també és la línia. 50 00:02:45,640 --> 00:02:48,620 Així que per tots els mitjans se sentin còmodes i se senten animats a xerrar amb els amics 51 00:02:48,620 --> 00:02:52,810 i companys sobre conjunts de processadors i més i només s'adonen que el que en última instància, presentar 52 00:02:52,810 --> 00:02:57,340 realment ha de ser el producte de la seva creació i no una altra persona. 53 00:02:57,340 --> 00:03:00,490 I així un dels problemes específics de domini per pset2, 54 00:03:00,490 --> 00:03:04,740 que sortirà demà a la nit tarda, és submergir-se en el món de la criptografia, 55 00:03:04,740 --> 00:03:08,970 que és l'art de xifrar o codificar la informació, 56 00:03:08,970 --> 00:03:12,600 i això en última instància es relaciona amb el món de la seguretat. 57 00:03:12,600 --> 00:03:16,560 Ara, la seguretat per a la majoria de nosaltres es presenta en forma de mecanismes bastant mundanes. 58 00:03:16,560 --> 00:03:19,050 Tots nosaltres tenim noms d'usuari i contrasenyes, 59 00:03:19,050 --> 00:03:23,450 i tots tenim noms d'usuari i contrasenyes molt dolents, molt probablement. 60 00:03:23,450 --> 00:03:28,240 >> Si la contrasenya és la mateixa en diversos llocs web, que probablement no és la millor idea, 61 00:03:28,240 --> 00:03:30,070 com veurem cap al final del semestre. 62 00:03:30,070 --> 00:03:34,720 Si la contrasenya s'escriu en una nota adhesiva - no és broma - al monitor, 63 00:03:34,720 --> 00:03:38,350 que tampoc és necessàriament el millor disseny, sinó un fenomen bastant comú. 64 00:03:38,350 --> 00:03:42,470 I si vostè no està utilitzant la criptografia per xifrar les contrasenyes, 65 00:03:42,470 --> 00:03:44,210 són particularment vulnerables. 66 00:03:44,210 --> 00:03:47,270 Així que si vostè pensa que està sent súper intel · ligent per tenir un document de Word ocult 67 00:03:47,270 --> 00:03:49,910 en algun lloc del seu disc dur que té totes les seves contrasenyes 68 00:03:49,910 --> 00:03:53,670 però està en una carpeta que ningú mirarà, això també no és un mecanisme molt segur. 69 00:03:53,670 --> 00:03:56,990 I així ho pset2 presentaré és aquest art de la criptografia 70 00:03:56,990 --> 00:04:02,010 informació i lluitant perquè coses com contrasenyes són tant més segur. 71 00:04:02,010 --> 00:04:05,790 El context aquí és que amb les dades insegurs 72 00:04:05,790 --> 00:04:07,930 arriba una oportunitat per xifrar i per enfilar. 73 00:04:07,930 --> 00:04:11,470 I pel que aquest, per exemple, és un exemple d'un missatge xifrat. 74 00:04:11,470 --> 00:04:14,700 En realitat, això diu alguna cosa en anglès, però és evident que no és totalment obvi. 75 00:04:14,700 --> 00:04:18,279 I anem a arribar al punt de partida avui a esmicolar el que aquest missatge secret aquí és. 76 00:04:18,279 --> 00:04:23,490 Però en el món real de les computadores, les coses no semblen que fins i tot podrien ser frases en anglès. 77 00:04:23,490 --> 00:04:28,430 Per exemple, això és el que pots trobar en un estàndard de Linux o Mac o UNIX 78 00:04:28,430 --> 00:04:32,070 en un arxiu que va ser en un altre temps anomenat l'arxiu de contrasenyes. 79 00:04:32,070 --> 00:04:34,200 >> Avui dia s'han traslladat a altres llocs. 80 00:04:34,200 --> 00:04:39,210 Però si ens fixem en el lloc correcte en un sistema, podràs veure no només el seu nom d'usuari 81 00:04:39,210 --> 00:04:43,400 o la d'altres persones en el sistema, però vostè veurà una versió encriptada de la seva contrasenya. 82 00:04:43,400 --> 00:04:47,980 En efecte, la cripta hi ha paraula suggereix que les coses es xifra, 83 00:04:47,980 --> 00:04:52,680 i aquesta sèrie de lletres aparentment a l'atzar i caràcters i nombres, i així successivament 84 00:04:52,680 --> 00:04:56,480 només es pot desxifrar en general per conèixer algun secret - 85 00:04:56,480 --> 00:04:58,840 una paraula secreta, un número secret - 86 00:04:58,840 --> 00:05:03,160 I de fet, l'art de la criptografia en última instància es redueix a confiar d'algun tipus 87 00:05:03,160 --> 00:05:05,650 i saber alguna cosa que ningú més ho fa. 88 00:05:05,650 --> 00:05:10,090 Així que anem a explorar en detall una mica més avui i en el conjunt de processadors per venir. 89 00:05:10,090 --> 00:05:12,200 I ara una paraula sobrepassa / falla. 90 00:05:12,200 --> 00:05:15,360 Sobretot perquè alguns de vosaltres heu bussejat en pset1, l'aparell, 91 00:05:15,360 --> 00:05:19,080 i un món molt nou per a vostè, s'adonen que les frustracions i confusions 92 00:05:19,080 --> 00:05:21,700 i només dificultats tècniques són bastant d'esperar, 93 00:05:21,700 --> 00:05:24,180 especialment amb el conjunt de processadors en primer lloc, on hi ha tantes coses noves, 94 00:05:24,180 --> 00:05:27,730 només a familiaritzar-se amb ls i cd i tots aquests comandaments arcans 95 00:05:27,730 --> 00:05:33,050 i un nou ambient, i això és independent del material real i la programació en si. 96 00:05:33,050 --> 00:05:36,940 Així compte també que hi ha certament hores d'oficina que hi ha com una estructura de suport. 97 00:05:36,940 --> 00:05:38,880 >> Seccions començarà diumenge que ve. 98 00:05:38,880 --> 00:05:42,960 Però el més important, si et sents sol que aquest no és el món per a tu, 99 00:05:42,960 --> 00:05:44,710 adonar-se que en realitat es limita a prendre temps. 100 00:05:44,710 --> 00:05:48,600 I si no fos per aquesta oportunitat fa anys per a mi de prendre una classe de pas / falla, 101 00:05:48,600 --> 00:05:50,990 Honestament, mai m'hauria posat un peu a l'aula. 102 00:05:50,990 --> 00:05:53,690 I vostè pot canviar això per amunt fins, diguem, el cinquè dilluns del curs, 103 00:05:53,690 --> 00:05:58,280 així que si vostè està a la vora ara, adonar-se que en lloc de cap a algunes altres aigües del tot, 104 00:05:58,280 --> 00:06:01,260 Quin dubte considerar simplement canviar per passar / fallar. 105 00:06:01,260 --> 00:06:04,570 Un cop més, no hi ha realment aquesta cultura aquí a Harvard de prendre les coses d'passa / falla 106 00:06:04,570 --> 00:06:08,670 ja que tothom vol aconseguir o superar, 107 00:06:08,670 --> 00:06:11,130 però, francament, això és una meravellosa manera de provar alguna cosa 108 00:06:11,130 --> 00:06:16,720 que pot no ser familiar per a vostè, i vostè va a acabar fent, en la majoria dels casos, bastant bé, 109 00:06:16,720 --> 00:06:18,210 potser molt a la seva sorpresa. 110 00:06:18,210 --> 00:06:20,980 I en termes més concrets, el que crec que passa / no passa generalment ho fa, 111 00:06:20,980 --> 00:06:22,940 especialment en el que podria haver experimentat amb pset0, 112 00:06:22,940 --> 00:06:26,560 si es posa en 10 hores, 15 hores, 25 hores en algun conjunt de processadors 113 00:06:26,560 --> 00:06:29,920 i estàs colpejant el seu cap contra la paret i s'està posant súper altes hores de la nit 114 00:06:29,920 --> 00:06:33,950 però que ha pres el conjunt de processadors 90% del camí i simplement no puc entendre una cosa, 115 00:06:33,950 --> 00:06:36,520 passa / no passa realment pren la vora d'una classe com aquesta, 116 00:06:36,520 --> 00:06:39,100 on es pot ordenar feliçment de dir: "Bé, jo sé que no és perfecte, 117 00:06:39,100 --> 00:06:42,350 però vaig treballar el cul en això, estic bastant content amb el lloc on va acabar " 118 00:06:42,350 --> 00:06:44,850 i que compleixi amb les expectatives de passa / no passa. 119 00:06:44,850 --> 00:06:47,540 Així que tingues-ho en compte. Està bé. 120 00:06:47,540 --> 00:06:50,520 >> Així que aquells de vostès que han tingut dificultats per utilitzar la Universitat de Harvard Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 Sabem que hi ha un SSID CS50, una connexió Wi-Fi, surant 122 00:06:54,780 --> 00:06:56,490 que podria tenir millor sort per. 123 00:06:56,490 --> 00:07:00,130 És una mica irònic que la contrasenya per això, si vol provar la connexió a aquest 124 00:07:00,130 --> 00:07:08,350 per obtenir millors velocitats - i faci'ns saber si no és millor - és 12345, tot el camí fins al 8 125 00:07:08,350 --> 00:07:10,910 8 perquè és més segur que 5. 126 00:07:10,910 --> 00:07:16,910 Així que si vostè necessita la contrasenya de Wi-Fi, Wi-CS50 aquí, 12345678, 127 00:07:16,910 --> 00:07:20,380 i incloure en CS50 Parli si vostè encara té problemes de connectivitat intermitent, 128 00:07:20,380 --> 00:07:25,420 i deixarem que els poders que es coneixen per aquest espai. Està bé. 129 00:07:25,420 --> 00:07:32,230 Així que un reclam ràpid, especialment per a aquells de vostès que són nois o noies fans de totes les coses d'Apple. 130 00:07:32,230 --> 00:07:37,460 El que desenterrat de fa uns anys era aquest arxiu aquí, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 només per a tipus de concret més i més complexos 132 00:07:39,930 --> 00:07:42,560 alguns dels programes en C més bàsiques que hem estat escrivint. 133 00:07:42,560 --> 00:07:46,910 Així que vaig obrir aquest arxiu, iUnlock.c. Està disponible a la pàgina de Lectures per avui. 134 00:07:46,910 --> 00:07:49,810 Al costat esquerre es veu una llarga llista de funcions. 135 00:07:49,810 --> 00:07:53,230 Així que el tipus que va escriure això va escriure una gran quantitat de funcions, més que principal. 136 00:07:53,230 --> 00:07:57,340 Ell va utilitzar una gran quantitat de biblioteques aquí, i, si comencem a desplaçar-se a través de 137 00:07:57,340 --> 00:08:04,890 el que això és, és la primera, crec, crac per l'iPhone original. 138 00:08:04,890 --> 00:08:09,830 >> Quan es volia fer jailbreak a l'iPhone original, el que significa que desnuar d'AT & T 139 00:08:09,830 --> 00:08:13,710 i en realitat instal · lar programari especial en ell i fer coses que Apple no volia que la gent ho fa, 140 00:08:13,710 --> 00:08:18,480 algú es va prendre el temps per esbrinar exactament com podrien explotar fallades de programari, 141 00:08:18,480 --> 00:08:22,690 errors, errors en el programari d'Apple, i així va néixer iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 que si es compila en l'equip i el va instal · lar en un iPhone 143 00:08:26,760 --> 00:08:29,430 que estava connectat al seu ordinador a través de, per exemple, un cable USB, 144 00:08:29,430 --> 00:08:32,450 això li donaria privilegis d'administrador o root al teu iPhone 145 00:08:32,450 --> 00:08:34,620 i li permeten fer gairebé tot el que vulguis. 146 00:08:34,620 --> 00:08:36,400 I així ha estat aquest fascinant gat i la rata 147 00:08:36,400 --> 00:08:39,340 entre Apple i la resta del món, en particular pel que, igual que moltes empreses, 148 00:08:39,340 --> 00:08:43,350 tractar de bloquejar les seves coses avall de manera que només es pot fer amb ella el que tenia planejat. 149 00:08:43,350 --> 00:08:47,360 Però gràcies a gent com aquesta i la comprensió de detalls de baix nivell - 150 00:08:47,360 --> 00:08:50,830 i en aquest cas la programació C - i moltes de les construccions conegudes 151 00:08:50,830 --> 00:08:55,280 que hem començat a jugar, vostè pot realment aprofitar el maquinari 152 00:08:55,280 --> 00:08:59,250 d'una manera millor li sembli i no necessàriament una entitat corporativa. 153 00:08:59,250 --> 00:09:01,600 Així, per exemple, no tinc ni idea del que tot això està fent, 154 00:09:01,600 --> 00:09:03,580 GetVersion però sona bastant senzill, 155 00:09:03,580 --> 00:09:05,710 i sembla que aquesta és una funció que aquesta persona va escriure. 156 00:09:05,710 --> 00:09:09,250 Es necessita algun tipus de nombre enter com a argument, no torna res, 157 00:09:09,250 --> 00:09:13,710 però sembla bucle amb un bucle aquí i si una condició, si la interrupció condició, 158 00:09:13,710 --> 00:09:16,770 i d'alguna manera es relaciona amb els números de versió si es desplaça cap avall, 159 00:09:16,770 --> 00:09:19,650 tot i que moltes d'aquestes paraules clau seran nous. 160 00:09:19,650 --> 00:09:22,590 I hi ha un munt de funcions a aquí mai hem vist i que no vegi mai 161 00:09:22,590 --> 00:09:24,350 en el transcurs del semestre. 162 00:09:24,350 --> 00:09:29,160 >> Al final del dia, segueix les mateixes regles i la lògica que hem estat jugant amb fins ara. 163 00:09:29,160 --> 00:09:34,340 Així que això és massa vell per trencar les seves 3s iPhone o dies aquests 4s 5s o aviat, 164 00:09:34,340 --> 00:09:38,830 però sàpiguen que tot està molt deriva d'aquest món que hem bussejat a. 165 00:09:38,830 --> 00:09:42,280 Fem una ullada a un petit exemple més simple: 166 00:09:42,280 --> 00:09:46,260 aquest, només per escalfar amb una mica de sintaxi i també un altre tipus de dades 167 00:09:46,260 --> 00:09:48,910 que ja hem parlat, però no han vist realment en C. 168 00:09:48,910 --> 00:09:53,670 Es tracta d'un arxiu anomenat positive1.c, i, pels comentaris a la part superior 169 00:09:53,670 --> 00:09:56,070 això només requereix que l'usuari proporcioni un nombre positiu. 170 00:09:56,070 --> 00:09:59,910 Així que és un exemple d'un bucle do-while, que és agradable per als programes d'usuari interactives 171 00:09:59,910 --> 00:10:02,070 on ha de dir-li a l'usuari que faci alguna cosa, 172 00:10:02,070 --> 00:10:05,530 i si ells no cooperen els crides o rebutjar la seva entrada. 173 00:10:05,530 --> 00:10:10,480 Un exemple: jo faré línies 19 a la 24 174 00:10:10,480 --> 00:10:14,620 sempre i quan l'usuari no se m'ha donat un nombre positiu. 175 00:10:14,620 --> 00:10:21,340 Aquest detall aquí a la línia 18, per què jo declare n per sobre d'aquest bucle sencer construir 176 00:10:21,340 --> 00:10:26,870 en contraposició a la dreta al costat de la línia 22 en què realment importa per obtenir n? Si. 177 00:10:26,870 --> 00:10:29,330 [Estudiant] Scope. >> Si, pel que aquest problema d'abast. 178 00:10:29,330 --> 00:10:31,770 I, en termes senzills, quin abast es refereix? 179 00:10:34,880 --> 00:10:41,560 Si. >> [Resposta dels estudiants inaudible] >> Pots parlar una mica més alt? 180 00:10:41,560 --> 00:10:45,440 [Estudiant] On es pot accedir a aquesta variable. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 On es pot accedir a una variable en particular. 182 00:10:47,610 --> 00:10:50,990 I, en general, la regla general fins ara ha estat que l'abast d'una variable 183 00:10:50,990 --> 00:10:56,140 es defineix per les claus més recents que he vist. 184 00:10:56,140 --> 00:11:03,070 >> I així, en aquest cas, si he comès l'error de declarar n en la línia 22, la línia havia de funcionar. 185 00:11:03,070 --> 00:11:10,840 M'agradaria aconseguir un int, de manera que el posa en aquesta variable n en la línia 22, 186 00:11:10,840 --> 00:11:17,060 però quina línia de codi ara no tindria ni idea del que estic parlant? >> [Estudiant] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, i resulta que 24 així perquè en aquest cas cau fora de les claus. 188 00:11:23,840 --> 00:11:28,550 Així que una mica d'una molèstia, però molt fàcil de resoldre amb només declarar la variable 189 00:11:28,550 --> 00:11:30,700 fora de la pròpia funció. 190 00:11:30,700 --> 00:11:32,760 Ja veurem el dia d'avui es pot anar un pas més enllà 191 00:11:32,760 --> 00:11:34,940 i que fins i tot pot resultar una mica mandrós. 192 00:11:34,940 --> 00:11:39,660 I que no es recomana en general, sinó que fins i tot podria tornar mandrós 193 00:11:39,660 --> 00:11:44,150 i posar una variable a nivell mundial, per així dir, no dins d'una funció, no dins d'un bucle, 194 00:11:44,150 --> 00:11:49,800 sinó en el propi arxiu, fora de totes les funcions que vostè ha escrit, com ho vaig fer aquí a la línia 15. 195 00:11:49,800 --> 00:11:55,220 Això és generalment mal vist, però s'adonen que és una solució de vegades a altres problemes, 196 00:11:55,220 --> 00:11:56,910 ja que amb el temps veurem. 197 00:11:56,910 --> 00:11:59,500 Així que per ara anem a deixar-ho així, però anem a veure si podem reescriure aquesta 198 00:11:59,500 --> 00:12:02,360 només per començar a expressar-nos de manera diferent. 199 00:12:02,360 --> 00:12:05,550 Aquest programa, només perquè quedi clar, és positive1. 200 00:12:05,550 --> 00:12:11,980 Deixa anar per davant aquí i al meu finestra de terminal fer positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Compila bé. Vaig a córrer positive1, premeu Enter. 202 00:12:15,080 --> 00:12:19,250 Exigeixo que em donis un enter positiu. Diré -1. Això no va funcionar. 203 00:12:19,250 --> 00:12:22,340 0, 99. Això sembla que funciona. 204 00:12:22,340 --> 00:12:25,310 Potser no és la prova més rigorosa, però almenys és una comprovació de validesa agradable 205 00:12:25,310 --> 00:12:27,100 que estem en el camí correcte. 206 00:12:27,100 --> 00:12:29,570 >> Així que ara seguirem endavant i obrir la versió 2 d'aquesta, 207 00:12:29,570 --> 00:12:32,800 i el que és diferent ja? 208 00:12:32,800 --> 00:12:39,030 Posa en pràctica la mateixa cosa, però el que està saltant com clarament diferent aquesta vegada? 209 00:12:40,790 --> 00:12:47,090 Aquesta bool en verd. Es destaca en verd, aquesta paraula clau es coneix com bool, que és un tipus de dades. 210 00:12:47,090 --> 00:12:50,510 No ve integrat en totes les versions de C. 211 00:12:50,510 --> 00:12:52,650 Has d'incloure una biblioteca específica. 212 00:12:52,650 --> 00:12:56,460 En el nostre cas, vaig incloure la biblioteca CS50 perquè tinguem accés a bool. 213 00:12:56,460 --> 00:12:59,860 No obstant això, en la línia 18, sembla que tenim un valor booleà anomenat aquí agraïts. 214 00:12:59,860 --> 00:13:02,190 Podria haver cridat a aquesta res, però em va cridar agraït 215 00:13:02,190 --> 00:13:04,750 només per transmetre algun tipus de significat semàntic. 216 00:13:04,750 --> 00:13:07,700 Així que al principi de la línia 18, estic agraït pel que sembla no 217 00:13:07,700 --> 00:13:12,230 perquè el valor agraït Boolean s'inicialitza a false a la línia 18. 218 00:13:12,230 --> 00:13:16,500 I llavors sembla que el que he fet aquí, a les línies 21-23 219 00:13:16,500 --> 00:13:19,200 s'ha acabat tipus de reescriure la meva lògica. 220 00:13:19,200 --> 00:13:26,100 Així que no funcionalment diferents, però en la línia 22 ara comprovo si el int l'usuari ha proporcionat 221 00:13:26,100 --> 00:13:31,360 és més gran que 0, llavors simplement canviar el valor d'agrair a true. 222 00:13:31,360 --> 00:13:35,590 I per què ho faig? Com que en la línia 25, pel que sembla vaig a comprovar una condició. 223 00:13:35,590 --> 00:13:39,760 És aquest bucle while agraït és fals. 224 00:13:39,760 --> 00:13:42,960 Així que em va proposar això com una alternativa a la versió 1 225 00:13:42,960 --> 00:13:47,050 perquè és almenys una mica més intuïtiu potser, és una mica més de terra en Anglès. 226 00:13:47,050 --> 00:13:51,980 Així que faci el següent mentre no estàs agraït o agraïda mentre que és fals. 227 00:13:51,980 --> 00:13:56,220 I aquesta vegada jo també, aparentment, no m'importa recordar el que l'usuari va escriure en 228 00:13:56,220 --> 00:14:00,050 perquè no hi ha cap avís de n variable, el que en realitat, una petita mentida piadosa allà. 229 00:14:00,050 --> 00:14:03,290 >> Funcionalment, el programa és una mica diferent una vegada que arribem al fons de la qüestió 230 00:14:03,290 --> 00:14:04,960 perquè no vaig a recordar el que n és. 231 00:14:04,960 --> 00:14:09,120 Però jo volia demostrar que també en aquest cas tot i que hem vist getInt 232 00:14:09,120 --> 00:14:13,780 i GetString s'utilitza en el costat dret d'un signe igual fins ara 233 00:14:13,780 --> 00:14:17,310 perquè recordem el valor, tècnicament, no és estrictament necessari. 234 00:14:17,310 --> 00:14:20,290 Si per qualsevol raó vostè no els importa per guardar el valor, 235 00:14:20,290 --> 00:14:25,540 el que desitja és comprovar el valor, observi que simplement podem escriure això com getInt, 236 00:14:25,540 --> 00:14:27,320 obert parin, parin prop. 237 00:14:27,320 --> 00:14:30,570 Aquesta funció tornarà un valor, com ho hem estat dient. 238 00:14:30,570 --> 00:14:32,220 Se't va a tornar un int. 239 00:14:32,220 --> 00:14:34,460 I així, si mentalment pensar que això passi, 240 00:14:34,460 --> 00:14:38,190 quan escric en 99, getInt torna el número 99, 241 00:14:38,190 --> 00:14:41,840 i per tant conceptualment, és com si el meu codi eren en realitat això. 242 00:14:41,840 --> 00:14:45,950 Així que si 99 és en realitat major que 0, llavors es converteix en veritat agraït, 243 00:14:45,950 --> 00:14:50,810 després la línia 25 es dóna compte ooh, hem acabat perquè ara estic agraït, 244 00:14:50,810 --> 00:14:53,970 i en la línia 26, que simplement dir: "Gràcies pel enter positiu!" 245 00:14:53,970 --> 00:14:55,960 el que va resultar ser. 246 00:14:55,960 --> 00:14:59,140 Ara farem el sucre sintàctic lleu aquí, per dir-ho. 247 00:14:59,140 --> 00:15:04,670 A veure si podem netejar aquesta línia 25 amb aquesta variant de la tercera i última en positive3. 248 00:15:04,670 --> 00:15:13,600 >> Tingueu en compte que l'única diferència ara és quina línia de codi? >> [Estudiant] 25. >> [Malan] Sí, 25. 249 00:15:13,600 --> 00:15:17,680 I no hem vist realment aquest truc encara, però ens van fer veure el signe d'exclamació en dilluns, 250 00:15:17,680 --> 00:15:21,070 que denota què? >> [Els estudiants] no. No >> o negació. 251 00:15:21,070 --> 00:15:23,510 Així que pren un valor booleà i voltejar el seu valor. 252 00:15:23,510 --> 00:15:25,810 Cert converteix en fals, fals es fa realitat. 253 00:15:25,810 --> 00:15:30,420 Així que això, proposo, és encara una mica més intuïtiva manera d'escriure el codi 254 00:15:30,420 --> 00:15:33,430 perquè encara agraït inicialitzar en false, el segueixo fent el següent, 255 00:15:33,430 --> 00:15:36,010 Vaig posar agraït a true quan arribi el moment, 256 00:15:36,010 --> 00:15:40,880 però ara vostè pot realment només traduir el codi verbal esquerra a dreta, 257 00:15:40,880 --> 00:15:45,630 mentre que (gracias!), ja que el punt explosió o exclamació denota la noció de no 258 00:15:45,630 --> 00:15:47,580 així que mentre no agraït. 259 00:15:47,580 --> 00:15:49,900 Així que de nou, no hem introduït nous conceptes en si. 260 00:15:49,900 --> 00:15:53,730 Parlem de booleans enrere quan juguem amb Scratch, 261 00:15:53,730 --> 00:15:56,720 però s'adonen ara podem començar a escriure el nostre codi de moltes maneres diferents. 262 00:15:56,720 --> 00:16:01,060 Per tant, i en pset1 si vostè és una espècie de lluita per descobrir la manera d'escriure algun programa, 263 00:16:01,060 --> 00:16:04,340 més probable és que estàs de sort perquè no hi pot haver qualsevol nombre de solucions 264 00:16:04,340 --> 00:16:06,110 que li pot succeir a. 265 00:16:06,110 --> 00:16:10,500 Per exemple, això és només 3 de fins i tot el més simple dels programes. Està bé. 266 00:16:10,500 --> 00:16:14,200 I ara recordo el dilluns ens vam anar en aquesta nota amb valors de retorn. 267 00:16:14,200 --> 00:16:18,450 Així que per a la primera vegada que escrivim un programa que no només té principal; 268 00:16:18,450 --> 00:16:22,550 també té la seva pròpia funció personalitzada que vaig escriure aquí. 269 00:16:22,550 --> 00:16:26,810 Així, en la línia 31 a la 34 He implementat una funció de cub. 270 00:16:26,810 --> 00:16:30,240 No és complex. És només a * a * a en aquest cas. 271 00:16:30,240 --> 00:16:34,750 Però l'important d'això és que estic prenent d'entrada en forma d'un 272 00:16:34,750 --> 00:16:39,180 i m'estic tornant sortida en forma de * a * a. 273 00:16:39,180 --> 00:16:43,560 Així que ara tinc la capacitat, tant com solia fer-ho amb prinf sol, 274 00:16:43,560 --> 00:16:47,240 anomenar aquesta funció cridant a la funció de cub. 275 00:16:47,240 --> 00:16:51,970 >> I la funció de cub té alguna informació, i la funció retorna un cub de sortida. 276 00:16:51,970 --> 00:16:56,960 Per contra, printf acabo de fer alguna cosa. 277 00:16:56,960 --> 00:17:00,840 No va tornar tot el que ens importava, tot i que en un a part que retorna cap valor; 278 00:17:00,840 --> 00:17:03,110 que acaba generalment ho ignoren. 279 00:17:03,110 --> 00:17:06,510 Printf acabo de fer alguna cosa. Tenia un efecte secundari de la impressió a la pantalla. 280 00:17:06,510 --> 00:17:11,770 En canvi aquí, tenim la funció de cub, que en realitat torna alguna cosa. 281 00:17:11,770 --> 00:17:15,520 Així que per a aquells que estan familiaritzats amb això, és una idea bastant senzilla. 282 00:17:15,520 --> 00:17:19,640 Però per a aquells menys familiaritzats amb la idea de passar a les entrades i sortides de tornar, 283 00:17:19,640 --> 00:17:21,950 tractarem només una cosa simple super. 284 00:17:21,950 --> 00:17:25,490 Hi ha algú que ve còmode a l'escenari breument? 285 00:17:25,490 --> 00:17:28,040 Vostè ha d'estar còmode amb una càmera a vostè també. Sí? Bé. 286 00:17:28,040 --> 00:17:31,240 ¿Et dius? >> [Estudiant] Ken. >> Ken. Està bé. Ken, anem a dalt. 287 00:17:31,240 --> 00:17:35,050 Ken serà una funció del tipus aquí. 288 00:17:35,050 --> 00:17:38,720 Seguirem endavant i fer això. Anem una mica sofisticat. 289 00:17:38,720 --> 00:17:42,260 Gust a conèixer-lo. Benvingut al centre de l'escenari. Està bé. 290 00:17:42,260 --> 00:17:46,640 Anem a colpejar el botó aquí. Està bé. 291 00:17:46,640 --> 00:17:49,820 Així que aquí tens una pissarra moderna, 292 00:17:49,820 --> 00:17:53,470 i el que jo sóc és la funció principal, per exemple, 293 00:17:53,470 --> 00:17:56,460 i no tinc un iPad a la mà. 294 00:17:56,460 --> 00:17:59,710 >> Jo no me'n recordo com - Bé, no puc dir que. 295 00:17:59,710 --> 00:18:02,480 Jo realment no tinc bona lletra, 296 00:18:02,480 --> 00:18:05,520 i per tant, vull d'imprimir alguna cosa a la pantalla per a mi. 297 00:18:05,520 --> 00:18:12,040 Estic sent el programa principal, i jo hauré de dir això 298 00:18:12,040 --> 00:18:16,720 escrivint en el meu gargots i després passar que una entrada. 299 00:18:16,720 --> 00:18:20,400 Tan ximple encara que aquest exercici és, la noció de funcions i cridar a una funció 300 00:18:20,400 --> 00:18:22,400 i retorna una funció realment es redueix a això. 301 00:18:22,400 --> 00:18:26,260 Estic principal, que acabo d'escriure printf, entre cometes alguna cosa a la pantalla, 302 00:18:26,260 --> 00:18:29,110 Estic executant aquest programa, i tan bon punt es diu printf, 303 00:18:29,110 --> 00:18:32,880 Pren un argument o un paràmetre de vegades entre cometes dobles. 304 00:18:32,880 --> 00:18:35,880 Aquí està l'argument. Ho estic passant a Ken. 305 00:18:35,880 --> 00:18:39,020 Ell és un quadre negre escrit un nombre d'anys 306 00:18:39,020 --> 00:18:41,510 que pel que sembla només sap imprimir coses a la pantalla. 307 00:18:41,510 --> 00:18:43,150 Així que executar. 308 00:18:49,280 --> 00:18:51,280 Això no és dolent. Molt bo. 309 00:18:51,280 --> 00:18:55,510 Així que ara es porta a terme l'execució de Ken. Ha de donar-me res a canvi? 310 00:18:55,510 --> 00:18:57,470 No és que hem vist fins ara. 311 00:18:57,470 --> 00:19:00,460 Un cop més, és en realitat printf torna un nombre, però anem a ignorar que per ara 312 00:19:00,460 --> 00:19:03,470 perquè mai he utilitzat. Així que això és tot per Ken. 313 00:19:03,470 --> 00:19:08,580 I ara principal pren el control de nou el programa 314 00:19:08,580 --> 00:19:11,060 perquè aquesta línia de codi, printf, es porta a terme l'execució. 315 00:19:11,060 --> 00:19:14,050 I ens ocupem del nostre camí, l'execució de qualsevol altres línies hi són. 316 00:19:14,050 --> 00:19:17,320 Així que ara anem a provar un exemple una mica diferent. 317 00:19:17,320 --> 00:19:24,940 Aquesta vegada aquí primer anem a esborrar la pantalla, i aquesta vegada anem a fer la funció de mesurament de volum, 318 00:19:24,940 --> 00:19:27,080 però aquesta vegada, espero que un valor de sortida. 319 00:19:27,080 --> 00:19:29,180 >> Així que seguirem endavant i fer-ho. 320 00:19:29,180 --> 00:19:35,790 Ara tinc una línia de codi que diu que x es cúbica de x. 321 00:19:41,370 --> 00:19:46,370 La línia de codi, el record, es veu així: x = cub (x); 322 00:19:46,370 --> 00:19:50,930 Llavors, com es va a treballar? Seguirem endavant i donar-li una pantalla en blanc de nou. 323 00:19:50,930 --> 00:19:54,070 Vaig a escriure ara el valor de x, 324 00:19:54,070 --> 00:20:01,400 que en aquest moment passa a ser, diguem, 2 per mantenir les coses simples. 325 00:20:01,400 --> 00:20:06,150 He escrit en un tros de paper el valor de 2, la qual cosa és el meu valor x. 326 00:20:06,150 --> 00:20:10,920 L'hi dono a Ken. >> I acabo d'escriure la resposta? >> Sí, anem a escriure la resposta. 327 00:20:12,760 --> 00:20:18,940 Bé. I ara m'ha de retornar alguna cosa. Perfecte. Niça segue. 328 00:20:18,940 --> 00:20:23,120 Així que ara em passa de nou el valor de 8 en aquest cas, i què he de fer amb ell? 329 00:20:23,120 --> 00:20:28,250 En realitat - veurem, obtenir aquest dret. Què faré amb ell? 330 00:20:28,250 --> 00:20:33,440 Ara em vaig a prendre aquest valor i emmagatzemar-lo en realitat en aquests mateixos bits en la memòria. 331 00:20:33,440 --> 00:20:35,170 Però noti que sóc una mena de lluita aquí. 332 00:20:35,170 --> 00:20:38,210 Estic una mica confós perquè on puc realment escriure el valor de x, 333 00:20:38,210 --> 00:20:43,150 perquè el que acabes de fer és físicament Ken mà un tros de paper que tenia el valor 2, 334 00:20:43,150 --> 00:20:46,590 que era x, i, de fet, això és precisament el que va succeir. 335 00:20:46,590 --> 00:20:50,210 Així que resulta que quan es crida a la funció i se li passa un argument 336 00:20:50,210 --> 00:20:53,290 com hola, món, ni se li passa un argument com el 2, 337 00:20:53,290 --> 00:20:57,110 en general, està passant una còpia d'aquest argument. 338 00:20:57,110 --> 00:21:00,730 I així com jo vaig anotar el número 2 aquí i l'hi va donar a Ken, 339 00:21:00,730 --> 00:21:04,720 això vol dir que encara tinc una còpia del valor 2 en algun lloc 340 00:21:04,720 --> 00:21:08,890 perquè de fet, ara que ho he aconseguit tornar el valor 8, he de tornar a la memòria RAM 341 00:21:08,890 --> 00:21:12,130 i en realitat anotar 8, on una vegada vaig tenir el número 2. 342 00:21:12,130 --> 00:21:16,950 Així visualment, recorda aquesta idea de passar a, literalment, una còpia del valor. 343 00:21:16,950 --> 00:21:20,780 >> Ken fa les seves coses, em fa una mica de volta - en aquest cas un valor com 8 - 344 00:21:20,780 --> 00:21:24,980 i després he de fer alguna cosa amb aquest valor si vull mantenir aquí. 345 00:21:24,980 --> 00:21:29,650 Així que tot això tornarà a ser massa familiar en poc temps. 346 00:21:29,650 --> 00:21:34,920 Moltes gràcies per aquesta demostració aquí, Ken. [Aplaudiment] 347 00:21:34,920 --> 00:21:36,920 Molt ben fet. 348 00:21:36,920 --> 00:21:42,690 Anem a veure com això es relaciona en última instància, a part de la funció de trucada que hem estat fent aquí. 349 00:21:42,690 --> 00:21:47,910 Deixa anar per davant i ens porti de nou a l'exemple cubicació aquí. 350 00:21:47,910 --> 00:21:53,300 Tingueu en compte que si volem realment començar a prendre aquest més futur, 351 00:21:53,300 --> 00:21:57,570 haurem de tenir en compte el fet que el nombre x que està sent passat per aquí 352 00:21:57,570 --> 00:22:01,530 és diferent del que realment està passant en la funció. 353 00:22:01,530 --> 00:22:05,880 Així que de nou, aquest pas per còpia serà molt afí en un moment. 354 00:22:05,880 --> 00:22:09,580 Anem a fer una ullada a alguna cosa que no acaba de funcionar bé encara. 355 00:22:09,580 --> 00:22:13,250 Vaig a seguir endavant i obrir un exemple calessa tercera, que està viciat per la naturalesa, 356 00:22:13,250 --> 00:22:18,550 i es diu buggy3 i implementa una funció d'intercanvi. 357 00:22:18,550 --> 00:22:25,110 Aquí tenim una funció principal que ha x i i arbitràriament inicialitza a 1 i 2, respectivament. 358 00:22:25,110 --> 00:22:27,700 Podríem utilitzar getInt, però només necessitem un exercici simple, 359 00:22:27,700 --> 00:22:30,170 pel que és codificada com 1 i 2. 360 00:22:30,170 --> 00:22:35,340 En les línies 21 i 22, que pel que sembla imprimir x i i, una per línia. 361 00:22:35,340 --> 00:22:39,720 A continuació, a la línia 23, sostinc que estic canviant aquests valors, punt, punt, punt. 362 00:22:39,720 --> 00:22:44,170 Em aparentment cridar a una funció en la línia 24 d'intercanvi trucada que dura 2 arguments. 363 00:22:44,170 --> 00:22:48,300 Està totalment de fiar per les funcions que prendre 2 arguments. Hem vist printf fer-ho ja. 364 00:22:48,300 --> 00:22:51,830 >> Així intercanvi aparentment presa x i i, i com suggereix el seu nom, 365 00:22:51,830 --> 00:22:54,670 Espero que això canviarà aquests 2 valors. 366 00:22:54,670 --> 00:23:00,090 Així que em diuen en la línia 25 "canviar!" i reimprimir x i i 367 00:23:00,090 --> 00:23:03,070 sota el supòsit que han estat efectivament intercanviats. 368 00:23:03,070 --> 00:23:06,080 Però si realment executar aquest programa - que em obri una finestra de terminal, 369 00:23:06,080 --> 00:23:09,860 vull deixar buggy3 - com el seu nom ho indica, això no acabarà bé 370 00:23:09,860 --> 00:23:15,770 perquè quan premeu la tecla Enter, cal notar que x és 1, i és 2, 371 00:23:15,770 --> 00:23:19,420 i no obstant això, al final del programa, encara són, de fet, el mateix. 372 00:23:19,420 --> 00:23:22,960 Així que basat en la demostració acaba amb Ken, el que realment està passant? 373 00:23:22,960 --> 00:23:28,710 Entrem en aquesta funció swap. És súper curt. No és més que unes poques línies de codi de temps. 374 00:23:28,710 --> 00:23:34,520 Però quin és el problema fonamental que s'ha de basar en la simple història diu aquí amb Ken? 375 00:23:34,520 --> 00:23:36,670 Per què el canvi d'trenca? 376 00:23:36,670 --> 00:23:39,660 [Estudiant] Vostè està emmagatzemant una còpia, no la variable. 377 00:23:39,660 --> 00:23:43,980 Exactament. Estem a guardar una còpia, no la variable en si. 378 00:23:43,980 --> 00:23:47,170 En altres paraules, d'intercanvi aparentment té 2 arguments, un int, 379 00:23:47,170 --> 00:23:49,370 i és anomenat arbitràriament a i b, 380 00:23:49,370 --> 00:23:54,420 i aquí he passat a x i i, que són, respectivament, 1 i 2, 381 00:23:54,420 --> 00:23:58,770 però no estic literalment passant x, no estic literalment passant i, 382 00:23:58,770 --> 00:24:01,450 Estic passant una còpia de x i una còpia de i. 383 00:24:01,450 --> 00:24:04,510 És gairebé com si copiar i enganxar en canvi 384 00:24:04,510 --> 00:24:07,810 els valors que desitja per manipular realment. 385 00:24:07,810 --> 00:24:14,480 Així que si aquest és el cas, quan l'inici del programa l'execució de la línia 35 després de 36 anys, 386 00:24:14,480 --> 00:24:18,650 quan arribi a la línia 37, en aquest moment de la història, quin és el valor de a? 387 00:24:21,040 --> 00:24:25,050 En aquest punt de la història, línia 37, quin és el valor d'una en aquest moment? >> [Estudiant] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Simplement ha de ser 1, a la dreta, ja que x es passa com a primer argument, 389 00:24:29,280 --> 00:24:33,080 i aquesta funció només arbitràriament està trucant al seu primer argument. 390 00:24:33,080 --> 00:24:38,200 De la mateixa manera és I el segon argument, i és simplement trucar a la b arbitràriament segon argument. 391 00:24:38,200 --> 00:24:40,990 >> Aquesta dicotomia és en realitat bastant simple explicació. Pensa en això. 392 00:24:40,990 --> 00:24:43,320 Cap de nosaltres ha conegut la persona que va escriure printf, 393 00:24:43,320 --> 00:24:50,770 pel que segurament, ell o ella no té idea del que les nostres variables de 30 anys més tard s'havia d'anomenar. 394 00:24:50,770 --> 00:24:56,650 Així que ha d'haver una distinció entre el que diuen les variables en les funcions que escrius 395 00:24:56,650 --> 00:25:02,080 i el que vostès anomenen les variables en les funcions que està trucant o utilitzant. 396 00:25:02,080 --> 00:25:05,340 En altres paraules, he escrit els meus variables com x i i, 397 00:25:05,340 --> 00:25:08,890 però si algú havia escrit la funció d'intercanvi, ell o ella segurament no sabria 398 00:25:08,890 --> 00:25:10,690 el que els meus variables es dirà, 399 00:25:10,690 --> 00:25:13,830 així adonar-se que això és per què té aquesta dualitat de noms. 400 00:25:13,830 --> 00:25:16,750 Tècnicament, jo podria fer això per casualitat, 401 00:25:16,750 --> 00:25:20,080 però tot i així es passa com còpies. 402 00:25:20,080 --> 00:25:23,650 Només seria una pura coincidència estèticament si aquesta persona que va escriure intercanvi 403 00:25:23,650 --> 00:25:26,150 havia utilitzat els mateixos noms. 404 00:25:26,150 --> 00:25:32,370 Així que en aquest punt de la història, línia 37, a és 1, b és 2, i ara em dedico a intercanviar-les. 405 00:25:32,370 --> 00:25:34,900 En primer lloc, voldria realment fer això molt més simple. 406 00:25:34,900 --> 00:25:36,690 No sé quines són aquestes 3 línies de codi feien. 407 00:25:36,690 --> 00:25:41,210 Permetin-me fer això: b = a, a = b; fet. 408 00:25:41,210 --> 00:25:44,690 Per què aquesta trencat, lògicament? 409 00:25:46,490 --> 00:25:48,900 És una cosa de la intuïtiu, oi? 410 00:25:48,900 --> 00:25:52,560 Així una i B es converteix en b es converteix en una, 411 00:25:52,560 --> 00:25:57,730 però el problema és que tan aviat com s'executa la línia 37, quin és el valor de a i b? 412 00:25:57,730 --> 00:26:03,410 El mateix, 1, perquè ha pallissa, per dir-ho, has canviat b sigui igual a. 413 00:26:03,410 --> 00:26:08,890 Així que un cop que s'ha executat la línia 37, que està molt bé, ara tens 2 còpies de la número 1 414 00:26:08,890 --> 00:26:13,350 dins d'aquesta funció, de manera que a continuació, quan vostè diu en la línia 38 a = b, 415 00:26:13,350 --> 00:26:17,640 ets una mica fotut perquè estàs assignant 1 a 1. 416 00:26:17,640 --> 00:26:20,580 Vostè ha perdut el tipus de valor que li importava. 417 00:26:20,580 --> 00:26:23,220 Així que en la versió original d'aquest, observi el que vaig fer. 418 00:26:23,220 --> 00:26:26,850 Jo en canvi va tenir una tercera línia de codi que es veia així. 419 00:26:26,850 --> 00:26:28,580 Jo declaro una variable temporal. 420 00:26:28,580 --> 00:26:32,170 >> Tmp és un nom molt comú per a una variable temporal, i és un int 421 00:26:32,170 --> 00:26:34,580 perquè ha de coincidir amb el que jo vull fer una còpia de. 422 00:26:34,580 --> 00:26:39,770 Puc guardar una còpia de dins de tmp, així que una vegada que la línia 37 s'ha executat, 423 00:26:39,770 --> 00:26:45,860 el valor de a és - comprovació de validesa ràpida - 1, el valor de b és 2, 424 00:26:45,860 --> 00:26:48,970 i el valor de tmp és també 1. 425 00:26:48,970 --> 00:26:52,060 Així que ara executar la línia 38. 426 00:26:52,060 --> 00:27:00,540 Quan la línia 38 s'executa, una presa el valor de b. I b va ser de 2, de manera que ara és un 2. 427 00:27:00,540 --> 00:27:05,210 Així que en aquest punt de la història, a és 2, b és 2, i tmp és 1, 428 00:27:05,210 --> 00:27:11,060 de manera que ara, lògicament, podem valorar només tmp plop a la b i ja està. 429 00:27:11,060 --> 00:27:12,800 Per això hem resolt aquest problema. 430 00:27:12,800 --> 00:27:17,720 Malauradament, quan executo aquest programa en aquesta forma, en realitat no canviar cap valor. 431 00:27:17,720 --> 00:27:20,100 Però perquè quedi clar, per què? 432 00:27:23,660 --> 00:27:26,450 He arreglat el problema lògic de fa un moment, 433 00:27:26,450 --> 00:27:31,020 però de nou, si executa aquest programa, x i i no canvien 434 00:27:31,020 --> 00:27:33,310 pel final de l'execució del programa. 435 00:27:33,310 --> 00:27:37,220 [Comentari estudiant inaudible] >> No hem tornat res, així que això és cert. 436 00:27:37,220 --> 00:27:39,670 Però resulta que hi ha un petit problema aquí, perquè fins ara, 437 00:27:39,670 --> 00:27:44,170 l'únic que he estat capaç de tornar és una cosa, i aquesta és una restricció de la C. 438 00:27:44,170 --> 00:27:49,070 Només pot tornar realment un valor, en aquest cas estic una mica encallat aquí 439 00:27:49,070 --> 00:27:53,310 perquè vaig poder retornar el nou valor de x o podia tornar el nou valor de i, 440 00:27:53,310 --> 00:27:55,190 però vull que els dos de tornada. 441 00:27:55,190 --> 00:27:58,650 Així que torna no és la solució simple aquí. 442 00:27:58,650 --> 00:28:01,710 Però el problema fonamental és per què? Què hem canviat en realitat? 443 00:28:01,710 --> 00:28:04,190 [Estudiant] a i b. >> A i b. 444 00:28:04,190 --> 00:28:08,230 Però a i b són còpies de x i i, pel que acabem de fer tot aquest treball, 445 00:28:08,230 --> 00:28:11,650 Acabem de passar 3 minuts parlant sobre la funció d'intercanvi i els 3 d'aquestes variables, 446 00:28:11,650 --> 00:28:15,420 i això és genial, perfectament correcte en l'aïllament, 447 00:28:15,420 --> 00:28:20,740 però a i b de l'abast només és en aquestes línies aquí. 448 00:28:20,740 --> 00:28:24,790 >> Així com un bucle, si es declara un enter i dins del bucle for, 449 00:28:24,790 --> 00:28:28,760 De la mateixa manera, si vostè està declarant dins de a i b de la funció que vostè ha escrit, 450 00:28:28,760 --> 00:28:33,320 només són vàlids dins d'aquesta funció, el que significa que tan aviat com intercanvi es realitza executant 451 00:28:33,320 --> 00:28:38,470 i anem a partir de la línia 24 a la línia 25, x i i no han canviat en absolut. 452 00:28:38,470 --> 00:28:42,790 Vostè acaba de perdre un munt de temps que es triga còpies de variables. 453 00:28:42,790 --> 00:28:47,010 Així resulta que la solució a això és en realitat no evident. 454 00:28:47,010 --> 00:28:50,670 No és més que suficient per retornar valors perquè només podem retornar un valor, 455 00:28:50,670 --> 00:28:53,470 i realment vull canviar tant x com i, a la vegada, 456 00:28:53,470 --> 00:28:55,210 així que haurem de tornar a això. 457 00:28:55,210 --> 00:29:01,020 Però per ara, adonar-se que el problema fonamental deriva del fet que a i b són còpies 458 00:29:01,020 --> 00:29:03,630 i estan en el seu propi àmbit. 459 00:29:03,630 --> 00:29:05,050 Tractarem de resoldre això d'alguna manera. 460 00:29:05,050 --> 00:29:11,250 Permetin-me retrocedir en realitat aquí i obren, diguem, una quarta variant d'això, buggy4. 461 00:29:11,250 --> 00:29:13,370 Què passa amb això? 462 00:29:13,370 --> 00:29:17,810 Aquest és un problema similar però més senzill que mirar abans de prendre una punyalada en la seva solució. 463 00:29:17,810 --> 00:29:24,190 Aquest programa es diu increment, i pel que sembla s'inicialitza un enter x a 1 a la línia 18. 464 00:29:24,190 --> 00:29:28,150 Llavors em diuen x és 1, llavors em diuen "Incrementar ..." 465 00:29:28,150 --> 00:29:33,730 Llavors truqui increment, però després en les línies 22 i 23, que diuen que ha estat incrementat, 466 00:29:33,730 --> 00:29:40,220 Jo reclam x ara és el que és - 2, probablement - però aquest programa està lliure d'errors. 467 00:29:40,220 --> 00:29:42,610 Quin és el problema? 468 00:29:43,440 --> 00:29:50,160 Si. >> [Resposta dels estudiants inaudible] >> Exactament. 469 00:29:50,160 --> 00:29:52,490 Així que x ha estat declarada, per descomptat, en la línia 18. 470 00:29:52,490 --> 00:29:54,700 És dins de claus principal. 471 00:29:54,700 --> 00:29:58,440 Així que la resposta simple és que mentre que x existeix aquí, 472 00:29:58,440 --> 00:30:03,930 que no existeix en la línia 32, de manera que aquest programa realment ni tan sols es compilarà. 473 00:30:03,930 --> 00:30:07,940 El compilador quan intento compilar aquest codi va a cridar 474 00:30:07,940 --> 00:30:14,100 sobre algun identificador no declarat o alguna cosa per l'estil. De fet, ho intentarem. 475 00:30:14,100 --> 00:30:18,470 Es tracta de fer buggy4. Aquí està. 476 00:30:18,470 --> 00:30:22,110 L'ús de 'x' identificador no declarat en la línia 32. 477 00:30:22,110 --> 00:30:25,580 I, de fet, serem més explícit aquí avui perquè això sigui útil 478 00:30:25,580 --> 00:30:27,580 en hores d'oficina ia casa. 479 00:30:27,580 --> 00:30:29,300 >> Tingueu en compte que és una mica críptic escrit. 480 00:30:29,300 --> 00:30:37,270 Però el fet que té Clang ens cridava, dient buggy4.c: 32:5, és realment útil. 481 00:30:37,270 --> 00:30:42,050 Això significa que l'error està en la línia 32 a la posició de caràcter 5. 482 00:30:42,050 --> 00:30:46,700 Així 1, 2, 3, 4, 5. Això és, en efecte, on el problema és. 483 00:30:46,700 --> 00:30:49,790 I també, també, tenir en compte en les hores d'oficina ia casa, tinc sort aquí. 484 00:30:49,790 --> 00:30:52,990 Tinc un error. Serà relativament fàcil de solucionar. 485 00:30:52,990 --> 00:30:55,990 Però si tens una pàgina amb la missatges d'error aclaparadores, 486 00:30:55,990 --> 00:31:00,330 de nou adonar-se que el situat més avall podria ser un símptoma de la més alta. 487 00:31:00,330 --> 00:31:03,450 Així que sempre persegueix als seus errors, de dalt a baix 488 00:31:03,450 --> 00:31:05,820 perquè no només podria ser un efecte en cadena 489 00:31:05,820 --> 00:31:09,240 que suggereix que té problemes molt més del que realment fan. 490 00:31:09,240 --> 00:31:15,150 Llavors, com podem solucionar aquest problema si el meu objectiu és incrementar x? >> [Estudiant] x Faci global. 491 00:31:15,150 --> 00:31:17,060 Bé, pel que podem fer x global. 492 00:31:17,060 --> 00:31:20,480 Anem a tirar pel dret que em va advertir sobre abans, però dimonis, només necessitem una solució ràpida, 493 00:31:20,480 --> 00:31:25,730 així que anem a dir int x aquí. Això fa que x global. 494 00:31:25,730 --> 00:31:31,800 Així que ara principal té accés a la mateixa i l'increment té accés, 495 00:31:31,800 --> 00:31:34,110 i així que permetin-me anar endavant i compilar aquest moment. 496 00:31:34,110 --> 00:31:37,630 Fer buggy4, Enter. Sembla compilar ara. 497 00:31:37,630 --> 00:31:41,230 Anem a córrer buggy4. I sembla que funciona realment. 498 00:31:41,230 --> 00:31:45,150 Aquesta és una d'aquelles coses que es fan com jo dic, no el que faig, 499 00:31:45,150 --> 00:31:47,010 com acabo de fer aquí, ja que en general, 500 00:31:47,010 --> 00:31:50,440 nostres programes es posaran molt més interessant i molt més que això, 501 00:31:50,440 --> 00:31:56,390 i si la solució a problemes de la vida s'acaba de posar totes les variables a la part superior del seu arxiu, 502 00:31:56,390 --> 00:31:59,690 molt ràpidament quins programes es horriblement difícil de manejar. 503 00:31:59,690 --> 00:32:02,190 Es fa més difícil d'idear nous noms de variables, 504 00:32:02,190 --> 00:32:05,240 es fa més difícil entendre què variable està fent què, 505 00:32:05,240 --> 00:32:08,460 i així, en general, això no és una bona solució. 506 00:32:08,460 --> 00:32:10,030 Així que farem això millor. 507 00:32:10,030 --> 00:32:12,160 No volem utilitzar una variable global aquí. 508 00:32:12,160 --> 00:32:16,240 >> Jo vull incrementar x, així que òbviament podria - 509 00:32:16,240 --> 00:32:18,670 al final del dia, això és una mica d'una història ximple perquè simplement fer això - 510 00:32:18,670 --> 00:32:24,450 però si jo no sabia res d'aquest operador o que no se li va permetre canviar principal en si, 511 00:32:24,450 --> 00:32:30,730 Com podria jo posar en pràctica Ken aquí aquesta vegada no per incrementar cub però a? 512 00:32:31,380 --> 00:32:33,190 Com puc canviar això d'aquí? Si. 513 00:32:33,190 --> 00:32:38,480 [Estudiant] Pass a x i tornar després [inaudible] >> Bé, bé. 514 00:32:38,480 --> 00:32:41,900 Per què no puc passar en x i llavors en comptes de tornar-lo, 515 00:32:41,900 --> 00:32:44,870 Per què no m'ho torni x + 1. 516 00:32:44,870 --> 00:32:47,710 Un parell de coses que han de canviar aquí. Estic en el camí correcte. 517 00:32:47,710 --> 00:32:49,770 Què més necessita per modificar? Algú més. Si. 518 00:32:49,770 --> 00:32:51,740 [Resposta dels estudiants inaudible] 519 00:32:51,740 --> 00:32:54,730 He de canviar el tipus de retorn d'increment perquè no s'anul · larà. 520 00:32:54,730 --> 00:32:57,780 Res Void mitjans s'estan tornant, però és evident que ara és, 521 00:32:57,780 --> 00:32:59,830 així que això ha de canviar a - >> [estudiant] int. 522 00:32:59,830 --> 00:33:02,740 int per ser coherent amb el que en realitat estic tornant. 523 00:33:02,740 --> 00:33:05,180 Ara, una altra cosa és encara amb errors aquí. Si. 524 00:33:05,180 --> 00:33:08,400 [Resposta dels estudiants inaudible] >> [Malan] Així que necessito per incrementar x? 525 00:33:08,400 --> 00:33:12,080 [Resposta dels estudiants inaudible] >> [Malan] Ah, així que he de passar x. 526 00:33:12,080 --> 00:33:16,660 Així que he de fer això aquí. >> [Comentari estudiant inaudible] 527 00:33:16,660 --> 00:33:20,050 [Malan] Així que el prototip, he de canviar això aquí. 528 00:33:20,050 --> 00:33:22,930 Així que això ha de ser un int, això ha de ser - 529 00:33:22,930 --> 00:33:25,620 hmm, jo ​​en realitat tenen un error aquí. Anem a arreglar això primer. 530 00:33:25,620 --> 00:33:29,590 Quin ha de ser aquesta realitat? Ha de ser alguna cosa int. 531 00:33:29,590 --> 00:33:32,700 Podria ser x, però, francament, si vostè comença a trucar a tots els de la seva x variables, 532 00:33:32,700 --> 00:33:35,390 que rebrà menys i menys clara quin és quin. 533 00:33:35,390 --> 00:33:39,560 >> Així que anem a triar arbitràriament una nomenclatura diferent per les funcions del meu ajudador; 534 00:33:39,560 --> 00:33:41,940 les funcions que estic escrivint. L'anomenarem a, o podríem anomenar - 535 00:33:41,940 --> 00:33:45,010 Diguem que és el nombre sigui encara més explícit. 536 00:33:45,010 --> 00:33:47,560 Així que he de tornar tot el que el nombre és més 1, 537 00:33:47,560 --> 00:33:50,740 i ara he de canviar una cosa aquí i una altra cosa aquí. 538 00:33:50,740 --> 00:33:54,350 Què he de canviar en la línia 21 en primer lloc? >> [Resposta dels estudiants inaudible] 539 00:33:54,350 --> 00:33:57,610 [Malan] he de assignar a x. No puc cridar increment (x). 540 00:33:57,610 --> 00:34:01,960 Necessito recordar la resposta en canviar el valor de x en el costat esquerre. 541 00:34:01,960 --> 00:34:04,680 I tot i que x es troba ara a l'esquerra i la dreta, que és totalment bé 542 00:34:04,680 --> 00:34:08,860 pel fet que el costat dret s'executa primer i després es va deixar caure en la cosa de l'esquerra - 543 00:34:08,860 --> 00:34:10,600 x en aquest cas. 544 00:34:10,600 --> 00:34:12,159 I finalment, aquesta és una solució fàcil ara. 545 00:34:12,159 --> 00:34:17,230 Això només ha de coincidir amb el que està a baix, el nombre int. 546 00:34:17,230 --> 00:34:20,570 Així que un munt de canvis per a una funció realment estúpid 547 00:34:20,570 --> 00:34:24,420 però representativa de les coses que cada vegada voldrà fer. 548 00:34:24,420 --> 00:34:27,090 Així que buggy4. M'he cagat en algun lloc. 549 00:34:27,090 --> 00:34:30,139 Oh, Déu meu. Cinc errors en un programa de 6 línies. 550 00:34:30,139 --> 00:34:35,690 Llavors, què hi ha de dolent en la línia 18, el caràcter 5? 551 00:34:35,690 --> 00:34:39,610 Així que he de declarar aquest tipus int. 552 00:34:39,610 --> 00:34:41,920 Anem a veure. Hi ha un munt d'altres errors. 553 00:34:41,920 --> 00:34:47,010 Oh, Déu meu - 19, 18, 21 -, però de nou, anem a esborrar la pantalla, L Control d'aquí, 554 00:34:47,010 --> 00:34:49,380 i torneu a executar Clang. 555 00:34:49,380 --> 00:34:51,340 Així que 5 problemes que en realitat és només una. 556 00:34:51,340 --> 00:34:57,520 Així que ara anem a executar buggy4, Enter. Sort, x s'ha incrementat correctament. 557 00:34:57,520 --> 00:35:02,720 Està bé. Qualsevol pregunta sobre la forma d'incrementar els nombres? Si. 558 00:35:02,720 --> 00:35:09,870 [Pregunta estudiant inaudible] >> Bona pregunta. 559 00:35:09,870 --> 00:35:14,220 Com és que només puc canviar x a nombre i el programa sabrà immediatament? 560 00:35:14,220 --> 00:35:16,200 >> Un cop més, pensar-hi com aquesta abstracció. 561 00:35:16,200 --> 00:35:21,600 Així que si jo sóc principal i Ken és l'increment, francament, no m'importa el que Ken crida al seu iPad. 562 00:35:21,600 --> 00:35:26,570 No m'importa el que ell anomena qualsevol cosa que tingui a veure amb la implementació d'aquesta funcionalitat. 563 00:35:26,570 --> 00:35:33,340 Aquest és un detall d'implementació que jo, principal, no han de preocupar. 564 00:35:33,340 --> 00:35:38,250 I així, simplement canviant constantment dins de la funció - i el número de sèrie aquí aquí - 565 00:35:38,250 --> 00:35:40,960 és tot el que pren tant de temps com jo recompilar. 566 00:35:40,960 --> 00:35:44,180 És com si es pensa en molts de nosaltres, aquells que tinguin llicències de conduir 567 00:35:44,180 --> 00:35:46,770 que han impulsat o si fins i tot ha conduït a un cotxe, 568 00:35:46,770 --> 00:35:50,950 la majoria de nosaltres no tenim idea de com funciona un cotxe sota la campana. 569 00:35:50,950 --> 00:35:54,970 I, literalment, si s'obre el capó, la majoria de nosaltres - jo inclòs - 570 00:35:54,970 --> 00:35:56,940 no sabrem realment el que estem veient, 571 00:35:56,940 --> 00:35:59,220 espècie que es pot sentir amb coses com aquesta ara mateix. 572 00:35:59,220 --> 00:36:01,480 Però en realitat no han de tenir cura com el cotxe funciona, 573 00:36:01,480 --> 00:36:05,970 que no han de cuidar el que totes les varetes i pistons i els cables a l'interior del cotxe 574 00:36:05,970 --> 00:36:08,160 en realitat estan fent. 575 00:36:08,160 --> 00:36:12,770 Així que alguna cosa com el que vostès anomenen el pistó no té importància aquí en aquest cas. La mateixa idea. 576 00:36:12,770 --> 00:36:25,300 Si. >> [Pregunta estudiant inaudible] 577 00:36:25,300 --> 00:36:29,180 Si hi ha més usos de la variable xa moment abans, 578 00:36:29,180 --> 00:36:32,150 vostè, el programador, hauria de canviar tot arreu. 579 00:36:32,150 --> 00:36:36,600 O vostè podria literalment fer Arxiu, Menú, i després Cerca, Reemplaçar - una cosa així - 580 00:36:36,600 --> 00:36:39,170 però hauràs de fer aquests canvis pel seu compte. 581 00:36:39,170 --> 00:36:47,450 Cal ser coherent. >> [Estudiant] Si hi ha diverses variables [inaudible] 582 00:36:47,450 --> 00:36:53,100 Una ordre particular, com aquí, si es tractava d'int altre nombre? >> [Estudiant] Correcte. 583 00:36:53,100 --> 00:36:56,590 [Malan] Yeah. Ordre importa quan es crida a la funció. 584 00:36:56,590 --> 00:37:00,050 >> Així que si m'estaven trucant increment aquí amb una mica alguna cosa coma, 585 00:37:00,050 --> 00:37:01,680 hi ha una correlació directa. 586 00:37:01,680 --> 00:37:05,690 La primera variable, com es digui, es fa una còpia del primer argument per aquí. 587 00:37:05,690 --> 00:37:07,760 Em sap greu. Això no hauria de ser un parèntesi. 588 00:37:07,760 --> 00:37:11,490 Les línies del segon argument per dalt amb el segon. Així ordre, sí, importa. Està bé. 589 00:37:11,490 --> 00:37:17,020 Em sap greu. Vaig prendre el camí més llarg per arribar-hi. Altres preguntes? Està bé. 590 00:37:17,020 --> 00:37:20,610 Així que anem a veure si podem pintar un quadre del que realment està passant aquí 591 00:37:20,610 --> 00:37:23,090 sota la campana, per dir-ho. 592 00:37:23,090 --> 00:37:26,640 Aquest és un rectangle que podria representar la memòria del seu ordinador. 593 00:37:26,640 --> 00:37:30,970 Encara que no té idea de com funciona la memòria RAM o com funciona, 594 00:37:30,970 --> 00:37:33,940 almenys se suposa que té raïms d'ell en aquests dies. 595 00:37:33,940 --> 00:37:36,280 Tens megabytes d'ella, tens gigabytes d'aquesta, 596 00:37:36,280 --> 00:37:40,870 i sabem per setmana 0 que un byte és què? >> [Estudiant] 8 bits. 597 00:37:40,870 --> 00:37:42,950 8 bits, no? Així que 8 zeros i 1. 598 00:37:42,950 --> 00:37:45,880 Així que si el seu equip té un giga de RAM, 2 gigues de RAM en aquests dies, 599 00:37:45,880 --> 00:37:55,030 Té un bilió o 2 milions de bytes de memòria o bits de prop de 8 milions de dòlars o 16000000000 600 00:37:55,030 --> 00:37:56,890 dins del seu equip. 601 00:37:56,890 --> 00:38:00,590 A diferència de la petita Wooly Willy exemple, no és típicament partícules magnètiques més. 602 00:38:00,590 --> 00:38:04,450 Cada vegada més - en els ordinadors portàtils almenys - és unitats d'estat sòlid, SSD, 603 00:38:04,450 --> 00:38:08,580 que simplement no tenen parts mòbils. Tot és electrònic. És tota l'electricitat basada en. 604 00:38:08,580 --> 00:38:14,060 Així que pensa d'aquest rectangle com tot just representa l'1 o 2 gigabytes de memòria que té. 605 00:38:14,060 --> 00:38:16,020 >> Així que és un tros de memòria. 606 00:38:16,020 --> 00:38:19,830 El món de la informàtica té una mena de particions de 607 00:38:19,830 --> 00:38:22,950 trossos de memòria per fer coses diferents. 608 00:38:22,950 --> 00:38:27,190 Per exemple, si aquesta és la memòria RAM del seu ordinador, com ho suggereix el rectangle allà, 609 00:38:27,190 --> 00:38:31,130 resulta que, per convenció, a la part superior de la memòria RAM, per dir-ho, 610 00:38:31,130 --> 00:38:33,660 generalment és el que s'anomena un segment de text. 611 00:38:33,660 --> 00:38:36,740 Aquests són el 0 i 1 que hagi recopilat. 612 00:38:36,740 --> 00:38:39,020 Per això, quan hem mirat sota de la caputxa del a.out és, 613 00:38:39,020 --> 00:38:41,980 tots aquests 0s i 1s, quan s'executa un programa, 614 00:38:41,980 --> 00:38:46,290 els 0s i 1s són carregats des del disc dur en alguna cosa que es diu memòria RAM, 615 00:38:46,290 --> 00:38:49,320 i en la RAM es les col · loca en la part superior. 616 00:38:49,320 --> 00:38:52,770 Mentrestant, vostè té altres coses: inicialitzar les dades, desinicializar dades. 617 00:38:52,770 --> 00:38:57,510 Aquestes dues franges de memòria es refereixen a les variables globals, que no s'utilitzen sovint 618 00:38:57,510 --> 00:39:00,760 però de vegades si ho fa, acaben allà també. 619 00:39:00,760 --> 00:39:04,260 Llavors hi ha altres coses: variables d'entorn, que no anem a passar molt temps des d'ara, 620 00:39:04,260 --> 00:39:06,860 però 2 coses importants de tornar al llarg del semestre, 621 00:39:06,860 --> 00:39:08,550 pila i pila. 622 00:39:08,550 --> 00:39:12,210 Així que la majoria de la memòria de l'equip està reservat en executar un programa 623 00:39:12,210 --> 00:39:15,370 per alguna cosa que es diu la pila i una cosa que es diu la pila. 624 00:39:15,370 --> 00:39:18,840 No anem a parlar sobre el munt d'avui, però anem a parlar de la pila. 625 00:39:18,840 --> 00:39:24,600 La pila està destinat a evocar la visual de les safates de menjar al menjador Mather House 626 00:39:24,600 --> 00:39:28,110 o allà on sigui, on el personal de menjador netejar cada dia, 627 00:39:28,110 --> 00:39:30,180 que ells comparen des del terra cap amunt, 628 00:39:30,180 --> 00:39:34,550 i de la mateixa manera, a la memòria, no és la idea de posar alguna cosa en una pila, 629 00:39:34,550 --> 00:39:36,860 posar alguna cosa en una pila, posar alguna cosa en una pila. 630 00:39:36,860 --> 00:39:38,240 I què és el que volem dir amb això? 631 00:39:38,240 --> 00:39:41,860 >> Anem a ampliar en gairebé la meitat inferior de la imatge, la memòria RAM del seu ordinador, 632 00:39:41,860 --> 00:39:44,330 a proposar la següent. 633 00:39:44,330 --> 00:39:48,170 Resulta que quan s'executa un programa com a.out o hello - 634 00:39:48,170 --> 00:39:50,100 qualsevol que sigui el programa que has escrit - 635 00:39:50,100 --> 00:39:54,020 de nou, els 0s i 1s són carregats des del disc dur, que és un emmagatzematge prolongat, 636 00:39:54,020 --> 00:39:57,230 roman allà fins i tot quan es tiri de la clavilla, es carrega a la memòria RAM. 637 00:39:57,230 --> 00:40:00,610 RAM és més ràpid que els discs durs - és més petit que els discs durs - 638 00:40:00,610 --> 00:40:03,300 però és on els programes en viu mentre està en funcionament. 639 00:40:03,300 --> 00:40:08,230 Així es fa doble clic en un programa en un Mac o PC, es carrega des del disc dur a la RAM. 640 00:40:08,230 --> 00:40:11,520 Així que es carrega a la memòria RAM, el go 0s i 1s a la part superior forma, 641 00:40:11,520 --> 00:40:16,610 el segment de text anomenat, però tan bon punt el programa realment es posa en marxa, 642 00:40:16,610 --> 00:40:21,360 la principal funció és cridada, i principal, com hem vist, sovint té variables locals, 643 00:40:21,360 --> 00:40:24,870 i té sencers i cadenes i caràcters i similars. 644 00:40:24,870 --> 00:40:29,180 Així que si el teu programa que vostè ha escrit o del programa que hagi fet doble clic 645 00:40:29,180 --> 00:40:32,970 utilitzat algunes variables dins de la principal, 646 00:40:32,970 --> 00:40:37,240 acaben en la part inferior de la pila de la memòria, per dir-ho. 647 00:40:37,240 --> 00:40:39,410 Més concretament, què significa això realment? 648 00:40:39,410 --> 00:40:48,450 Això només vol dir que si anàvem a numerar els bytes de RAM a l'ordinador, 649 00:40:48,450 --> 00:40:55,750 notar que aquest podria ser el nombre de bytes 0, aquest podria ser el nombre de bytes 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 tot el camí fins 2000000000 seria tot el camí fins allà a la part superior. 651 00:41:01,480 --> 00:41:05,880 En altres paraules, quan es parla de la memòria RAM o en termes de bytes, 652 00:41:05,880 --> 00:41:11,500 només significa que algú ha decidit a explicar el que cada un dels trossos de memòria. 653 00:41:11,500 --> 00:41:16,650 Així que quan vostè necessita 32 bits per a un int o necessita 8 bits per a un char, 654 00:41:16,650 --> 00:41:18,840 D'on van a parar a la memòria? 655 00:41:18,840 --> 00:41:22,350 >> Conceptualment, s'acaba d'acabar en el fons d'aquesta cosa anomenada la pila. 656 00:41:22,350 --> 00:41:25,870 Però l'interessant ara és quan crida a una funció principal - 657 00:41:25,870 --> 00:41:28,750 suposem una funció anomenada foo, només un nom arbitrari - 658 00:41:28,750 --> 00:41:32,330 el que passa és principal està a la part inferior d'aquesta pila de la memòria; 659 00:41:32,330 --> 00:41:35,680 foo ara es col · loca en la part superior de la memòria principal. 660 00:41:35,680 --> 00:41:40,990 Així que les variables locals que s'acaben foo tipus de vista conceptual sobre dels de principal. 661 00:41:40,990 --> 00:41:47,070 Si foo crida a una altra funció anomenada bar, aquelles variables acaben aquí. 662 00:41:47,070 --> 00:41:50,120 Si la barra demana una mica més, aquí, aquí, aquí. 663 00:41:50,120 --> 00:41:53,830 Així que el que és interessant sobre l'execució d'un programa és que en cridar a funcions 664 00:41:53,830 --> 00:41:57,750 i com aquestes funcions i cridar a funcions com les funcions que criden a funcions, 665 00:41:57,750 --> 00:42:01,470 construir l'edifici aquesta pila de funcions en la memòria. 666 00:42:01,470 --> 00:42:06,890 I només una vegada retorna una funció no comença a rebre aquesta memòria esquena. 667 00:42:06,890 --> 00:42:10,860 Així que una de les maneres més fàcils d'executar fora de la memòria en un programa informàtic 668 00:42:10,860 --> 00:42:14,360 és escriure funcions que mai tornen. 669 00:42:14,360 --> 00:42:18,900 Així, per exemple, demostrarem com molt amb un programa intencionalment buggy. 670 00:42:18,900 --> 00:42:22,230 Deixin-me seguir endavant i fer # include, 671 00:42:22,230 --> 00:42:25,000 int main (void) 672 00:42:25,000 --> 00:42:32,940 i jo vaig a fer mentre que (2> 1), el que probablement no canviarà en nosaltres, 673 00:42:32,940 --> 00:42:37,560 i m'ho dius a mi seguir endavant ara i fer printf. 674 00:42:37,560 --> 00:42:40,700 En realitat, això serà menys interessant visualment. Anem a fer això. 675 00:42:40,700 --> 00:42:50,240 Per int i = 0; i> 0 - anem a cometre aquest error - i + +. 676 00:42:50,240 --> 00:42:52,720 I no printf aquí. Anem a practicar el que predicava. 677 00:42:52,720 --> 00:43:00,190 Anem a fer una mètode aquí, chorus buit, i direm int i, 678 00:43:00,190 --> 00:43:06,830 i després diré printf - no, farem això més interessant. 679 00:43:06,830 --> 00:43:15,790 Que en realitat no imprimeix res en absolut. Anem a això: chorus (i). 680 00:43:15,790 --> 00:43:20,390 Està bé. Així que això té errors perquè per què? 681 00:43:20,390 --> 00:43:23,380 Estic fent això com vaig perquè el programa no fa res d'interès. 682 00:43:23,380 --> 00:43:25,320 >> Però aquest no és l'objectiu. 683 00:43:25,320 --> 00:43:29,630 L'objectiu és escriure un programa que té com a principal funció fa el que, pel que sembla? 684 00:43:30,720 --> 00:43:32,860 Truqui a si mateix. I en realitat, no necessitem el bucle. 685 00:43:32,860 --> 00:43:37,200 Anem a simplificar encara això només per no perdre de vista realment l'error fonamental. 686 00:43:37,200 --> 00:43:39,640 Principals trucades cor per cantar alguns cors, 687 00:43:39,640 --> 00:43:41,440 llavors vaig fer alguna cosa estúpid i jo vam tenir cor cor anomenada 688 00:43:41,440 --> 00:43:43,760 perquè vaig suposar que algú més havia de posar-ho en pràctica, potser, 689 00:43:43,760 --> 00:43:47,210 i ara això no es va a compilar encara. He de fer què? 690 00:43:47,210 --> 00:43:49,970 Necessito el prototip, recorda. 691 00:43:49,970 --> 00:43:56,110 Així que he de tenir aquí cor void (int i); 692 00:43:56,110 --> 00:43:59,210 Així que ara si em vaig per aquí - en realitat, utilitzarem la finestra més gran. 693 00:43:59,210 --> 00:44:01,980 Seguirem endavant i fer cors. 694 00:44:01,980 --> 00:44:06,490 Seguirem endavant i fer cors. 695 00:44:06,490 --> 00:44:08,370 L'ús d'identificador no declarat i. 696 00:44:08,370 --> 00:44:12,500 Oh, això va ser estúpid. No necessitem l'argument. Anem a fer això. 697 00:44:12,500 --> 00:44:16,370 M'hauria agradat haver començat d'aquesta manera. Hauria estat un programa molt més fàcil d'escriure. 698 00:44:16,370 --> 00:44:25,590 Ja està. Ara anirem a la meva finestra de terminal, executeu de nou Clang, i aquí anem. 699 00:44:25,590 --> 00:44:28,460 Això va ser molt ràpid. 700 00:44:28,460 --> 00:44:31,150 El que en realitat acaba de passar, però? 701 00:44:31,150 --> 00:44:33,730 Bé, ara vaig a afegir la línia d'impressió perquè puguem veure. 702 00:44:33,730 --> 00:44:43,490 Permetin-me dir printf ("Sóc aquí") - sense variables. El deixarem així. 703 00:44:43,490 --> 00:44:47,480 Permetin-me fer tornar a executar. Permetin-me tornar a executar cor. 704 00:44:47,480 --> 00:44:57,380 I ... anem. Segueix endavant. 705 00:44:57,380 --> 00:44:59,930 Com acotació al marge, per què no ho ha ensorrat encara? 706 00:44:59,930 --> 00:45:02,080 La decisió de segmentació passar súper ràpid abans. 707 00:45:02,080 --> 00:45:06,570 [Resposta dels estudiants inaudible] >> Exactament. Així que es necessita temps per imprimir, oi? 708 00:45:06,570 --> 00:45:08,610 Només es necessita més treball per part de l'equip. 709 00:45:08,610 --> 00:45:10,620 I aquí està: segmentation fault. 710 00:45:10,620 --> 00:45:12,340 >> Així notar com de ràpid executar programes. 711 00:45:12,340 --> 00:45:14,130 Si no està imprimint alguna cosa, super ràpid. 712 00:45:14,130 --> 00:45:18,770 Però encara tinc aquest error de segmentació perquè el que estava passant? 713 00:45:18,770 --> 00:45:21,210 Si vostè pensa sobre com la memòria de l'equip es presenta, 714 00:45:21,210 --> 00:45:28,740 això passa a ser principal, però aquí anomenarem a aquest cor, i anomenarem a aquest cor. 715 00:45:28,740 --> 00:45:34,550 I ara si faig la meva estètica bé, això és només dirà cor, cor, cor, 716 00:45:34,550 --> 00:45:40,550 cor, cor, cor, cor, fins a la sacietat, i, finalment, què passarà? 717 00:45:40,550 --> 00:45:45,630 Si el quadre gran, literalment, és la següent, què li passa conceptual? 718 00:45:46,520 --> 00:45:48,630 Els excessos de la pila la pila. 719 00:45:48,630 --> 00:45:51,940 O, pitjor encara, que acaba d'envair tot, incloent el segment de text, 720 00:45:51,940 --> 00:45:54,590 que és el 0 i 1 que representa el programa. 721 00:45:54,590 --> 00:45:57,080 En resum, això és només super, super malament. 722 00:45:57,080 --> 00:45:58,830 El seu programa s'ha disparat fora de control. 723 00:45:58,830 --> 00:46:01,220 Vostè està utilitzant la memòria molt més del previst 724 00:46:01,220 --> 00:46:03,960 tot a causa d'un error estúpid en aquest cas, 725 00:46:03,960 --> 00:46:08,040 o en aquest cas una funció molt deliberadament fet en si de trucada. 726 00:46:08,040 --> 00:46:09,500 Ara, això no és del tot dolent. 727 00:46:09,500 --> 00:46:13,800 Les funcions que es diuen en realitat té un gran poder quan l'hi usa correctament. 728 00:46:13,800 --> 00:46:15,800 Jo no ho he fet servir correctament aquí. 729 00:46:15,800 --> 00:46:19,780 Així que això no és del tot dolent, però el fet que en realitat mai m'aturo trucant 730 00:46:19,780 --> 00:46:23,520 és una debilitat fonamental d'aquest programa aquí. 731 00:46:23,520 --> 00:46:26,400 Llavors, on anem amb tot això? Què està passant realment? 732 00:46:26,400 --> 00:46:30,340 Quan dic a la funció d'increment com si estiguéssim fent en aquests exemples, 733 00:46:30,340 --> 00:46:33,420 Tinc un valor com una que jo pas polz 734 00:46:33,420 --> 00:46:37,570 Em passa una còpia del número 1, de manera que passa a continuació. 735 00:46:37,570 --> 00:46:44,240 Entrarem en l'increment exemple, aquest tipus per aquí. 736 00:46:44,240 --> 00:46:46,870 Això és el que està succeint realment. 737 00:46:46,870 --> 00:46:53,400 Quan dic increment cada passa x, gràficament, el que està passant aquí és el següent. 738 00:46:53,400 --> 00:46:59,520 >> Si tinc el valor d'1 emmagatzemen aquí i jo en realitat cridar increment, 739 00:46:59,520 --> 00:47:04,330 que ara es diu cor - l'iPad m'està tirant d'aquí. 740 00:47:04,330 --> 00:47:09,760 Anem a trucar a aquest increment, i no sabem el que aquesta funció ve serà. 741 00:47:09,760 --> 00:47:14,840 Llavors, què està passant realment aquí en algun lloc principal que tinc un tros de memòria 742 00:47:14,840 --> 00:47:17,000 que emmagatzema el número 1. 743 00:47:17,000 --> 00:47:19,380 Quan dic increment, estic fent servir un altre tros de la memòria, 744 00:47:19,380 --> 00:47:21,230 però ara tinc la còpia de 1. 745 00:47:21,230 --> 00:47:26,660 En augmentar aquest valor, aquest es converteix en 2, 746 00:47:26,660 --> 00:47:30,560 però llavors el que passa tan aviat com torna d'increment? 747 00:47:30,560 --> 00:47:33,630 Aquesta memòria només es va lliurar de nou al sistema operatiu, 748 00:47:33,630 --> 00:47:37,450 el que significa que tot el que hem fet és gens útil. 749 00:47:37,450 --> 00:47:43,120 L'1 que figurava originalment en el principal segueix sent realment allà. 750 00:47:43,120 --> 00:47:44,890 Llavors, ¿a on anem amb això? 751 00:47:44,890 --> 00:47:49,770 Resulta que en la memòria que té aquesta seqüència de back-to-back de bytes 752 00:47:49,770 --> 00:47:53,050 que es poden posar coses a dins, i resulta que ja hem vist alguna cosa 753 00:47:53,050 --> 00:47:55,390 que consisteix a col · locar les coses tornin a esquena amb esquena amb esquena. 754 00:47:55,390 --> 00:47:59,860 Què és una cadena basada en la setmana 1 i la setmana 2 ara? 755 00:48:00,020 --> 00:48:01,980 És només un conjunt de caràcters. 756 00:48:01,980 --> 00:48:04,310 Així que resulta tal com es pot posar els números a la memòria, 757 00:48:04,310 --> 00:48:06,990 De la mateixa manera es pot posar caràcters en la memòria. 758 00:48:06,990 --> 00:48:10,530 I un cop que comencem a posar en la memòria de personatges d'esquena a l'esquena amb esquena, 759 00:48:10,530 --> 00:48:13,620 resulta que l'ús de les coses més simples com un bucle o un bucle while, 760 00:48:13,620 --> 00:48:17,170 podem repetir d'esquerra a dreta sobre els caràcters d'una cadena 761 00:48:17,170 --> 00:48:20,600 i començar a fer massatges a personatges completament diferents - 762 00:48:20,600 --> 00:48:23,370 podria esdevenir una b, b podria ser c - 763 00:48:23,370 --> 00:48:27,780 pel que en última instància, podem prendre una frase Anglès que realment té sentit 764 00:48:27,780 --> 00:48:30,310 i convertir cadascuna d'aquestes una cartes en un moment 765 00:48:30,310 --> 00:48:34,400 caminant a través de la memòria del nostre ordinador d'esquerra a dreta per xifrar en realitat. 766 00:48:34,400 --> 00:48:35,810 Així que tindrem nostres cinc minuts de descans aquí, 767 00:48:35,810 --> 00:48:40,730 i quan tornem, anem a començar aquest procés de codificació de la informació. 768 00:48:42,020 --> 00:48:43,520 >> Està bé. 769 00:48:43,520 --> 00:48:48,070 Abans de submergir-se en alguna crypto i aquestes coses anomenades matrius, 770 00:48:48,070 --> 00:48:51,470 permetin-me fer una pausa per a qualsevol pregunta, perquè em sento com si realment alguna cosa confusa 771 00:48:51,470 --> 00:48:54,080 alguns d'aquests temes. Així que anem a arreglar ara si podem. 772 00:48:54,080 --> 00:48:58,700 Acabem de parlar sobre valors de retorn, parlem d'arguments, 773 00:48:58,700 --> 00:49:03,250 i parlem d'aquesta idea, que tornarem a les pròximes setmanes, 774 00:49:03,250 --> 00:49:08,720 de visualització de la memòria com un grapat sencer d'aquestes safates apilades, per dir-ho, 775 00:49:08,720 --> 00:49:12,660 de baix a dalt, de manera que cada safata que es posen a la pila 776 00:49:12,660 --> 00:49:16,530 representa una funció que està sent anomenat. 777 00:49:17,900 --> 00:49:20,260 Alguna pregunta? 778 00:49:20,260 --> 00:49:22,640 Permeteu-me fer-li una pregunta aquí. 779 00:49:22,640 --> 00:49:27,890 Permetin-me simplificar això al que era abans que alguns de la nostra anterior Q & A. 780 00:49:27,890 --> 00:49:35,570 El fet que l'increment té parèntesi d'obertura, nombre int, tancat parèntesi - 781 00:49:35,570 --> 00:49:39,110 ¿Quin nombre representa int? 782 00:49:39,110 --> 00:49:42,790 [Estudiant] Un argument. >> Un argument. Bé. Però el que és un argument? 783 00:49:42,790 --> 00:49:46,370 [Resposta dels estudiants inaudible] >> Què és això? >> [Estudiant] Una cosa que es passa polz 784 00:49:46,370 --> 00:49:49,940 Està bé, així que alguna cosa que passa polz I més en general, és només l'entrada. 785 00:49:49,940 --> 00:49:52,450 Si estigués escrivint una funció i propòsit d'aquesta funció en la vida 786 00:49:52,450 --> 00:49:55,770 és fer una cosa una mica diferent cada vegada que l'utilitzi, 787 00:49:55,770 --> 00:50:00,110 llavors l'única forma perquè això succeeixi realment sembla que deixés entrar 788 00:50:00,110 --> 00:50:03,510 perquè es pugui fer alguna cosa diferent amb aquesta entrada cada vegada. 789 00:50:03,510 --> 00:50:06,650 >> Així que cal especificar dues coses quan una funció presa d'entrada. 790 00:50:06,650 --> 00:50:09,590 Cal especificar el nom que voleu donar a aquesta entrada 791 00:50:09,590 --> 00:50:12,700 exclusivament per a la seva conveniència, perquè pugui referir-s'hi 792 00:50:12,700 --> 00:50:16,540 en la funció que vostè està escrivint, com ho vaig fer aquí a la línia 32. 793 00:50:16,540 --> 00:50:20,800 Però també cal especificar el seu tipus, ja que C és un llenguatge de programació 794 00:50:20,800 --> 00:50:25,940 que només requereix que si vols una variable, vostè ha de dir-li a l'ordinador quin tipus de dades és, 795 00:50:25,940 --> 00:50:30,200 en gran part, a que sàpiga el nombre de bits a assignar a aquesta variable 796 00:50:30,200 --> 00:50:33,020 perquè podria ser de 6 - ho sento, no serà 6. 797 00:50:33,020 --> 00:50:37,080 Pot ser 16, pot ser 8, pot ser 32, fins i tot 64, 798 00:50:37,080 --> 00:50:39,130 però l'equip ha de saber. 799 00:50:39,130 --> 00:50:43,180 Ara, la INT a la banda esquerra representa el que, per contra? 800 00:50:46,350 --> 00:50:48,850 [Resposta dels estudiants inaudible] >> Què és això? >> [Estudiant] Tipus de funció. 801 00:50:48,850 --> 00:50:53,610 El tipus d'una funció i, més específicament, el tipus de la seva producció. Dreta. 802 00:50:53,610 --> 00:50:57,380 Així, mentre que la cosa en parèntesi representa la seva entrada, si s'escau, 803 00:50:57,380 --> 00:50:59,660 la cosa a l'esquerra representa la sortida. 804 00:50:59,660 --> 00:51:03,530 I en aquest cas, l'increment aparentment torna un int, 805 00:51:03,530 --> 00:51:07,690 i així int és el tipus de retorn d'aquesta funció. 806 00:51:07,690 --> 00:51:09,340 Què significa tornar? 807 00:51:09,340 --> 00:51:15,090 Literalment, s'utilitza la paraula clau return i després, si ho tornarà 808 00:51:15,090 --> 00:51:18,600 a la dreta de la paraula clau és un nombre enter, 809 00:51:18,600 --> 00:51:21,660 llavors que és consistent amb el que hem promès. 810 00:51:21,660 --> 00:51:26,410 No es podria fer alguna cosa com això - hola, món - perquè això és una cadena. 811 00:51:26,410 --> 00:51:28,860 >> Òbviament, no és un nombre enter. 812 00:51:28,860 --> 00:51:33,140 Així que en resum, la càrrega està realment en nosaltres, el programador, per ser específic 813 00:51:33,140 --> 00:51:37,770 quant al que estem tornant i per llavors de seguir per tornar. 814 00:51:37,770 --> 00:51:43,440 El context aquí és que la memòria del seu ordinador és un gigabyte, 2 gigabytes - 815 00:51:43,440 --> 00:51:45,920 el que sigui - potser és més, potser és menys, 816 00:51:45,920 --> 00:51:49,050 però l'equip que considera que té diferents seccions. 817 00:51:49,050 --> 00:51:51,200 Una cosa passa allà baix, una mica més va allà dalt, 818 00:51:51,200 --> 00:51:54,290 coses diferents va en el medi, i avui simplement començar a explicar la història, 819 00:51:54,290 --> 00:51:56,340 però anem a tornar a aquest moment de nou. 820 00:51:56,340 --> 00:51:59,980 Per ara, l'única memòria que realment importa és el segment de text 821 00:51:59,980 --> 00:52:03,360 ja que només representa el 0 i 1 que Clang s'emeten. 822 00:52:03,360 --> 00:52:06,050 Així que quan s'executa una ordre en el teclat com a.out 823 00:52:06,050 --> 00:52:09,110 o fa doble clic en una icona en Mac OS o Windows, 824 00:52:09,110 --> 00:52:11,880 el programa es carrega des del disc dur a la RAM 825 00:52:11,880 --> 00:52:16,330 i es va deixar caure al cim de la memòria RAM de l'ordinador, per dir-ho. 826 00:52:16,330 --> 00:52:20,450 Mentrestant, comença el teu programa d'entrenament i principal trucada 827 00:52:20,450 --> 00:52:23,640 al programa que va escriure o escriu el programa de Microsoft o Apple, 828 00:52:23,640 --> 00:52:27,860 qualsevol de les seves variables locals acaben aquí baix a la part inferior de la memòria del seu ordinador. 829 00:52:27,860 --> 00:52:33,230 Però si les trucades principals a una altra funció que té variables o arguments, acaben sobre. 830 00:52:33,230 --> 00:52:36,680 I si aquesta funció crida a alguna cosa, acaben sobre d'ell, a sobre d'ell, a sobre d'ell. 831 00:52:36,680 --> 00:52:41,460 >> I només una vegada una funció es fa executar és la pila de safates, per dir-ho, 832 00:52:41,460 --> 00:52:43,240 comencen a posar-se més i més. 833 00:52:43,240 --> 00:52:48,250 I això és el que llavors, en poques paraules, explica per què quan es diu cub 834 00:52:48,250 --> 00:52:51,550 o pot trucar al increment, que està passant per una còpia del valor. 835 00:52:51,550 --> 00:52:55,520 I el que això significa és que pictòricament està literalment escrit el número 1 836 00:52:55,520 --> 00:53:00,460 en una altra part de la memòria, el canvi que 1 a 2 en el cas d'increment 837 00:53:00,460 --> 00:53:04,820 oa un 8 en el cas de cub i després estirar que la memòria de distància 838 00:53:04,820 --> 00:53:09,140 tan bon punt l'increment dels rendiments o de funcions de cub. Pregunta. 839 00:53:09,140 --> 00:53:12,900 [Estudiant] On s'emmagatzemen les variables globals? 840 00:53:12,900 --> 00:53:18,100 Les variables globals s'emmagatzemen en el que s'anomena actualment les dades inicialitzats o dades sense inicialitzar, 841 00:53:18,100 --> 00:53:21,920 la diferència està en si té una variable global i se li assigna un valor immediat 842 00:53:21,920 --> 00:53:24,640 amb el signe d'igualtat, acaba a la part superior hi ha, 843 00:53:24,640 --> 00:53:29,200 i si el que diuen int x; sense valor, acaba lleugerament inferior en RAM 844 00:53:29,200 --> 00:53:31,710 simplement per convenció. 845 00:53:31,710 --> 00:53:34,940 Altres preguntes? Està bé. 846 00:53:34,940 --> 00:53:37,340 Així que aquesta imatge tornarà a mesura que més poderós 847 00:53:37,340 --> 00:53:39,170 amb el que podem fer amb l'ordinador, 848 00:53:39,170 --> 00:53:42,720 però per ara, tindrem una breu introducció a la criptografia, 849 00:53:42,720 --> 00:53:46,080 un tipus específic de criptografia que no resol tots els problemes del món 850 00:53:46,080 --> 00:53:47,720 però és resoldre alguns. 851 00:53:47,720 --> 00:53:51,700 En aquest cas aquí, tenim una cosa que es diu criptografia de clau secreta. 852 00:53:51,700 --> 00:53:56,410 Criptografia de clau secreta, com el nom suggereix, deriva la seva seguretat d'un secret. 853 00:53:56,410 --> 00:54:00,690 >> Per exemple, si estaven de tornada a l'escola primària i que estaven passant una carta secreta mica d'amor 854 00:54:00,690 --> 00:54:04,850 per al noi o la noia amb la qual estaven aixafant en endavant, si volia passar aquesta nota a través de l'audiència, 855 00:54:04,850 --> 00:54:08,380 és probable que no anava a escriure una nota a Anglès o el que la seva llengua materna és. 856 00:54:08,380 --> 00:54:13,340 Més aviat, és possible xifrar o simplement pot enviar-los un missatge de text en aquests dies. 857 00:54:13,340 --> 00:54:15,460 Però que en realitat podria passar una nota a través de la sala de classe. 858 00:54:15,460 --> 00:54:18,700 I per fer-ho amb seguretat, de tal manera que els seus amics i el professor 859 00:54:18,700 --> 00:54:22,650 no saps el que estàs escrivint, és possible arribar a un algoritme bastant simple, 860 00:54:22,650 --> 00:54:25,920 jove, encara que és possible que, amb només barrejar les paraules. 861 00:54:25,920 --> 00:54:28,130 Així que en lloc d'escriure una pot escriure b, 862 00:54:28,130 --> 00:54:30,220 en lloc de b pot escriure c, 863 00:54:30,220 --> 00:54:32,140 en lloc de c pot escriure d, i així successivament. 864 00:54:32,140 --> 00:54:34,360 O bé, podria arribar a una traducció més sofisticada 865 00:54:34,360 --> 00:54:36,720 de cartes a diferents lletres. 866 00:54:36,720 --> 00:54:39,740 Però el problema és el noi o la noia a la qual li està enviant aquesta nota 867 00:54:39,740 --> 00:54:45,020 ha de saber alguna cosa, que és el que, òbviament? >> [Estudiant] El que vostè està enviant. 868 00:54:45,020 --> 00:54:49,720 Quin és el seu secret, com ho és que com traduir els una i la de B i de C i D's. 869 00:54:49,720 --> 00:54:54,650 És només l'addició d'1 a cadascuna de les lletres per anar de A a B, de B a C? 870 00:54:54,650 --> 00:54:56,670 És més complex que això? 871 00:54:56,670 --> 00:55:01,540 >> Així que tu i el teu enamorat és necessari tenir aquesta informació secreta, 872 00:55:01,540 --> 00:55:03,190 però hi ha una espècie de catch-22 aquí. 873 00:55:03,190 --> 00:55:06,830 Si aquesta és la primera vegada que enviarà aquesta carta d'amor a través de la classe, 874 00:55:06,830 --> 00:55:10,720 Com és aquest nen o nena sabrà quin és el secret fins i tot és? 875 00:55:10,720 --> 00:55:13,930 Així clau secreta de xifrat no resol tots els problemes del món, 876 00:55:13,930 --> 00:55:16,320 i de fet hi ha una relació que aquí tornarem a cap al final del semestre. 877 00:55:16,320 --> 00:55:25,110 De la mateixa manera, no la majoria de nosaltres coneix a algú que treballa, per exemple, a Amazon.com, 878 00:55:25,110 --> 00:55:28,190 i no obstant això, molts de nosaltres hem comprat coses a Amazon.com, 879 00:55:28,190 --> 00:55:31,990 i se'ns ha ensenyat a assumir que aquestes transaccions de comerç electrònic són segurs. 880 00:55:31,990 --> 00:55:36,470 La direcció URL https probablement diu, hi ha potser una icona de cadenat poc ximple en algun lloc, 881 00:55:36,470 --> 00:55:39,930 hi ha una mena de criptografia assegurar la seva informació de targeta de crèdit 882 00:55:39,930 --> 00:55:42,160 entre vostè i Amazon.com. 883 00:55:42,160 --> 00:55:45,430 I no obstant això, si la criptografia implica saber algun secret 884 00:55:45,430 --> 00:55:48,620 i no obstant això, jo no conec a ningú a Amazon i no he arreglat sens dubte algun tipus de secret 885 00:55:48,620 --> 00:55:52,710 amb algú a l'Amazones, com és el meu ordinador o navegador fent això? 886 00:55:52,710 --> 00:55:55,720 Resulta que hi ha altres tipus de criptografia en conjunt de resoldre aquest problema. 887 00:55:55,720 --> 00:55:57,670 Però per ara, ens centrarem en el senzill 888 00:55:57,670 --> 00:56:00,290 on es pot organitzar amb antelació per conèixer algun secret 889 00:56:00,290 --> 00:56:03,760 com una o altra assignació entre una i la de b. 890 00:56:03,760 --> 00:56:05,840 I el procés de criptografia generalment implica això. 891 00:56:05,840 --> 00:56:08,620 Vostè té una mica de text sense format, representat aquí a l'esquerra, 892 00:56:08,620 --> 00:56:12,930 s'executa a través d'algun tipus d'algorisme o procediment per xifrar - 893 00:56:12,930 --> 00:56:15,100 potser això és només una es converteix en b, b esdevé c - 894 00:56:15,100 --> 00:56:17,490 i llavors acaba amb text xifrat. 895 00:56:17,490 --> 00:56:20,380 Mentrestant, un cop que el seu enamorament rep aquesta nota secreta, 896 00:56:20,380 --> 00:56:24,200 ell o ella ha de descífralo en general revertir aquest algorisme 897 00:56:24,200 --> 00:56:27,190 amb la finalitat de recuperar el text sense format. 898 00:56:27,190 --> 00:56:28,960 Hi ha encarnacions físiques d'aquest. 899 00:56:28,960 --> 00:56:31,680 >> Per exemple, aquest és un anell descodificador secret poc, 900 00:56:31,680 --> 00:56:35,110 i aquest és un anell en el sentit que hi ha dos dials aquí. 901 00:56:35,110 --> 00:56:38,490 A la perifèria exterior d'aquesta cosa, no hi ha lletres de l'A a la Z, 902 00:56:38,490 --> 00:56:40,340 encara estan en ordre aleatori, 903 00:56:40,340 --> 00:56:42,880 ia l'interior, de fet hi ha alguns nombres 904 00:56:42,880 --> 00:56:46,620 de tal manera que amb aquest anell et poden espècie de tornada a l'exterior però no l'interior 905 00:56:46,620 --> 00:56:49,140 amb la finalitat d'alinear els números amb lletres. 906 00:56:49,140 --> 00:56:53,020 A partir d'una pel · lícula que es diu Un conte de Nadal, veuràs que poc Ralphie 907 00:56:53,020 --> 00:56:58,000 estava tan ansiós d'esbrinar quin és el missatge secret Little Orphan Annie era per a ell 908 00:56:58,000 --> 00:57:02,570 que havia estat comunicada, crec, en forma de missatges numèrics en una caixa de cereal 909 00:57:02,570 --> 00:57:07,220 i ha hagut d'acumular totes les petites targetes que vénen a la caixa de cereal, 910 00:57:07,220 --> 00:57:09,770 calia enviar-los per correu, calia recuperar l'anell descodificador secret 911 00:57:09,770 --> 00:57:13,910 de manera que vostè pot finalment entendre el que el mapeig és entre les lletres i els números 912 00:57:13,910 --> 00:57:15,550 o lletres i lletres. 913 00:57:15,550 --> 00:57:19,520 Com en un ordinador podem anar sobre l'aplicació o representar les coses d'aquesta manera? 914 00:57:19,520 --> 00:57:22,560 Necessitem una manera d'expressar-nos una mica més flexible 915 00:57:22,560 --> 00:57:25,080 que les nostres variables fins al moment han permès. 916 00:57:25,080 --> 00:57:29,000 Hem tingut sencers, hem tingut caràcters, hem tingut flotadors i dobles i alguns altres, 917 00:57:29,000 --> 00:57:34,200 però aquestes són les peces individuals de la memòria que realment no ens permeten expressar coses 918 00:57:34,200 --> 00:57:36,440 com les paraules i les oracions i frases. 919 00:57:36,440 --> 00:57:38,630 De fet, hem anomenat cordes aquestes coses, 920 00:57:38,630 --> 00:57:42,660 però prometo que això és només una simplificació a la biblioteca CS50 921 00:57:42,660 --> 00:57:45,540 que estem intentant pelar. 922 00:57:45,540 --> 00:57:47,500 Així que anem a començar a fer això aquí. 923 00:57:47,500 --> 00:57:49,840 Deixin-me seguir endavant i obrir un arxiu - 924 00:57:49,840 --> 00:57:54,100 tots aquests arxius estan disponibles, com de costum, en línia - array.c anomenada 925 00:57:54,100 --> 00:57:58,960 per resoldre un problema no relacionat amb les cadenes, però que pinta un quadre aquí 926 00:57:58,960 --> 00:58:01,520 de com podríem utilitzar una cosa que es diu una matriu. 927 00:58:01,520 --> 00:58:04,050 >> Una matriu és un tipus de dades. 928 00:58:04,050 --> 00:58:10,730 És un tipus de variable de tipus que té diversos tipus de dades més petites dins d'ella 929 00:58:10,730 --> 00:58:12,680 esquena amb esquena a esquena amb esquena. 930 00:58:12,680 --> 00:58:16,980 Així, per exemple, si volem escriure un petit programa que et dóna la mitjana de concurs 931 00:58:16,980 --> 00:58:19,780 per a un curs com 50 que té dos qüestionaris, 932 00:58:19,780 --> 00:58:23,450 que podria molt fàcilment escriure aquest programa basat fins i tot en alguns dels materials de la setmana passada 933 00:58:23,450 --> 00:58:28,830 mitjançant l'ús d'getInt i un parell de variables: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 I és bastant senzill. 935 00:58:30,550 --> 00:58:33,500 És potser 10, 20 línies de codi màxim per posar en pràctica un programa de 936 00:58:33,500 --> 00:58:38,940 que demana a l'usuari 2 puntuacions prova i després calcula la mitjana 937 00:58:38,940 --> 00:58:42,020 mitjançant l'addició d'ells junts, dividint per 2, i després imprimir els resultats. 938 00:58:42,020 --> 00:58:46,400 Probablement podríem fer això molt fàcilment ara, després d'un cert nombre de minuts. 939 00:58:46,400 --> 00:58:49,450 Però el problema és de suposar que 50 tenien 3 o 4 proves. 940 00:58:49,450 --> 00:58:52,830 Suposem que li agradaria utilitzar el mateix programa per a una classe que tenia proves setmanals. 941 00:58:52,830 --> 00:58:55,100 Penseu en una classe que ha exàmens setmanals. 942 00:58:55,100 --> 00:58:58,840 Si hi ha 16 o més setmanes en un semestre, ara té 16 variables: 943 00:58:58,840 --> 00:59:03,030 quiz1 int, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Així que vostè comença a veure aquesta redundància, aquesta copiant i enganxant el codi, 945 00:59:06,870 --> 00:59:09,810 ha de començar a fer que t'agradaria que hi hagués una manera millor. 946 00:59:09,810 --> 00:59:13,610 I gràcies a Déu, a causa de les matrius que hi ha. Així que anem a fer això. 947 00:59:13,610 --> 00:59:16,700 En primer lloc, permetin-me presentar a una cosa molt simple que no hem fet servir fins ara, 948 00:59:16,700 --> 00:59:18,820 però ho vas a veure de tant en tant en el codi. 949 00:59:18,820 --> 00:59:21,270 >> Això és el que normalment es coneix com constant. 950 00:59:21,270 --> 00:59:24,410 Així que és una constant en el sentit que aquest valor mai canvia. 951 00:59:24,410 --> 00:59:26,450 La convenció humana quan es crea una constant 952 00:59:26,450 --> 00:59:30,420 és l'ús de lletres majúscules només perquè realment es destaca en el seu codi, 953 00:59:30,420 --> 00:59:34,270 i la paraula clau especial que s'utilitza en C # defineix. 954 00:59:34,270 --> 00:59:39,970 Per això diem # defineix, després un espai, llavors la paraula que voleu utilitzar per al nom de la constant de 955 00:59:39,970 --> 00:59:41,730 i després el valor de la constant. 956 00:59:41,730 --> 00:59:44,710 Tingueu en compte que això és diferent de assigna alguna cosa a una variable. 957 00:59:44,710 --> 00:59:46,430 No hi ha cap signe igual, no hi ha punt i coma. 958 00:59:46,430 --> 00:59:49,140 Això és el que es coneix generalment com una directiva de preprocessador, 959 00:59:49,140 --> 00:59:50,840 però més d'això en un altre moment. 960 00:59:50,840 --> 00:59:56,350 Per ara, això crea un valor immutable anomenat TESTS 961 00:59:56,350 --> 00:59:58,290 el valor numèric real és 2. 962 00:59:58,290 --> 01:00:02,180 Així que on Quan vegeu proves, exàmens, proves curtes al llarg d'aquest arxiu, 963 01:00:02,180 --> 01:00:04,230 això és només el número 2. 964 01:00:04,230 --> 01:00:06,550 Si miro principal ara, anem a veure com funciona això. 965 01:00:06,550 --> 01:00:09,770 Primer es veu una mica críptic, però és tot coses de la setmana 1. 966 01:00:09,770 --> 01:00:12,210 Demani a l'usuari per als graus. Com podem fer això? 967 01:00:12,210 --> 01:00:17,350 En la línia 22 - aquesta és realment la part sucosa - Declaro un flotador 968 01:00:17,350 --> 01:00:23,240 però no és només un sol flotador. Estic declarant, més aviat, un conjunt de valors de punt flotant. 969 01:00:23,240 --> 01:00:27,700 Aquesta variable es dirà graus, com s'implica aquí, 970 01:00:27,700 --> 01:00:31,420 però l'única nova sintaxi llavors són aquests claudàtors. 971 01:00:31,420 --> 01:00:37,280 El fet que el que he dit graus flotador i després obrir el parèntesi i després el nombre a - 972 01:00:37,280 --> 01:00:40,980 compte si es tracta d'una constant és igual que ho vam fer - 973 01:00:40,980 --> 01:00:46,840 això vol dir, "Hey ordinador, deme 2 flotadors i anem a anomenar col · lectivament graus". 974 01:00:46,840 --> 01:00:51,780 >> Això està en contrast amb un procés molt més tediós així: flotador grau 1; 975 01:00:51,780 --> 01:00:54,580 grade2 surar, i així successivament. 976 01:00:54,580 --> 01:00:58,310 Així que una matriu que ens permet posar en pràctica aquesta idea, però molt menys desordenadament, 977 01:00:58,310 --> 01:01:04,560 de tal manera que podem escriure una línia de codi en lloc de, per exemple, 16 per a un semestre de 16 setmanes. 978 01:01:04,560 --> 01:01:09,060 Jo no volia que codificar 2 perquè si es pensa en això ara, lògicament, 979 01:01:09,060 --> 01:01:12,560 Suposo que l'any que ve CS50 canvis a 3 qüestionaris en lloc 980 01:01:12,560 --> 01:01:15,010 i jo tenia el número 2 aquí, jo tenia el número 2 aquí, 981 01:01:15,010 --> 01:01:17,210 Jo tenia el número 2 aquí, el número 2 aquí. 982 01:01:17,210 --> 01:01:19,890 Es torna molt tediós i molt fàcil ficar la pota 983 01:01:19,890 --> 01:01:26,550 i canviar accidentalment un valor a 3 i es perdi algun altre valor de 2. 984 01:01:26,550 --> 01:01:30,660 Així que vaig a aquest lloc abstracte lluny i utilitzar aquesta constant que, 985 01:01:30,660 --> 01:01:32,520 Com el seu nom indica, mai canvia. 986 01:01:32,520 --> 01:01:35,870 I ara no importa si tenim diferents concursos d'aquest any o el pròxim, 987 01:01:35,870 --> 01:01:39,380 Només he de canviar en un lloc aquí a la part superior. 988 01:01:39,380 --> 01:01:41,230 Així que això és tot, una constant és. 989 01:01:41,230 --> 01:01:47,100 Mentrestant, la característica nova és que conceptual d'una matriu. 990 01:01:47,100 --> 01:01:55,030 Així que els claudàtors donar-me aquesta flota i molts em permet anomenar col · lectivament graus aquí. 991 01:01:55,030 --> 01:01:56,720 Així que ara anem a veure el que faré. 992 01:01:56,720 --> 01:01:59,220 Aquí, a la línia 24 és l'inici d'un bucle. 993 01:01:59,220 --> 01:02:03,380 >> Això és realment res especial. És només mitjançant TESTS lloc d'un nombre codificat. 994 01:02:03,380 --> 01:02:06,740 Però no hi ha res intel · lectualment diferent allà la setmana passada. 995 01:02:06,740 --> 01:02:11,650 Això és només printf, així printf ("Quiz #% d de% d:") 996 01:02:11,650 --> 01:02:16,670 perquè només vull imprimir dóna'm concurs número 1 de 2 i després 2 de 2. 997 01:02:16,670 --> 01:02:18,480 Així que això és una cosa purament estètic. 998 01:02:18,480 --> 01:02:21,000 Però la part més interessant ara està en la línia 27. 999 01:02:21,000 --> 01:02:27,840 Per tal d'omplir en un dels dos marcadors de posició amb un valor de punt flotant, 1000 01:02:27,840 --> 01:02:29,640 de nou utilitzar claudàtors. 1001 01:02:29,640 --> 01:02:35,170 En aquest cas, estic fent servir i perquè aquest bucle for s'ha iniciat amb i igualant el valor que, pel que sembla? 1002 01:02:35,170 --> 01:02:36,670 [Estudiant] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Així que en la primera iteració d'aquest bucle, és com si jo vaig escriure això en el codi, 1004 01:02:40,990 --> 01:02:46,310 però en la segona iteració d'aquest bucle, és com si jo vaig escriure això en el meu codi. 1005 01:02:46,310 --> 01:02:49,970 Però el fet que jo estic fent servir una variable és perfecte perquè, com el seu nom ho indica, 1006 01:02:49,970 --> 01:02:52,600 està variant el seu valor en cada iteració, 1007 01:02:52,600 --> 01:02:55,900 així que estic omplint aquesta matriu un lloc al mateix temps. 1008 01:02:55,900 --> 01:02:57,380 Què fa aquest acord sembla? 1009 01:02:57,380 --> 01:03:01,570 La raó per la que va dibuixar el quadrat super simple a la pantalla d'aquí abans que ser per aquesta raó. 1010 01:03:01,570 --> 01:03:05,590 Una matriu és simplement un tros de memòria seguit d'un altre tros de memòria 1011 01:03:05,590 --> 01:03:08,570 seguit per un altre bloc de memòria i així successivament. 1012 01:03:08,570 --> 01:03:13,120 Així que si el meu matriu és de mida 2 en aquest cas aquí, l'únic que estaria fent 1013 01:03:13,120 --> 01:03:20,200 escrivint en les puntuacions dels meus concursos com aquí - Tinc 100 en aquest i després em van donar un 99 en aquest cas - 1014 01:03:20,200 --> 01:03:24,970 llavors aquesta memòria que ni tan sols pot utilitzar perquè només he demanat a l'equip 1015 01:03:24,970 --> 01:03:26,840 per una matriu de mida 2. 1016 01:03:26,840 --> 01:03:28,600 Les places estan encara allà, oi? 1017 01:03:28,600 --> 01:03:32,670 Encara disposa de 2 gigabytes de RAM, encara que només està demanant per a 2 carros. 1018 01:03:32,670 --> 01:03:36,840 Així que la idea darrere de les matrius és que l'ordinador només pren un tros de memòria 1019 01:03:36,840 --> 01:03:41,340 i després reparteix trossos més petits d'esquena a l'esquena amb esquena. 1020 01:03:41,340 --> 01:03:43,310 I això és tot un arranjament és. 1021 01:03:43,310 --> 01:03:47,350 >> És un tros contigu de memòria dins de la qual vostè pot posar les coses. 1022 01:03:47,350 --> 01:03:50,700 Això li passa a fer a continuació, només una mica d'aritmètica avorrit. 1023 01:03:50,700 --> 01:03:54,640 Si em desplaço fins aquí, aquí és on em iterar sobre la matriu. 1024 01:03:54,640 --> 01:03:58,020 Vinc amb la suma de tots els valors de la matriu, 1025 01:03:58,020 --> 01:04:02,470 i aleshores utilitzar la funció round aquí per fer realitat la suma dividida per quizzes. 1026 01:04:02,470 --> 01:04:06,320 Però permetin-me saludar la meva mà que com una mena d'aritmètica suficient per ara. 1027 01:04:06,320 --> 01:04:08,370 Però tot el que està fent per mi en última instància està calculant una mitjana. 1028 01:04:08,370 --> 01:04:13,580 Així que prova primer més segon qüestionari dividit per 2 i després imprimir-com un int. 1029 01:04:13,580 --> 01:04:17,280 Però ara anem a la transició a un exemple diferent anomenat cadena1, 1030 01:04:17,280 --> 01:04:20,700 que pinta un quadre similar però utilitzant cordes. 1031 01:04:20,700 --> 01:04:23,940 Deixin-me seguir endavant i simplificar això per un moment. 1032 01:04:23,940 --> 01:04:27,090 Perdona la sagnia per ara. 1033 01:04:27,090 --> 01:04:30,870 Observeu en la línia 19 d'aquest exemple, tinc una cadena de l'usuari. 1034 01:04:30,870 --> 01:04:34,640 Però noti el que estic fent en la línies 22 en endavant. 1035 01:04:34,640 --> 01:04:41,250 En realitat estic iterar des i fins - i aquest és un nou truc - strlen, longitud de la cadena. 1036 01:04:41,250 --> 01:04:44,880 Aquesta és una funció que ve amb C que si se li passa una cadena, 1037 01:04:44,880 --> 01:04:47,730 et diu quants caràcters hi ha en aquesta cadena. Això és tot. 1038 01:04:47,730 --> 01:04:51,550 I el fet que és strlen en lloc de la longitud de la cadena és només perquè és més concís. 1039 01:04:51,550 --> 01:04:55,100 Trenta anys enrere, la gent li agrada escriure coses tan succintament possible, 1040 01:04:55,100 --> 01:04:57,630 així que hem mantingut aquesta convenció aquí. 1041 01:04:57,630 --> 01:05:00,660 i + + només significa incrementar ia cada iteració. 1042 01:05:00,660 --> 01:05:02,990 I ara notin això, que és molt interessant. 1043 01:05:02,990 --> 01:05:09,180 En la línia 24, li dic, "Ordinador, dóna'm un personatge, 8 bits, i en diuen c". 1044 01:05:09,180 --> 01:05:12,630 Però què és això en la part dreta dient? 1045 01:05:13,490 --> 01:05:16,530 En Anglès, què representa? 1046 01:05:16,530 --> 01:05:18,730 [Estudiant] El primer caràcter del conjunt. 1047 01:05:18,730 --> 01:05:20,790 Exactament. Dóna'm el primer caràcter de la matriu. 1048 01:05:20,790 --> 01:05:24,090 O, més en general, em donen el caràcter ia la matriu. 1049 01:05:24,090 --> 01:05:26,100 I adonar-se que és important ara que com els informàtics, 1050 01:05:26,100 --> 01:05:27,890 en realitat estem comptant des de 0. 1051 01:05:27,890 --> 01:05:29,720 >> No té la discreció per començar a fer-ho. 1052 01:05:29,720 --> 01:05:34,160 Ara vostè ha de comportar-se d'acord amb les expectatives de l'equip i comptar de 0 1053 01:05:34,160 --> 01:05:38,180 perquè [0] serà el primer caràcter d'una cadena, 1054 01:05:38,180 --> 01:05:42,150 [1] serà la segona, [2] que serà el tercer, i així successivament. 1055 01:05:42,150 --> 01:05:49,720 Així que aquest programa, si ho compila, es tracta novament de cadena1, així que cadena1, 1056 01:05:49,720 --> 01:05:54,670 i ara m'he trobat en la meva cadena1 finestra de terminal. 1057 01:05:54,670 --> 01:05:58,330 S'espera per a l'entrada, així que vaig a escriure en David, Enter, 1058 01:05:58,330 --> 01:06:02,540 i ara imprimeix David tot en línies diferents, perquè fixa't el que estic fent. 1059 01:06:02,540 --> 01:06:05,820 Estic imprimint un caràcter alhora. 1060 01:06:05,820 --> 01:06:10,100 No entrarem en detalls avui sobre això, però he eliminat fa un moment aquest xec aquí. 1061 01:06:10,100 --> 01:06:15,480 Resulta que si l'usuari s'està portant malament, contradictori, confús o simplement 1062 01:06:15,480 --> 01:06:20,210 en realitat es pot deixar de donar una sèrie de certa extensió. 1063 01:06:20,210 --> 01:06:22,860 Si es prem la tecla equivocada al teclat, es pot donar cap cadena en absolut, 1064 01:06:22,860 --> 01:06:26,950 o si vostè és maliciós, pot intentar per enganxar al patrimoni d'un gigabyte d'un assaig 1065 01:06:26,950 --> 01:06:29,290 per omplir aquesta cadena, i si l'equip es queda sense memòria, 1066 01:06:29,290 --> 01:06:32,710 resulta que tornarem aquest valor especial anomenat NULL. 1067 01:06:32,710 --> 01:06:35,580 Així que per ara, només sé que hi ha aquest valor especial anomenat NULL 1068 01:06:35,580 --> 01:06:39,580 que ens permetrà comprovar quan estem fora de la memòria, entre altres coses. 1069 01:06:39,580 --> 01:06:45,630 Però si obro ara cadena2, noti una diferència aquí. 1070 01:06:45,630 --> 01:06:48,210 Tingueu en compte una diferència aquí amb cadena2. 1071 01:06:48,210 --> 01:06:51,340 Amb cadena2, aquest bucle for és una mica diferent. 1072 01:06:51,340 --> 01:06:55,010 >> Deixa esborrar els valors NULL perquè puguem parlar d'aquells en un altre moment. 1073 01:06:55,010 --> 01:06:57,800 Què hi ha de diferent en el bucle for aquesta vegada? 1074 01:06:59,620 --> 01:07:01,670 Puc tornar a l'exemple anterior. 1075 01:07:01,670 --> 01:07:08,580 Així que és la versió 2, aquesta és la versió 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 L'anomenada strlen és on? 1078 01:07:16,660 --> 01:07:18,860 És a la primera part del bucle for. 1079 01:07:18,860 --> 01:07:21,830 Alguna idea de per què estic fent això? Si. 1080 01:07:21,830 --> 01:07:24,560 [Estudiant] Així no es diu a la funció cada vegada. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Així que no cridi a la funció cada vegada. Exactament. 1082 01:07:26,440 --> 01:07:28,300 Recordeu que en els bucles for que són super simple 1083 01:07:28,300 --> 01:07:31,770 una vegada que una espècie de comprendre que aquesta és la inicialització, la condició, i l'actualització. 1084 01:07:31,770 --> 01:07:34,750 El problema és que la condició ocorre en cada iteració del bucle. 1085 01:07:34,750 --> 01:07:40,010 I així, en aquest exemple aquí, què té de dolent el fet que aquesta és la meva condició? 1086 01:07:40,010 --> 01:07:41,830 [Estudiant] Estàs trucant strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Ets trucant strlen una i altra vegada i una altra. 1088 01:07:44,340 --> 01:07:47,410 Però una vegada que has escrit en David, la longitud de la cadena és de 5, 1089 01:07:47,410 --> 01:07:49,650 i això no canviarà en cada iteració del bucle 1090 01:07:49,650 --> 01:07:51,670 perquè la cadena és encara D-A-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Així que aquesta és una pista del que es convertirà en una idea cada vegada més important 1092 01:07:55,320 --> 01:08:00,410 coneguda com una decisió de disseny on simplement no fer que l'ordinador faci la feina innecessari. 1093 01:08:00,410 --> 01:08:03,920 >> Així com una bestreta de pset2, pset2 en l'edició estàndard 1094 01:08:03,920 --> 01:08:07,030 et desafiar aplicar en la pràctica un cert nombre de xifres, 1095 01:08:07,030 --> 01:08:10,410 un nombre d'algorismes de xifrat, pel que ambdós puguin xifrar 1096 01:08:10,410 --> 01:08:13,840 i desxifrar missatges secrets molt similar a la Ralphie hi ha un descodificat. 1097 01:08:13,840 --> 01:08:16,810 En l'edició pirata de pset2, anirem una mica més lluny. 1098 01:08:16,810 --> 01:08:19,649 Ens anem a lliurar un arxiu d'un sistema informàtic actual 1099 01:08:19,649 --> 01:08:23,479 que conté una gran quantitat de noms d'usuari i contrasenyes xifrades reals, 1100 01:08:23,479 --> 01:08:26,939 i el repte de l'edició pirata serà per esquerdar les contrasenyes 1101 01:08:26,939 --> 01:08:33,200 i esbrinar el que la criptografia o quin secret es va utilitzar per generar realment les contrasenyes. 1102 01:08:33,200 --> 01:08:36,109 I farem això utilitzant un tret de C 1103 01:08:36,109 --> 01:08:40,630 que et donaré només un demo del conegut com a arguments de línia de comandes. 1104 01:08:40,630 --> 01:08:44,229 Resulta que, com alguns de vostès poden haver vist en la secció o en llibres de text, 1105 01:08:44,229 --> 01:08:48,260 principal no ha de sempre ser nul entre parèntesi. 1106 01:08:48,260 --> 01:08:52,430 Resulta que la principal també es pot escriure així, amb dos arguments, 1107 01:08:52,430 --> 01:08:56,870 argc i argv, on argc és el nombre de paraules 1108 01:08:56,870 --> 01:09:00,020 que s'escriu després del nom del programa en la línia d'ordres 1109 01:09:00,020 --> 01:09:03,420 i argv són les paraules reals. 1110 01:09:03,420 --> 01:09:07,540 I com els claudàtors indiquen allà, argv és aparentment una matriu. 1111 01:09:07,540 --> 01:09:12,210 Serà una cadena després d'una sèrie després d'una cadena en la memòria. 1112 01:09:12,210 --> 01:09:16,010 >> Llavors, què serem capaços de fer a partir de conjunt de processadors 2 és una cosa com això. 1113 01:09:16,010 --> 01:09:21,350 Si faig argv1, que és un exemple tornarem a dilluns, i executar-lo, 1114 01:09:21,350 --> 01:09:23,370 adonar que no sembla fer res. 1115 01:09:23,370 --> 01:09:25,490 Simplement imprimeix el seu propi nom. 1116 01:09:25,490 --> 01:09:31,479 Però si dic adéu classe, observi que aquest programa aparentment es repeteix 1117 01:09:31,479 --> 01:09:35,479 sobre cadascuna de les paraules que s'escriuen en l'indicador. 1118 01:09:35,479 --> 01:09:41,630 I els mitjans pels quals tindrem accés a les paraules que l'usuari ha escrit en l'indicador 1119 01:09:41,630 --> 01:09:49,160 és canviant principal a partir d'aquest cap de setmana des int main (void) per int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 i així naixerà arguments de línia de comandes. 1121 01:09:52,050 --> 01:09:57,100 I un cop que estiguis molt sofisticat en això, vostè serà capaç d'escriure programes realment trippy 1122 01:09:57,100 --> 01:09:59,610 com aquest aquí, que va per sobre i més enllà 1123 01:09:59,610 --> 01:10:03,940 algunes de les funcions que hem fet fins ara, però tot molt potent. 1124 01:10:03,940 --> 01:10:08,950 >> Així que sortirem d'això amb la següent a la pantalla, i ens veiem el dilluns. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]