1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Sección 4] [menos cómodo] 2 00:00:02,000 --> 00:00:04,000 [Nate Hardison] [Harvard University] 3 00:00:04,000 --> 00:00:07,000 [Esta é CS50.] [CS50.TV] 4 00:00:07,000 --> 00:00:10,000 >> Todo ben, benvido de volta á sección. 5 00:00:10,000 --> 00:00:13,000 Na sección desta semana imos facer un par de cousas. 6 00:00:13,000 --> 00:00:17,000 Nós imos primeiro Axuste repescagem Problema 2, 7 00:00:17,000 --> 00:00:20,000 Que é o conxunto de problemas César e Vigenère. 8 00:00:20,000 --> 00:00:23,000 E entón imos mergullar Quiz de 0 avaliación 9 00:00:23,000 --> 00:00:26,000 e pasar un pouco de tempo Recapitulando o que nós xa conversas sobre 10 00:00:26,000 --> 00:00:30,000 en cada unha das conferencias ata agora, e imos tamén facer algúns problemas 11 00:00:30,000 --> 00:00:32,000 a partir de cuestionarios ano anterior. 12 00:00:32,000 --> 00:00:36,000 Desta forma, vostedes teñen unha boa forma de prepararse para iso. 13 00:00:36,000 --> 00:00:40,000 >> Para comezar, eu iniciado un par de boas solucións 14 00:00:40,000 --> 00:00:45,000 para o conxunto de problemas anterior, conxunto de problemas 2, neste espazo. 15 00:00:45,000 --> 00:00:48,000 Se vostedes todos bater este enlace, 16 00:00:48,000 --> 00:00:53,000 e fai clic meu nome e prema na miña primeira revisión 17 00:00:53,000 --> 00:00:56,000 podes ver caesar.c, que é o que eu estou ollando. 18 00:00:56,000 --> 00:01:00,000 Imos falar sobre iso moi rapidamente. 19 00:01:00,000 --> 00:01:02,000 Esta é só unha solución de mostra. 20 00:01:02,000 --> 00:01:05,000 Esta non é necesariamente a solución perfecta. 21 00:01:05,000 --> 00:01:08,000 Hai moitas formas diferentes de escribir isto, 22 00:01:08,000 --> 00:01:10,000 pero hai algunhas cousas que me gustaría destacar 23 00:01:10,000 --> 00:01:13,000 que vin como estaba de clasificación, os erros máis comúns que eu creo que 24 00:01:13,000 --> 00:01:18,000 esta solución fai un traballo moi bo de manipular. 25 00:01:18,000 --> 00:01:22,000 >> O primeiro é ter algún tipo de comentario de cabeceira na parte superior. 26 00:01:22,000 --> 00:01:25,000 En liñas 1 a 7 ves os detalles, 27 00:01:25,000 --> 00:01:28,000 exactamente o que este programa está facendo. 28 00:01:28,000 --> 00:01:32,000 Unha boa práctica estándar cando está escribindo código C 29 00:01:32,000 --> 00:01:35,000 independentemente de que o seu programa está contido nun único arquivo ou 30 00:01:35,000 --> 00:01:38,000 se está dividido en varios arquivos é ter algún tipo de 31 00:01:38,000 --> 00:01:40,000 orientar comentario na parte superior. 32 00:01:40,000 --> 00:01:43,000 Este tamén é para as persoas que van para fóra, e escribir código no mundo real. 33 00:01:43,000 --> 00:01:47,000 Este é o lugar onde van poñer a información de copyright. 34 00:01:47,000 --> 00:01:50,000 A continuación hai unha lista dos inclúe #. 35 00:01:50,000 --> 00:01:55,000 Na liña 16 hai esa # define, que nós imos volver un pouco. 36 00:01:55,000 --> 00:01:59,000 E entón, xa que a función comeza, comeza unha vez principais, 37 00:01:59,000 --> 00:02:03,000 porque este programa foi todo contido nunha única función 38 00:02:03,000 --> 00:02:09,000 A primeira cousa que acontece, e iso é moi idiomática e típica dun programa C 39 00:02:09,000 --> 00:02:14,000 que leva en liña de comandos argumentos é que verifica inmediatamente 40 00:02:14,000 --> 00:02:18,000 >> para a conta de argumento, argc. 41 00:02:18,000 --> 00:02:24,000 Aquí podemos ver que este programa está esperando dous argumentos exactamente. 42 00:02:24,000 --> 00:02:27,000 Lembre que non hai primeiro argumento que é o especial 43 00:02:27,000 --> 00:02:29,000 que é sempre o nome do programa que está a ser executado, 44 00:02:29,000 --> 00:02:31,000 o nome do ficheiro executable. 45 00:02:31,000 --> 00:02:36,000 E entón o que isto significa que impide o usuario de execución do programa 46 00:02:36,000 --> 00:02:42,000 con argumentos máis ou menos. 47 00:02:42,000 --> 00:02:44,000 A razón que queremos para comprobar iso de inmediato é porque 48 00:02:44,000 --> 00:02:52,000 non podemos realmente acceder a esta matriz argv aquí fiable 49 00:02:52,000 --> 00:02:55,000 ata que teñamos verificado para ver o quão grande é. 50 00:02:55,000 --> 00:02:58,000 >> Un dos erros máis comúns que vin foi xente inmediatamente ir 51 00:02:58,000 --> 00:03:01,000 e coller argv [1]. 52 00:03:01,000 --> 00:03:06,000 Eles incorporarse o argumento clave da matriz e non a un para eu comprobar sobre el, 53 00:03:06,000 --> 00:03:11,000 e entón faría a proba para argc, así como o seguinte proba, 54 00:03:11,000 --> 00:03:16,000 con ou sen o primeiro argumento era realmente un número enteiro, ao mesmo tempo, 55 00:03:16,000 --> 00:03:20,000 e que non funciona, porque no caso de que non existen argumentos facilitados 56 00:03:20,000 --> 00:03:26,000 vai ser incorporarse un argumento que non existe, ou tentar incorporarse unha que non está alí. 57 00:03:26,000 --> 00:03:29,000 >> A outra gran cousa que ten que observar é que 58 00:03:29,000 --> 00:03:32,000 sempre quere imprimir algún tipo de mensaxe de erro útil 59 00:03:32,000 --> 00:03:34,000 para o usuario a orientar-los. 60 00:03:34,000 --> 00:03:37,000 Estou seguro de que ten todos os programas de execución, onde, de súpeto, el traba, 61 00:03:37,000 --> 00:03:41,000 e recibir ese diálogo pouco ridículo que aparece e di 62 00:03:41,000 --> 00:03:44,000 algo terriblemente enigmático e quizais lle dá un código de erro ou algo parecido 63 00:03:44,000 --> 00:03:47,000 que non ten sentido. 64 00:03:47,000 --> 00:03:50,000 Isto é onde realmente quere ofrecer algo útil 65 00:03:50,000 --> 00:03:54,000 e orientada ao usuario, de xeito que cando executa-lo eles van "Oh," palma cara. 66 00:03:54,000 --> 00:03:58,000 "Eu sei exactamente o que facer. Sei como corrixir isto." 67 00:03:58,000 --> 00:04:01,000 >> Se non imprimir unha mensaxe, entón acaba realmente 68 00:04:01,000 --> 00:04:04,000 deixando o usuario a ir examinar o código fonte 69 00:04:04,000 --> 00:04:07,000 para descubrir o que deu errado. 70 00:04:07,000 --> 00:04:11,000 Hai tamén algunhas veces que vai usar os códigos de erro diferentes. 71 00:04:11,000 --> 00:04:14,000 Aquí só usou un para dicir que houbo un erro, 72 00:04:14,000 --> 00:04:16,000 Houbo un erro, houbo un erro. 73 00:04:16,000 --> 00:04:20,000 Programas maiores, moitas veces, os programas que son chamados por outros programas, 74 00:04:20,000 --> 00:04:25,000 pode voltar algún tipo de códigos de erro especiais en distintos escenarios 75 00:04:25,000 --> 00:04:28,000 programaticamente comunicar o que faría doutra forma 76 00:04:28,000 --> 00:04:32,000 usar só unha fermosa mensaxe Inglés para. 77 00:04:32,000 --> 00:04:35,000 Cool. 78 00:04:35,000 --> 00:04:37,000 Como traballamos para abaixo, podes ver que tirar a chave. 79 00:04:37,000 --> 00:04:40,000 Probar a ver se a chave encaixa. 80 00:04:40,000 --> 00:04:42,000 Recibimos unha mensaxe do usuario. 81 00:04:42,000 --> 00:04:46,000 A razón por que facelo nesta facer mentres ciclo e iso é algo que imos cubrir 82 00:04:46,000 --> 00:04:50,000 en un pouquiño, pero acontece que se insire o control D 83 00:04:50,000 --> 00:04:54,000 cando comeza a GetString ventá no terminal 84 00:04:54,000 --> 00:04:59,000 o que iso realmente significa é que envía un carácter especial 85 00:04:59,000 --> 00:05:01,000 para o programa. 86 00:05:01,000 --> 00:05:05,000 É o chamado ELF ou fin de ficheiro de caracteres. 87 00:05:05,000 --> 00:05:08,000 E, nese caso, a nosa cadea de mensaxe nulo, 88 00:05:08,000 --> 00:05:14,000 , Que non foi algo que comprobado para o conxunto de problemas en si. 89 00:05:14,000 --> 00:05:17,000 >> Pero como imos, agora que comezamos a falar sobre punteiros 90 00:05:17,000 --> 00:05:21,000 e distribución dinámica de memoria na pila, 91 00:05:21,000 --> 00:05:25,000 verificación de nulo sempre que ten unha función que podería 92 00:05:25,000 --> 00:05:30,000 voltar nulo como un valor é algo que vai querer adquirir o hábito de facer. 93 00:05:30,000 --> 00:05:33,000 Isto é aquí sobre todo para fins de ilustración. 94 00:05:33,000 --> 00:05:36,000 Pero cando ve GetString no futuro, 95 00:05:36,000 --> 00:05:41,000 así do conxunto de problemas 4, vai querer manter isto presente. 96 00:05:41,000 --> 00:05:44,000 De novo, isto non é un problema para conxunto de problemas 3 ou unha vez que non tiña cuberto iso aínda. 97 00:05:44,000 --> 00:05:53,000 Finalmente, chegamos a esta parte, onde temos para o circuíto de cifrado principal, 98 00:05:53,000 --> 00:05:57,000 e hai un par de cousas a suceder aquí. 99 00:05:57,000 --> 00:06:02,000 En primeiro lugar, iterar sobre a cadea de mensaxe enteira en si. 100 00:06:02,000 --> 00:06:07,000 Aquí mantivemos a chamada strlen na condición, 101 00:06:07,000 --> 00:06:12,000 que algúns de vós teñen apuntado non é un gran camiño a percorrer. 102 00:06:12,000 --> 00:06:15,000 Acontece que, neste caso, tampouco é grande, 103 00:06:15,000 --> 00:06:20,000 en parte porque estamos modificando o contido da mensaxe en si 104 00:06:20,000 --> 00:06:27,000 dentro do loop for, entón temos unha mensaxe que é 10 caracteres 105 00:06:27,000 --> 00:06:32,000 a primeira vez que inicie este ciclo é strlen vai devolver o que? 106 00:06:32,000 --> 00:06:35,000 10. 107 00:06:35,000 --> 00:06:40,000 >> Pero entón modificar mensaxe, dicir que modificar o seu carácter 5, 108 00:06:40,000 --> 00:06:46,000 e nós xogar un caracter \ 0 na posición 5, 109 00:06:46,000 --> 00:06:49,000 nunha iteração subseqüente strlen (mensaxe) non pode voltar o que fixo 110 00:06:49,000 --> 00:06:52,000 a primeira vez que iterada, 111 00:06:52,000 --> 00:06:56,000 pero, ao contrario, volver 5, porque xogamos en que terminador nulo, 112 00:06:56,000 --> 00:06:59,000 e lonxitude da corda é definido 113 00:06:59,000 --> 00:07:03,000 polo que a posición de \ 0. 114 00:07:03,000 --> 00:07:09,000 Neste caso, esta é unha boa forma de ir porque estamos modificando o no lugar. 115 00:07:09,000 --> 00:07:13,000 Pero entende que este é realmente sorprendente simple para cifrar 116 00:07:13,000 --> 00:07:16,000 se pode obter a matemática correcta. 117 00:07:16,000 --> 00:07:19,000 Todo o que é necesario é comprobar se hai ou non a letra que está mirando 118 00:07:19,000 --> 00:07:21,000 é maiúscula ou minúscula. 119 00:07:21,000 --> 00:07:24,000 >> A razón, só hai que comprobar iso e non temos para comprobar 120 00:07:24,000 --> 00:07:27,000 o caso do alfa é porque 121 00:07:27,000 --> 00:07:30,000 un personaxe é maiúscula ou se é minúscula 122 00:07:30,000 --> 00:07:33,000 entón é sempre un carácter alfabético, 123 00:07:33,000 --> 00:07:38,000 porque non ten díxitos maiúsculas e minúsculas. 124 00:07:38,000 --> 00:07:41,000 A outra cousa que facer, e iso é un pouco complicado, 125 00:07:41,000 --> 00:07:45,000 é que xa modificou o nivel César cifra fórmula 126 00:07:45,000 --> 00:07:49,000 que demos na especificación do conxunto de problemas. 127 00:07:49,000 --> 00:07:52,000 O que é diferente aquí é que nós subtraído 128 00:07:52,000 --> 00:07:58,000 na capital caso maiúsculas A, e entón nós engadimos maiúscula 129 00:07:58,000 --> 00:08:02,000 volver ao final. 130 00:08:02,000 --> 00:08:05,000 >> Sei que algúns de vostedes fixeron iso no seu código. 131 00:08:05,000 --> 00:08:09,000 Será que algún de vós o fan nas súas presentacións? 132 00:08:09,000 --> 00:08:13,000 Vostede fixo iso. Pode explicar o que isto significa, SAHB? 133 00:08:13,000 --> 00:08:18,000 Subtraindo-lo, porque fixo un mod logo, 134 00:08:18,000 --> 00:08:21,000 ten que leva-la para fóra, así que comeza maneira [tos] posición. 135 00:08:21,000 --> 00:08:25,000 E, a continuación, engadindo-lo de volta máis tarde cambiou máis o que quería. 136 00:08:25,000 --> 00:08:27,000 Si, exactamente. 137 00:08:27,000 --> 00:08:32,000 O que SAHB dixo foi que cando se quere engadir 138 00:08:32,000 --> 00:08:36,000 nosa mensaxe ea nosa clave xuntos 139 00:08:36,000 --> 00:08:42,000 e mod mod que, que por NUM_LETTERS, 140 00:08:42,000 --> 00:08:50,000 se non escalar a nosa mensaxe para o intervalo 0 a 25 apropiado primeira, 141 00:08:50,000 --> 00:08:54,000 entón pode acabar recibindo un número moi raro 142 00:08:54,000 --> 00:08:59,000 porque os valores que nós estamos mirando cando miramos mensaxe [i], 143 00:08:59,000 --> 00:09:03,000 cando miramos para o carácter i da nosa mensaxe de texto simple, 144 00:09:03,000 --> 00:09:08,000 é un valor en calquera parte desta gama de 65-122 145 00:09:08,000 --> 00:09:13,000 con base nos valores ASCII para maiúsculas da a Z en minúsculas. 146 00:09:13,000 --> 00:09:18,000 E así, cando mod-lo por 26 ou por NUM_LETTERS, 147 00:09:18,000 --> 00:09:23,000 unha vez que era o noso # define na esquina superior dereita ata aquí, 148 00:09:23,000 --> 00:09:28,000 que vai dar un valor que está na franxa de 0 a 25, 149 00:09:28,000 --> 00:09:30,000 e necesitamos un xeito de escalar entón que back-up 150 00:09:30,000 --> 00:09:32,000 e obtelo no intervalo axeitado ASCII. 151 00:09:32,000 --> 00:09:36,000 O xeito máis doado de facelo é para escalar todo para abaixo 152 00:09:36,000 --> 00:09:39,000 no intervalo entre 0 e 25 para comezar, 153 00:09:39,000 --> 00:09:43,000 e despois cambiar todo de volta no final. 154 00:09:43,000 --> 00:09:46,000 >> Outro erro común que vin a xente se é que 155 00:09:46,000 --> 00:09:50,000 se non realmente facer iso intercambio inmediato 156 00:09:50,000 --> 00:09:53,000 e engadir a mensaxe ea clave xuntos e engadila los, por exemplo, 157 00:09:53,000 --> 00:09:58,000 nunha variable char, o problema que 158 00:09:58,000 --> 00:10:01,000 é, dende mensaxe [i] é un número relativamente grande para comezar- 159 00:10:01,000 --> 00:10:05,000 Lembre que é polo menos 65 se é unha maiúscula caracteres 160 00:10:05,000 --> 00:10:09,000 se ten unha chave grande, digamos, algo así como 100, 161 00:10:09,000 --> 00:10:13,000 e engadir os dous xuntos nun char asinado está indo para obter un estourido. 162 00:10:13,000 --> 00:10:17,000 Está indo para obter un valor que é maior que 127, 163 00:10:17,000 --> 00:10:22,000 que é o maior valor que unha variable char. 164 00:10:22,000 --> 00:10:26,000 Unha vez máis, é por iso que quere facer este tipo de cousas para comezar. 165 00:10:26,000 --> 00:10:29,000 Algunhas persoas teñen en torno a ese caso, facendo unha cousa e probar 166 00:10:29,000 --> 00:10:33,000 para ver se sería estourido antes de facer iso, 167 00:10:33,000 --> 00:10:36,000 pero deste xeito queda en torno a iso. 168 00:10:36,000 --> 00:10:40,000 E entón nesta solución é impreso a corda toda a finais. 169 00:10:40,000 --> 00:10:45,000 Outras persoas impreso un personaxe de cada vez. Ambos son impresionantes. 170 00:10:45,000 --> 00:10:51,000 Neste punto, vós ten algunha dúbida, algún comentario sobre iso? 171 00:10:51,000 --> 00:10:56,000 Cousas que lle gusta, cousas que non gusta? 172 00:10:56,000 --> 00:10:58,000 >> Eu tiña unha pregunta. 173 00:10:58,000 --> 00:11:01,000 Poida que eu teña perdido durante a súa explicación, pero como é que este programa 174 00:11:01,000 --> 00:11:07,000 saltar os espazos para conectar a chave para a lonxitude do texto? 175 00:11:07,000 --> 00:11:10,000 Este é só César cifra. >> Ah, desculpe, si. 176 00:11:10,000 --> 00:11:13,000 Si, imos ver isto. 177 00:11:13,000 --> 00:11:16,000 Na cifra de César temos en torno a que, por causa 178 00:11:16,000 --> 00:11:18,000 só capotou caracteres. 179 00:11:18,000 --> 00:11:27,000 Nós só rolda se eles eran maiúsculas ou minúsculas. 180 00:11:27,000 --> 00:11:32,000 Vós me sentindo moi ben sobre iso? 181 00:11:32,000 --> 00:11:34,000 Sinto-se libre para editar esta casa, leva-la, 182 00:11:34,000 --> 00:11:37,000 comparalos-lo co que vostedes escribiron. 183 00:11:37,000 --> 00:11:42,000 En definitiva, non dubide en enviar preguntas sobre el tamén. 184 00:11:42,000 --> 00:11:46,000 E unha vez máis, entender que o obxectivo aquí co seu problema define 185 00:11:46,000 --> 00:11:50,000 non é obter vostedes para escribir código perfecto para os seus conxuntos de problemas. 186 00:11:50,000 --> 00:11:57,000 É unha experiencia de aprendizaxe. Si 187 00:11:57,000 --> 00:12:01,000 >> Voltar facelo mentres loop, se é igual nulo, 188 00:12:01,000 --> 00:12:06,000 así nula só significa nada, eles simplemente prema Intro? 189 00:12:06,000 --> 00:12:12,000 Nulo é un valor punteiro especial, 190 00:12:12,000 --> 00:12:17,000 e usan nulo cando queremos dicir 191 00:12:17,000 --> 00:12:23,000 temos unha variable punteiro que está apuntando para nada. 192 00:12:23,000 --> 00:12:28,000 E así normalmente significa que esta variable, esta variable mensaxe 193 00:12:28,000 --> 00:12:35,000 está baleiro, e aquí, porque nós estamos usando o CS50 tipo cadea especial, 194 00:12:35,000 --> 00:12:37,000 cal é o tipo de cadea CS50? 195 00:12:37,000 --> 00:12:42,000 Xa viu o que é cando David tirou o capuz na aula? 196 00:12:42,000 --> 00:12:44,000 É un funky-que é un punteiro, non? 197 00:12:44,000 --> 00:12:48,000 Ok, si. >> É un char *. 198 00:12:48,000 --> 00:12:52,000 E así realmente poderiamos substituír este 199 00:12:52,000 --> 00:12:56,000 aquí coa mensaxe de char *, 200 00:12:56,000 --> 00:13:04,000 e así a función GetString, se non pode obter unha cadea de usuario, 201 00:13:04,000 --> 00:13:08,000 non se pode analizar unha secuencia, e un caso en que non se pode analizar unha secuencia 202 00:13:08,000 --> 00:13:11,000 é o usuario escribe o carácter de fin de ficheiro, o control D, 203 00:13:11,000 --> 00:13:17,000 o que non é algo que adoita facer, pero se isto acontecer 204 00:13:17,000 --> 00:13:20,000 a continuación, a función pode voltar ese valor nulo como unha forma de dicir 205 00:13:20,000 --> 00:13:23,000 "Ei, eu non tiven unha secuencia." 206 00:13:23,000 --> 00:13:27,000 O que sucedería se nós non poñemos mensaxe = null, 207 00:13:27,000 --> 00:13:30,000 que é algo que non fixo aínda? 208 00:13:30,000 --> 00:13:32,000 Por que iso sería un problema aquí? 209 00:13:32,000 --> 00:13:38,000 Porque sei que falamos un pouco na charla sobre vazamentos de memoria. 210 00:13:38,000 --> 00:13:42,000 Si, imos facelo, e imos ver o que acontece. 211 00:13:42,000 --> 00:13:44,000 >> Cuestión Basilio foi o que pasa se nós realmente non teñen 212 00:13:44,000 --> 00:13:48,000 esta mensaxe de proba = null? 213 00:13:48,000 --> 00:13:51,000 Imos cambiar-se para arriba. 214 00:13:51,000 --> 00:13:53,000 Vostedes poden comentar isto. 215 00:13:53,000 --> 00:13:55,000 En realidade, eu vou salvalo nunha revisión. 216 00:13:55,000 --> 00:13:58,000 Este será revisión 3. 217 00:13:58,000 --> 00:14:02,000 O que ten que facer para executar este programa é que terá que facer clic nese icona de engrenaxe ata aquí, 218 00:14:02,000 --> 00:14:04,000 e vai ter que engadir un argumento para el. 219 00:14:04,000 --> 00:14:10,000 Ten que dar o argumento clave, xa que desexamos pasar un argumento de liña de comandos. 220 00:14:10,000 --> 00:14:13,000 Aquí eu vou dar-lle o número 3. Gústame 3. 221 00:14:13,000 --> 00:14:19,000 Agora o zoom cara a fóra, a execución do programa. 222 00:14:19,000 --> 00:14:24,000 Está funcionando, compilación, construíndo. 223 00:14:24,000 --> 00:14:27,000 Aquí imos nós. Está á espera de ser solicitado. 224 00:14:27,000 --> 00:14:33,000 Se eu escribir algo como Ola, onde é que isto vai? 225 00:14:33,000 --> 00:14:38,000 Oh, meu programa levou moito tempo para ser executado. Eu estaba jawing por moito tempo. 226 00:14:38,000 --> 00:14:40,000 Aquí vai. 227 00:14:40,000 --> 00:14:43,000 Agora eu escriba Olá 228 00:14:43,000 --> 00:14:46,000 Vemos que criptografía de forma adecuada. 229 00:14:46,000 --> 00:14:52,000 Agora o que pasa se non facemos GetString listo para volver nulo? 230 00:14:52,000 --> 00:14:57,000 Lembre, eu dixen que nós fixemos iso presionando o control D ao mesmo tempo. 231 00:14:57,000 --> 00:14:59,000 Vou rolar por aquí. Imos executa-lo de novo. 232 00:14:59,000 --> 00:15:01,000 Edificio. Non. 233 00:15:01,000 --> 00:15:04,000 Agora, cando eu bati o control D 234 00:15:04,000 --> 00:15:12,000 Eu teño esa liña que di opt/sandbox50/bin/run.sh, fallo de segmento. 235 00:15:12,000 --> 00:15:15,000 Vós xa viron que antes? 236 00:15:15,000 --> 00:15:17,000 >> [Estudante] Por que non hai >>-Desculpe? 237 00:15:17,000 --> 00:15:20,000 [Estudante] Por que non hai despejo de núcleo neste caso? 238 00:15:20,000 --> 00:15:26,000 O despejo de núcleo, a cuestión é por que non hai despejo de núcleo aquí? 239 00:15:26,000 --> 00:15:29,000 A cuestión é que non pode ser, pero o despejo de núcleo é un arquivo 240 00:15:29,000 --> 00:15:31,000 que queda almacenado no disco duro. 241 00:15:31,000 --> 00:15:34,000 Neste caso temos desactivado core dumps 242 00:15:34,000 --> 00:15:37,000 no servidor de execución para que nós non temos xente seg falla 243 00:15:37,000 --> 00:15:40,000 e construción de toneladas de core dumps. 244 00:15:40,000 --> 00:15:46,000 Pero pode obter un. 245 00:15:46,000 --> 00:15:48,000 Desafiuzamentos principais son o tipo de cousas que moitas veces pode desactivar, 246 00:15:48,000 --> 00:15:52,000 e ás veces fai. 247 00:15:52,000 --> 00:15:55,000 O fallo de segmentación, para responder súa pregunta, Basilio, 248 00:15:55,000 --> 00:16:00,000 está dicindo que nós tratamos acceder a un punteiro 249 00:16:00,000 --> 00:16:05,000 que non foi definido para apuntar para calquera cousa. 250 00:16:05,000 --> 00:16:09,000 Lembre-se de Binky o vídeo cando intenta Binky 251 00:16:09,000 --> 00:16:12,000 vaia acceder a un punteiro que non está a apuntar cara algo? 252 00:16:12,000 --> 00:16:16,000 Neste caso, eu creo que, tecnicamente, o punteiro está a apuntar cara algo. 253 00:16:16,000 --> 00:16:20,000 El está a apuntar cara nulo, o que é tecnicamente 0, 254 00:16:20,000 --> 00:16:25,000 pero que é definido como un segmento en que non está accesible 255 00:16:25,000 --> 00:16:28,000 polo seu programa, para obter un fallo de segmento 256 00:16:28,000 --> 00:16:31,000 porque non está accedendo a memoria que está en un segmento válido 257 00:16:31,000 --> 00:16:38,000 como o segmento de pila ou o segmento de pila ou o segmento de datos. 258 00:16:38,000 --> 00:16:40,000 Cool. 259 00:16:40,000 --> 00:16:48,000 Algunha pregunta sobre César? 260 00:16:48,000 --> 00:16:51,000 >> Imos seguir adiante. Imos ollar para Revisión 2 moi rapidamente. 261 00:16:51,000 --> 00:17:00,000 Isto é Vigenère. 262 00:17:00,000 --> 00:17:04,000 Aquí en Vigenère 263 00:17:04,000 --> 00:17:06,000 imos camiñar por este un moi rápido, porque, de novo, 264 00:17:06,000 --> 00:17:10,000 Vigenère e César son bastante semellantes. 265 00:17:10,000 --> 00:17:12,000 Comentario de cabeceira é antes, 266 00:17:12,000 --> 00:17:17,000 # Define e antes para evitar o uso deses números máxicos. 267 00:17:17,000 --> 00:17:21,000 O bo é dicir que quería cambiar a 268 00:17:21,000 --> 00:17:23,000 un alfabeto diferente, ou algo así. 269 00:17:23,000 --> 00:17:26,000 En vez de ter que ir cambiar manualmente todas as 26 no código 270 00:17:26,000 --> 00:17:30,000 podemos cambiar isto para 27 ou deixar caer 271 00:17:30,000 --> 00:17:34,000 se estivésemos usando alfabetos diferentes, linguas diferentes. 272 00:17:34,000 --> 00:17:38,000 Unha vez máis, temos esa comprobación da conta de argumento, 273 00:17:38,000 --> 00:17:42,000 e realmente ten case pode tomar isto como un modelo. 274 00:17:42,000 --> 00:17:46,000 Practicamente todos os programas que escribe debe- 275 00:17:46,000 --> 00:17:50,000 se leva de liña de comandos argumentos, algúns secuencia de liñas 276 00:17:50,000 --> 00:17:55,000 que le coma este no inicio. 277 00:17:55,000 --> 00:17:59,000 Ese é un dos tests de sanidade primeira que quere facer. 278 00:17:59,000 --> 00:18:03,000 >> Aquí o que nós fixemos foi a certeza de que 279 00:18:03,000 --> 00:18:06,000 a palabra chave era válida, e que foi a segunda verificación que nós fixemos. 280 00:18:06,000 --> 00:18:11,000 Teña en conta unha vez que estamos separados iso argc e 2. 281 00:18:11,000 --> 00:18:14,000 Nótese que, neste caso, unha cousa que tiña que facer era, en vez 282 00:18:14,000 --> 00:18:18,000 usar un ao i que queriamos para validar toda a cadea, 283 00:18:18,000 --> 00:18:21,000 e, a fin de facer o que realmente ten que ir carácter por carácter 284 00:18:21,000 --> 00:18:23,000 sobre a corda. 285 00:18:23,000 --> 00:18:29,000 Non hai ningunha boa forma de chamar algo sobre el 286 00:18:29,000 --> 00:18:31,000 porque, mesmo, por exemplo, un para i volverá 0 287 00:18:31,000 --> 00:18:37,000 non se pode analizar un número enteiro, para que nin sequera funciona. 288 00:18:37,000 --> 00:18:42,000 Unha vez máis, fermosa mensaxe dicindo ao usuario exactamente o que pasou. 289 00:18:42,000 --> 00:18:45,000 Entón, aquí, de novo, nós tamén xestionar o caso en que 290 00:18:45,000 --> 00:18:50,000 o usuario escribe un personaxe D control aleatorio. 291 00:18:50,000 --> 00:18:54,000 >> E entón, Charlotte tiña unha pregunta anterior sobre como podemos saltar espazos 292 00:18:54,000 --> 00:18:57,000 na nosa cadea aquí. 293 00:18:57,000 --> 00:19:00,000 Esta era unha especie de similar ao que fixemos co programa do MySpace 294 00:19:00,000 --> 00:19:04,000 que fixemos na sección, eo xeito en que isto funciona 295 00:19:04,000 --> 00:19:08,000 é que rastreou o número de cartas que vira. 296 00:19:08,000 --> 00:19:13,000 Mentres caminhávamos sobre a secuencia de mensaxes, como andou carácter por carácter, 297 00:19:13,000 --> 00:19:16,000 que acompañou o índice como parte do noso loop for, e entón nós tamén acompañou 298 00:19:16,000 --> 00:19:21,000 o número de letras, polo que non caracteres especiais, non díxitos, non-branco espazo 299 00:19:21,000 --> 00:19:27,000 que vira na variable independente. 300 00:19:27,000 --> 00:19:33,000 E, a continuación, esta solución modifica a clave 301 00:19:33,000 --> 00:19:41,000 para obter un enteiro real da clave, e el fai iso en tempo real, 302 00:19:41,000 --> 00:19:47,000 dereita antes que despois vai para cifrar a mensaxe real carácter. 303 00:19:47,000 --> 00:19:50,000 Existen algunhas solucións que eran perfectamente moi grande 304 00:19:50,000 --> 00:19:58,000 que modificar a clave ata o probar a validez da chave. 305 00:19:58,000 --> 00:20:01,000 Ademais de garantir que o carácter ea palabra clave 306 00:20:01,000 --> 00:20:05,000 foi un carácter alfabético tamén que virou en un número enteiro 307 00:20:05,000 --> 00:20:13,000 na franxa de 0 a 25 para, a continuación, ir ter que facer isto máis tarde neste loop. 308 00:20:13,000 --> 00:20:18,000 Unha vez máis, ve aquí é realmente exactamente o mesmo código 309 00:20:18,000 --> 00:20:22,000 que usan no Caesar neste momento. 310 00:20:22,000 --> 00:20:25,000 Está facendo exactamente a mesma cousa, entón o verdadeiro truco é descubrir 311 00:20:25,000 --> 00:20:30,000 como transformar a palabra chave en un número enteiro. 312 00:20:30,000 --> 00:20:35,000 >> Unha cousa que nós fixemos aquí, que é un pouco denso 313 00:20:35,000 --> 00:20:39,000 é que repetiu esa frase, eu creo que podería chamalo, 314 00:20:39,000 --> 00:20:45,000 3 veces separadas nas liñas 58, 59 e 61. 315 00:20:45,000 --> 00:20:52,000 Alguén pode explicar o que é exactamente esta frase fai? 316 00:20:52,000 --> 00:20:55,000 Está visitando un personaxe, como dixo. 317 00:20:55,000 --> 00:20:59,000 Si, é [inaudível] un personaxe na palabra clave, 318 00:20:59,000 --> 00:21:04,000 e por iso é visto número de letras, porque só se está movendo ao longo 319 00:21:04,000 --> 00:21:06,000 a palabra clave, unha vez que teña visto a carta, 320 00:21:06,000 --> 00:21:10,000 de xeito que vai efectivamente saltar espazos e cousas así. 321 00:21:10,000 --> 00:21:12,000 Si, exactamente. 322 00:21:12,000 --> 00:21:16,000 E entón, unha vez que viu o branco mod contrasinal que só así se mover de volta. 323 00:21:16,000 --> 00:21:18,000 Exactamente. Esta é unha explicación perfecta. 324 00:21:18,000 --> 00:21:23,000 O que Kevin dixo é que queremos índice para a palabra clave. 325 00:21:23,000 --> 00:21:28,000 Queremos chegar o carácter num_letters_seen, se quere, 326 00:21:28,000 --> 00:21:32,000 pero num_letters_seen excede a lonxitude da contrasinal, 327 00:21:32,000 --> 00:21:37,000 a nosa forma de volver á pista apropiada que usar o operador mod 328 00:21:37,000 --> 00:21:40,000 efectivamente contorno. 329 00:21:40,000 --> 00:21:43,000 Por exemplo, como a curto, a nosa palabra clave é Bacon, 330 00:21:43,000 --> 00:21:46,000 e 5 letras. 331 00:21:46,000 --> 00:21:50,000 Pero vimos seis letras do noso texto simple neste momento 332 00:21:50,000 --> 00:21:52,000 e cifrada 6. 333 00:21:52,000 --> 00:21:57,000 Imos acabar acceder ao num_letters_seen, 334 00:21:57,000 --> 00:22:00,000 que é de 6, mod a lonxitude da contrasinal, 5, 335 00:22:00,000 --> 00:22:04,000 e así imos conseguir un, e así que nós imos facer é que imos 336 00:22:04,000 --> 00:22:14,000 acceso ó interior do noso primeiro personaxe contrasinal nese punto. 337 00:22:14,000 --> 00:22:21,000 >> Todo ben, todas as preguntas sobre Vigenère 338 00:22:21,000 --> 00:22:26,000 antes de seguir adiante? 339 00:22:26,000 --> 00:22:31,000 Vós me sentindo moi ben sobre iso? 340 00:22:31,000 --> 00:22:35,000 Legal, gran. 341 00:22:35,000 --> 00:22:38,000 Eu quero estar seguro de que vostedes están tendo a oportunidade de ver o código 342 00:22:38,000 --> 00:22:48,000 que pensa que está bo e ten a oportunidade de aprender con el. 343 00:22:48,000 --> 00:22:53,000 Esta vai ser a última vez que vou estar usando os espazos para o momento, 344 00:22:53,000 --> 00:22:59,000 e nós imos facer a transición agora, e eu estou indo a ir a cs50.net/lectures 345 00:22:59,000 --> 00:23:06,000 para que poidamos facer un pouco de análise quiz. 346 00:23:06,000 --> 00:23:10,000 A mellor forma que eu creo que para comezar a facer probas revisión 347 00:23:10,000 --> 00:23:15,000 é vir a esta páxina Conferencias, cs50.net/lectures, 348 00:23:15,000 --> 00:23:20,000 e debaixo de cada unha das rúbricas semanas, entón se eu ollar aquí na Semana 0, 349 00:23:20,000 --> 00:23:27,000 Vexo que temos unha lista de temas que cobren a Semana 0. 350 00:23:27,000 --> 00:23:31,000 >> Se calquera destes temas parece estraño para ti 351 00:23:31,000 --> 00:23:34,000 definitivamente vai querer volver e percorre as notas de clase e, posiblemente, 352 00:23:34,000 --> 00:23:39,000 mesmo follas as conferencias, ve-los de novo se queres 353 00:23:39,000 --> 00:23:44,000 para ter unha idea do que está a suceder con cada un destes temas. 354 00:23:44,000 --> 00:23:49,000 Direi aínda este ano, un dos recursos legais que temos 355 00:23:49,000 --> 00:23:55,000 e destes shorts que creamos, e se ollar a Semana 0, 356 00:23:55,000 --> 00:24:00,000 non temos todos os temas, pero temos un bo número deles, 357 00:24:00,000 --> 00:24:03,000 algunhas das máis complicadas, entón asistir estes shorts de novo 358 00:24:03,000 --> 00:24:08,000 é unha boa forma para chegar ata a velocidade. 359 00:24:08,000 --> 00:24:15,000 En particular, eu vou poñer unha ficha para o 3 na parte inferior, unha vez que eu fixen aqueles. 360 00:24:15,000 --> 00:24:20,000 Pero se está loitando co binario, bits, hex, este tipo de cousas, 361 00:24:20,000 --> 00:24:22,000 binario é un gran lugar para comezar. 362 00:24:22,000 --> 00:24:25,000 ASCII é outro que é bo para ver tamén. 363 00:24:25,000 --> 00:24:31,000 Podes incluso ver-me na velocidade 1.5x se eu estou indo moi devagar para ti. 364 00:24:31,000 --> 00:24:35,000 Desde a súa revisión, Sinto-se libre para facelo. 365 00:24:35,000 --> 00:24:40,000 >> Só para comezar moi rapidamente, nós imos pasar por unha parella destes problemas do quiz 366 00:24:40,000 --> 00:24:44,000 só para axiña churn a través destes. 367 00:24:44,000 --> 00:24:50,000 Por exemplo, imos ollar para 16 problema que eu teño aquí enriba da placa. 368 00:24:50,000 --> 00:24:54,000 Temos a seguinte cálculo en binario, 369 00:24:54,000 --> 00:24:56,000 e queremos mostrar calquera traballo. 370 00:24:56,000 --> 00:24:59,000 Ok, eu vou dar a este un tiro. 371 00:24:59,000 --> 00:25:01,000 Vostedes deben seguir xunto co papel, 372 00:25:01,000 --> 00:25:04,000 e nós imos facelo moi rapidamente. 373 00:25:04,000 --> 00:25:06,000 Queremos facer o seguinte cálculo en binario. 374 00:25:06,000 --> 00:25:16,000 Eu teño 00110010. 375 00:25:16,000 --> 00:25:27,000 E eu estou indo para engadir a el 00110010. 376 00:25:27,000 --> 00:25:30,000 Para as matemáticas xenios acompañando na casa, 377 00:25:30,000 --> 00:25:35,000 esta é realmente multiplicar por 2. 378 00:25:35,000 --> 00:25:37,000 Imos comezar. 379 00:25:37,000 --> 00:25:39,000 Nós imos seguir o algoritmo diso mesmo que nós facemos 380 00:25:39,000 --> 00:25:43,000 cando engadimos números decimais xuntos. 381 00:25:43,000 --> 00:25:46,000 Realmente a única diferenza aquí é que nós loop de volta en torno a 382 00:25:46,000 --> 00:25:51,000 Unha vez que temos 1 + 1 no canto de unha vez estivemos con 10. 383 00:25:51,000 --> 00:25:53,000 >> Se comezar a partir da dereita, moi rapidamente, o que é o primeiro díxito? 384 00:25:53,000 --> 00:25:55,000 [Estudante] 0. >> [Nate H.] 0. 385 00:25:55,000 --> 00:25:58,000 Grande, o segundo díxito? 386 00:25:58,000 --> 00:26:00,000 [Estudante] 1. 387 00:26:00,000 --> 00:26:02,000 [Nate H.] É un 1? 1 + 1 é? 388 00:26:02,000 --> 00:26:04,000 [Estudante] 10. 389 00:26:04,000 --> 00:26:08,000 [Nate H.] Exactamente, entón o que é o díxito que eu escriba debaixo os 2 engadidos xuntos? 390 00:26:08,000 --> 00:26:11,000 [Estudante] 1, 0 ou 0 e, a continuación, levar o 1. 391 00:26:11,000 --> 00:26:15,000 [Nate H.] 0 e levar a 1, exactamente. 392 00:26:15,000 --> 00:26:18,000 A continuación un up, Basil, está por riba. 393 00:26:18,000 --> 00:26:20,000 Cal é o terceiro? >> [Basil] 1. 394 00:26:20,000 --> 00:26:23,000 [Nate H.] 1, perfecto. Kevin? 395 00:26:23,000 --> 00:26:27,000 [Kevin] 0. >> [Nate H.] 0, Charlotte? 396 00:26:27,000 --> 00:26:30,000 [Charlotte] 0. >> [Nate H.] Si, eo que fago? 397 00:26:30,000 --> 00:26:32,000 [Alumno] O 1. 398 00:26:32,000 --> 00:26:34,000 [Nate H.] E o que fago? E entón eu leva a 1. 399 00:26:34,000 --> 00:26:36,000 Perfecto, SAHB? >> [SAHB] Agora tes un. 400 00:26:36,000 --> 00:26:40,000 [Nate H.] E fago algo aquí? 401 00:26:40,000 --> 00:26:43,000 [SAHB] Entón, a próxima que ten un porque transitadas 1. 402 00:26:43,000 --> 00:26:49,000 [Nate H.] Gran, entón aquí podemos remata-lo. 403 00:26:49,000 --> 00:26:51,000 Cool. 404 00:26:51,000 --> 00:26:54,000 [Estudante] O 0 + 0 = 0? 405 00:26:54,000 --> 00:26:56,000 0 + 0 = 0. 406 00:26:56,000 --> 00:27:01,000 1 + 1, como dixen, é de 10, ou 1, 0, si. 407 00:27:01,000 --> 00:27:07,000 10 é un equívoco, porque para min 10 significa o número 10, 408 00:27:07,000 --> 00:27:12,000 e é a peculiaridade de como estamos representando o cando estamos escribindo. 409 00:27:12,000 --> 00:27:20,000 Nós representar o número 2, por 1, 0, eo número 10 é un pouco diferente. 410 00:27:20,000 --> 00:27:23,000 >> O que é unha especie de bo sobre o binario é que non hai realmente que moitos 411 00:27:23,000 --> 00:27:25,000 casos, ten que aprender. 412 00:27:25,000 --> 00:27:30,000 Hai 0 + 0 = 0, 0 + 1 = 1, 413 00:27:30,000 --> 00:27:34,000 1 + 1 é 0, e, a continuación, subir un 1, 414 00:27:34,000 --> 00:27:37,000 e entón podes ver aquí na terceira columna da dereita 415 00:27:37,000 --> 00:27:40,000 tivemos este 1, 1 e 1. 416 00:27:40,000 --> 00:27:43,000 E 1 + 1 + 1 é un 1, 417 00:27:43,000 --> 00:27:45,000 e leva outro 1. 418 00:27:45,000 --> 00:27:48,000 Cando está facendo a suma binaria, moi sinxelo. 419 00:27:48,000 --> 00:27:51,000 Eu faría unha parella máis destes para verificar a sanidade vós 420 00:27:51,000 --> 00:27:54,000 antes de ir porque este é 421 00:27:54,000 --> 00:28:00,000 probablemente algo que veremos no cuestionario. 422 00:28:00,000 --> 00:28:03,000 Agora imos facer este próximo tamén. 423 00:28:03,000 --> 00:28:06,000 Imos facer 17 problema. 424 00:28:06,000 --> 00:28:12,000 Estamos indo para converter o seguinte número binario para decimal. 425 00:28:12,000 --> 00:28:28,000 Eu teño 10100111001. 426 00:28:28,000 --> 00:28:33,000 Teña en conta que no vídeo binario que eu fixen 427 00:28:33,000 --> 00:28:36,000 Eu andei por un par de exemplos, e mostre como 428 00:28:36,000 --> 00:28:41,000 todo funciona cando está facendo iso en decimal. 429 00:28:41,000 --> 00:28:45,000 Cando se está a traballar en representación decimal Creo que estamos 430 00:28:45,000 --> 00:28:48,000 Actualmente na nosa vida tan fluente en que 431 00:28:48,000 --> 00:28:53,000 é moi doado para encubrir a mecánica de como realmente funciona. 432 00:28:53,000 --> 00:28:59,000 >> Pero para facer unha rápida recapitulação, se eu tivera o número 137 433 00:28:59,000 --> 00:29:06,000 iso realmente significa e de novo, é dicir, en representación decimal- 434 00:29:06,000 --> 00:29:19,000 o número 137 en decimal significa que teño 1 x 100 + 3 x 10 + 7 x 1. 435 00:29:19,000 --> 00:29:22,000 Isto todo é permanecer na pantalla. 436 00:29:22,000 --> 00:29:29,000 E entón, se ollar para eses números aquí, 437 00:29:29,000 --> 00:29:34,000 100, 10 e 1, ve que son realmente as potencias de 10. 438 00:29:34,000 --> 00:29:43,000 Eu teño 10 ², 10 ¹, e 10 para o cero. 439 00:29:43,000 --> 00:29:48,000 Temos un tipo semellante de cousas en binario, 440 00:29:48,000 --> 00:29:55,000 agás que a nosa base, como o chamamos, é 2 en vez de 10. 441 00:29:55,000 --> 00:29:58,000 Estes 10s que escribín aquí no fondo, 442 00:29:58,000 --> 00:30:02,000 este ² 10, 10 ¹, 10 ao cero, 10 é a nosa base, 443 00:30:02,000 --> 00:30:08,000 eo expoñente, 0, 1 ou 2, 444 00:30:08,000 --> 00:30:14,000 está implícita a posición do díxito do número que escribir. 445 00:30:14,000 --> 00:30:21,000 1, miramos para el, este 1 está na posición 2. 446 00:30:21,000 --> 00:30:27,000 A 3 está en posición 1, e o 7 está na posición 0. 447 00:30:27,000 --> 00:30:35,000 É así que temos os distintos expoñentes abaixo das nosas bases. 448 00:30:35,000 --> 00:30:40,000 >> Tras todo isto we'll-en realidade, vostede sabe o que? 449 00:30:40,000 --> 00:30:43,000 Nós imos facer, onde fixen o meu botón desfacer ir? 450 00:30:43,000 --> 00:30:45,000 Non. 451 00:30:45,000 --> 00:30:47,000 Eu amo este desfacer cousa. 452 00:30:47,000 --> 00:30:51,000 Tras iso, eu creo que para min polo menos, 453 00:30:51,000 --> 00:30:54,000 o xeito máis doado para comezar a converter un número binario 454 00:30:54,000 --> 00:30:57,000 ou un número hexadecimal onde a base é 16 455 00:30:57,000 --> 00:31:02,000 e non 10 ou 2 é ir adiante e escribir 456 00:31:02,000 --> 00:31:09,000 as bases e expoentes para o conxunto de números no meu número binario, na parte superior. 457 00:31:09,000 --> 00:31:14,000 Se comezar a partir de esquerda a dereita de novo, 458 00:31:14,000 --> 00:31:17,000 que é unha especie de contra-intuitivo, 459 00:31:17,000 --> 00:31:23,000 Eu vou cambiar de volta para o negro aquí, temos a 2 a posición 0, 460 00:31:23,000 --> 00:31:27,000 e entón temos 2 ¹, 2 ², 461 00:31:27,000 --> 00:31:33,000 e, a continuación, 2 para a 3, 2 a 4, 2 a 5, 6, 462 00:31:33,000 --> 00:31:39,000 7, 8, 9, e 10. 463 00:31:39,000 --> 00:31:41,000 Estes números que escribín para fóra son todos os expoñentes. 464 00:31:41,000 --> 00:31:48,000 Eu só escribín as bases aquí no 3 primeiro só para o espazo. 465 00:31:48,000 --> 00:31:50,000 >> Neste momento eu estou indo a ir adiante e eu estou indo realmente para borrar 466 00:31:50,000 --> 00:31:53,000 as cousas que fixemos en decimal, se está todo ben. 467 00:31:53,000 --> 00:31:57,000 Vós todos teñen iso. 468 00:31:57,000 --> 00:32:05,000 Aqueles de vós asistir online eu estou seguro que será capaz de volver-me se queres. 469 00:32:05,000 --> 00:32:07,000 De volver para a pluma. 470 00:32:07,000 --> 00:32:12,000 Agora, o que podemos facer, se vostedes non son totalmente ata a velocidade nos seus poderes de 2, 471 00:32:12,000 --> 00:32:15,000 que é totalmente legal. 472 00:32:15,000 --> 00:32:18,000 Acontece. Eu entendo. 473 00:32:18,000 --> 00:32:23,000 Unha vez eu tiven unha entrevista de emprego onde me foi dito que eu debería saber todas as potencias de 2 474 00:32:23,000 --> 00:32:26,000 A través de 2 a 30. 475 00:32:26,000 --> 00:32:29,000 Non era un traballo que eu teño. 476 00:32:29,000 --> 00:32:32,000 De calquera forma, podedes ir adiante e facer as contas aquí, 477 00:32:32,000 --> 00:32:35,000 pero co binario que non fai moito sentido, 478 00:32:35,000 --> 00:32:38,000 e nin ten sentido con decimal ou hexadecimal, ou 479 00:32:38,000 --> 00:32:43,000 a facer as contas para onde ten ceros. 480 00:32:43,000 --> 00:32:49,000 Podes ver que eu teño 0 aquí, un 0 aquí, 0 aquí, 0 aquí, 0 aquí, 0 aquí. 481 00:32:49,000 --> 00:32:52,000 Por que non ten sentido facer as matemáticas real 482 00:32:52,000 --> 00:32:56,000 para calcular a potencia adecuada, de 2 para esa posición? 483 00:32:56,000 --> 00:32:59,000 Precisamente, como Charlotte dixo, será 0. 484 00:32:59,000 --> 00:33:05,000 Podería moi ben salvar a época calcular potencias de 2 non é o seu forte. 485 00:33:05,000 --> 00:33:10,000 Neste caso, só necesitamos calculalas para 2 a 0, o que é-? 486 00:33:10,000 --> 00:33:12,000 [Estudante] 1. 487 00:33:12,000 --> 00:33:14,000 [Nate H.] 1, 2 e 3, que é a? 488 00:33:14,000 --> 00:33:16,000 [Estudante] 8. >> [Nate H.] 8. 489 00:33:16,000 --> 00:33:18,000 2 a 4? 490 00:33:18,000 --> 00:33:21,000 [Estudante] 2. Sinto moito, 1. 491 00:33:21,000 --> 00:33:26,000 [Nate H.] 2 a 4 e 16, exactamente. 492 00:33:26,000 --> 00:33:28,000 2 a 5, Kevin? >> 32. 493 00:33:28,000 --> 00:33:32,000 [Nate H.] 32, 2 a 8? 494 00:33:32,000 --> 00:33:38,000 [Estudante] 32 x 8, 256. 495 00:33:38,000 --> 00:33:41,000 [Nate H.] Perfecto. 496 00:33:41,000 --> 00:33:43,000 E 2 para o 10? 497 00:33:43,000 --> 00:33:45,000 [Estudante] 1024. 498 00:33:45,000 --> 00:33:49,000 [Nate H.] Si, 1024. 499 00:33:49,000 --> 00:33:57,000 >> Unha vez que temos estes números podemos sumar todos eles. 500 00:33:57,000 --> 00:34:01,000 E é aquí que é realmente importante para facer un par de cousas. 501 00:34:01,000 --> 00:34:07,000 Unha delas é ir amodo e comprobar o seu traballo. 502 00:34:07,000 --> 00:34:10,000 Pode dicir que hai un 1 a finais deste número, 503 00:34:10,000 --> 00:34:15,000 entón eu debería estar sempre un número impar como o meu resultado, 504 00:34:15,000 --> 00:34:18,000 porque todos os outros van ser aínda números 505 00:34:18,000 --> 00:34:21,000 dado que é un número binario. 506 00:34:21,000 --> 00:34:24,000 A outra cousa a facer é chegar a este punto a proba 507 00:34:24,000 --> 00:34:27,000 e escribiu chegar ata este punto 508 00:34:27,000 --> 00:34:30,000 e está correndo contra o tempo 509 00:34:30,000 --> 00:34:33,000 mirar para o número de puntos que o problema paga a pena. 510 00:34:33,000 --> 00:34:40,000 Este problema, como podes ver, se eu virar de volta para o meu portátil moi rapidamente- 511 00:34:40,000 --> 00:34:44,000 este problema val 2 puntos, de xeito que este non é o tipo de adición 512 00:34:44,000 --> 00:34:47,000 ten que estar pasando, se realmente está presionado polo tempo. 513 00:34:47,000 --> 00:34:52,000 Pero imos volver para o iPad, e nós imos pasar por iso moi rapidamente. 514 00:34:52,000 --> 00:34:54,000 >> Eu gusto de facer os pequenos números primeira 515 00:34:54,000 --> 00:34:56,000 porque eu creo que máis sinxelo. 516 00:34:56,000 --> 00:35:00,000 Eu gusto de 32 e 8, porque eles van xuntos moi facilmente, e nós temos 50. 517 00:35:00,000 --> 00:35:03,000 16 e 1 recibe 17. 518 00:35:03,000 --> 00:35:05,000 Non temos 57, 519 00:35:05,000 --> 00:35:14,000 e despois podemos facer o resto deste, para que poidamos facer 57, 156. 520 00:35:14,000 --> 00:35:16,000 Imos. 521 00:35:16,000 --> 00:35:19,000 Home, así, imos ver. 522 00:35:19,000 --> 00:35:27,000 Tivemos 57, 256 e 1024. 523 00:35:27,000 --> 00:35:31,000 Neste punto, eu prefiro pasar. 524 00:35:31,000 --> 00:35:35,000 Eu non teño idea. Eu claramente precisa ler sobre iso. 525 00:35:35,000 --> 00:35:40,000 7, 6, e 4, obtén 17. 526 00:35:40,000 --> 00:35:42,000 1, 5, 5, 2, 13. 527 00:35:42,000 --> 00:35:45,000 Entón, temos tres, e entón nós comezamos 1. 528 00:35:45,000 --> 00:35:52,000 1337. 529 00:35:52,000 --> 00:35:55,000 Ovo de Pascua, alguén? 530 00:35:55,000 --> 00:35:59,000 Calquera persoa recoñecer ese número? 531 00:35:59,000 --> 00:36:02,000 Chris recoñece o número. O que significa, Chris? 532 00:36:02,000 --> 00:36:04,000 [Chris] leet. 533 00:36:04,000 --> 00:36:11,000 Leet, por iso, se ollar para iso, parece que leet. 534 00:36:11,000 --> 00:36:15,000 Material hacker. Coidado con este tipo de cousas no medio termo, ou a proba, mellor dito. 535 00:36:15,000 --> 00:36:19,000 Se ves este tipo de cousas e está a se pregunta "Huh", 536 00:36:19,000 --> 00:36:22,000 que realmente pode significar algo. 537 00:36:22,000 --> 00:36:24,000 Eu non sei. David gusta de poñelas dentro 538 00:36:24,000 --> 00:36:26,000 É unha boa forma de sanidade comprobar. 539 00:36:26,000 --> 00:36:30,000 Como ben, podo ver o que está a suceder. 540 00:36:30,000 --> 00:36:34,000 >> Iso é unha cousa Semana 0/Week. 541 00:36:34,000 --> 00:36:39,000 Volver para o noso portátil agora, 542 00:36:39,000 --> 00:36:46,000 diminuír o zoom, e un par de outras cousas. 543 00:36:46,000 --> 00:36:50,000 Hai ASCII, que temos benvida a facer unha chea de cos conxuntos de problemas. 544 00:36:50,000 --> 00:36:55,000 Esta noción de capital A. ¿Que é iso mesmo? 545 00:36:55,000 --> 00:36:57,000 Sabendo que é o enteiro decimal. 546 00:36:57,000 --> 00:37:00,000 65 é o que está mapeado para a táboa ASCII, 547 00:37:00,000 --> 00:37:03,000 e que é, por tanto, como o computador, escribe el, 548 00:37:03,000 --> 00:37:06,000 e é así que temos que chegou a fuxir con escribindo 549 00:37:06,000 --> 00:37:09,000 O personaxe da capital e do carácter letras minúsculas da 550 00:37:09,000 --> 00:37:14,000 nalgunhas desas solucións e conxuntos de problemas que ten feito. 551 00:37:14,000 --> 00:37:16,000 A par de outras cousas. 552 00:37:16,000 --> 00:37:25,000 Temos declaracións, expresións booleanas, condicións, loops, variables e segmentos. 553 00:37:25,000 --> 00:37:29,000 >> Aqueles todo parece facer sentido para a maioría? 554 00:37:29,000 --> 00:37:35,000 Parte desa terminoloxía é un pouco descolada, ás veces. 555 00:37:35,000 --> 00:37:46,000 Eu gusto de pensar unha declaración como a maior parte algo que remata cun punto e coma. 556 00:37:46,000 --> 00:37:51,000 Declaracións como x = 7, que define unha variable, 557 00:37:51,000 --> 00:37:54,000 presuntamente chamado x = 7. 558 00:37:54,000 --> 00:38:01,000 Presuntamente x tamén é un tipo que pode almacenar o número 7, 559 00:38:01,000 --> 00:38:05,000 por iso é un int ou posiblemente unha boia ou un curto ou un char, 560 00:38:05,000 --> 00:38:07,000 algo así. 561 00:38:07,000 --> 00:38:12,000 Unha expresión booleana está a usar estes dous iguais 562 00:38:12,000 --> 00:38:17,000 eo estrondo igual ou non é igual, menor que, maior que, 563 00:38:17,000 --> 00:38:22,000 inferior ou igual a, todo tipo de cousas. 564 00:38:22,000 --> 00:38:28,000 Condicións entón son declaracións, outro lugar. 565 00:38:28,000 --> 00:38:32,000 Quere lembrar que non pode ter unha persoa sen un correspondente se. 566 00:38:32,000 --> 00:38:37,000 Do mesmo xeito, non pode ter unha persoa sen un correspondente se. 567 00:38:37,000 --> 00:38:40,000 Loops, recordar os tres tipos de loops estamos martelé en ti 568 00:38:40,000 --> 00:38:43,000 para o último par de seccións e conxuntos de problemas. 569 00:38:43,000 --> 00:38:46,000 Usando que cando, cando está a recibir entrada do usuario, 570 00:38:46,000 --> 00:38:51,000 usando while ata que unha determinada condición é verdadeira, 571 00:38:51,000 --> 00:38:56,000 e en seguida, usando os loops se precisa 572 00:38:56,000 --> 00:39:01,000 saber cal iteração do loop que está no momento é como eu penso sobre iso. 573 00:39:01,000 --> 00:39:07,000 Ou, se está facendo un para cada personaxe dunha serie que quero facer algo, 574 00:39:07,000 --> 00:39:15,000 para cada elemento nunha matriz que quero facer algo para ese elemento. 575 00:39:15,000 --> 00:39:18,000 >> Temas e eventos. 576 00:39:18,000 --> 00:39:21,000 Estes non cobren de forma tan explícita en C, 577 00:39:21,000 --> 00:39:23,000 pero lembre se este a partir de cero. 578 00:39:23,000 --> 00:39:26,000 Esta é a noción de guións diferentes. 579 00:39:26,000 --> 00:39:32,000 Esta é tamén a noción de transmitir un evento. 580 00:39:32,000 --> 00:39:37,000 Algunhas persoas non utiliza a transmisión dos seus proxectos, inicialmente, 581 00:39:37,000 --> 00:39:40,000 que é totalmente legal, 582 00:39:40,000 --> 00:39:46,000 pero estas son dúas formas diferentes de tratar con esta cuestión maior chamados de competencia, 583 00:39:46,000 --> 00:39:49,000 que é como comeza a executar programas 584 00:39:49,000 --> 00:39:54,000 ou aparentemente executar ó mesmo tempo? 585 00:39:54,000 --> 00:39:59,000 Distintas tarefas en execución, mentres outras tarefas tamén están en execución. 586 00:39:59,000 --> 00:40:01,000 Esta é a forma como o seu sistema operativo parece funcionar. 587 00:40:01,000 --> 00:40:04,000 É por iso que, aínda que, por exemplo, 588 00:40:04,000 --> 00:40:10,000 Eu teño o meu navegador rodando, eu tamén podo conectar Spotify e tocar unha música. 589 00:40:10,000 --> 00:40:14,000 Isto é unha cousa conceptual para entender. 590 00:40:14,000 --> 00:40:17,000 Quere ter un ollar para os fíos curtos 591 00:40:17,000 --> 00:40:21,000 Se queres saber máis sobre iso. 592 00:40:21,000 --> 00:40:26,000 >> Imos ver, creo que podería ser 593 00:40:26,000 --> 00:40:31,000 un problema sobre iso nun deses. 594 00:40:31,000 --> 00:40:35,000 Unha vez máis, creo que temas e eventos non son algo que iremos cubrir en C 595 00:40:35,000 --> 00:40:41,000 só porque é moito máis difícil do que en scratch. 596 00:40:41,000 --> 00:40:44,000 Non debe preocuparse con iso alí, pero sempre entender os conceptos, 597 00:40:44,000 --> 00:40:47,000 entender o que está a suceder. 598 00:40:47,000 --> 00:40:52,000 Antes de seguir adiante, calquera dúbida sobre Semana 0 materiais? 599 00:40:52,000 --> 00:40:55,000 Todo o mundo sentindo moi ben? 600 00:40:55,000 --> 00:41:03,000 Variables comprensión e que é unha variable? 601 00:41:03,000 --> 00:41:08,000 >> Seguindo adiante. 1 semana. 602 00:41:08,000 --> 00:41:12,000 Un par de cousas aquí que non foron especialmente visados 603 00:41:12,000 --> 00:41:21,000 na revisión cuestionario necesariamente e tamén cousas máis conceptuais para pensar. 604 00:41:21,000 --> 00:41:30,000 A primeira é a noción de que fonte, compiladores e código obxecto son. 605 00:41:30,000 --> 00:41:32,000 Alguén? Basil. 606 00:41:32,000 --> 00:41:37,000 É obxecto de código, quero dicir código fonte é o que poñer bumbum, 607 00:41:37,000 --> 00:41:42,000 e código obxecto é o bumbum pon para fóra para que o ordenador poida ler o programa. 608 00:41:42,000 --> 00:41:44,000 Exactamente. 609 00:41:44,000 --> 00:41:47,000 O código fonte é o código C que realmente escribir. 610 00:41:47,000 --> 00:41:50,000 Código obxecto é o que sae de bumbum. 611 00:41:50,000 --> 00:41:54,000 É a 0s e 1s en que formato binario. 612 00:41:54,000 --> 00:41:59,000 Entón, o que pasa é que cando ten unha morea de arquivos de obxecto, 613 00:41:59,000 --> 00:42:04,000 dicir que está compilando un proxecto ou un programa que usa varios arquivos de código fonte, 614 00:42:04,000 --> 00:42:09,000 que, por convención teñen a extensión de arquivo. c. 615 00:42:09,000 --> 00:42:13,000 É por iso que temos caesar.c, vigenère.c. 616 00:42:13,000 --> 00:42:18,000 Se está escribindo programas en Java que darlles a extensión. Java. 617 00:42:18,000 --> 00:42:24,000 Programas en Python teñen a extensión. Aa frecuencia. 618 00:42:24,000 --> 00:42:26,000 >> Unha vez que ten varios ficheiros. C, recompila-los. 619 00:42:26,000 --> 00:42:29,000 Clang cospe todo ese lixo binario. 620 00:42:29,000 --> 00:42:33,000 Entón, porque só quere un programa 621 00:42:33,000 --> 00:42:37,000 tes o enlace de conexión de todos estes arquivos obxecto xuntos 622 00:42:37,000 --> 00:42:40,000 nun arquivo executable. 623 00:42:40,000 --> 00:42:45,000 Este é tamén o que ocorre cando usa a biblioteca CS50, por exemplo. 624 00:42:45,000 --> 00:42:50,000 A biblioteca CS50 é tanto iso. H ficheiro de cabeceira 625 00:42:50,000 --> 00:42:53,000 que leu, que # includecs50.h. 626 00:42:53,000 --> 00:42:58,000 E entón é tamén un arquivo de biblioteca particular binario 627 00:42:58,000 --> 00:43:02,000 que foi compilado que é 0s e 1s, 628 00:43:02,000 --> 00:43:08,000 e que a L-bandeira, por iso, se volvemos aos nosos espazos e estamos moi rapidamente 629 00:43:08,000 --> 00:43:11,000 o que está pasando aquí, cando miramos para o noso comando bumbum, 630 00:43:11,000 --> 00:43:15,000 o que temos e este é o noso arquivo de código fonte aquí. 631 00:43:15,000 --> 00:43:18,000 Estes son unha banda de sinalizados de compilador. 632 00:43:18,000 --> 00:43:22,000 E entón, ao final, estes elo l-bandeiras en 633 00:43:22,000 --> 00:43:30,000 os ficheiros binarios reais para estas dúas bibliotecas, biblioteca CS50 e, a continuación, a biblioteca de matemáticas. 634 00:43:30,000 --> 00:43:35,000 >> Entender cada tipo de finalidade arquivos ' 635 00:43:35,000 --> 00:43:38,000 no proceso de compilación é algo que vai querer ser capaz de 636 00:43:38,000 --> 00:43:43,000 dar, polo menos, un nivel elevado de visión. 637 00:43:43,000 --> 00:43:46,000 Código fonte vén dentro do código obxecto sae. 638 00:43:46,000 --> 00:43:53,000 Arquivos de código obxecto vincular xuntos, e recibe un arquivo, bonito executable. 639 00:43:53,000 --> 00:43:55,000 Cool. 640 00:43:55,000 --> 00:43:58,000 Esta é tamén onde pode obter erros en varios puntos 641 00:43:58,000 --> 00:44:00,000 no proceso de compilación. 642 00:44:00,000 --> 00:44:04,000 Este é o lugar onde, por exemplo, se aproveitar esa bandeira conexión, 643 00:44:04,000 --> 00:44:10,000 a bandeira CS50, e omitir-lo en espazos ou cando está executando o seu código, 644 00:44:10,000 --> 00:44:13,000 este é o lugar onde vai ter un erro na fase de vinculación, 645 00:44:13,000 --> 00:44:18,000 eo vinculador vai dicir: "Ei, chamou un GetString función 646 00:44:18,000 --> 00:44:20,000 que está na biblioteca CS50 ". 647 00:44:20,000 --> 00:44:25,000 "Vostede me dixo que estaba na biblioteca CS50, e eu non podo atopar o código para el." 648 00:44:25,000 --> 00:44:28,000 É aí onde ten que conectar-lo, e que está separado 649 00:44:28,000 --> 00:44:33,000 a partir de un erro do compilador porque o compilador está mirando sintaxe e ese tipo de cousas. 650 00:44:33,000 --> 00:44:38,000 É bo saber o que está a suceder cando. 651 00:44:38,000 --> 00:44:42,000 >> Outras cousas a coñecer. 652 00:44:42,000 --> 00:44:49,000 Eu diría que definitivamente quero ter un ollar para o curto no typecasting feito por Jordan 653 00:44:49,000 --> 00:44:55,000 para entender o que ints están baixo o capó, 654 00:44:55,000 --> 00:44:58,000 o que chars están baixo o capó. 655 00:44:58,000 --> 00:45:02,000 Cando falamos en ASCII e nós realmente ollar para a táboa ASCII, 656 00:45:02,000 --> 00:45:07,000 o que está facendo é dando-nos unha mirada baixo o capo 657 00:45:07,000 --> 00:45:13,000 a forma na que o ordenador realmente representa o capital A e 7 díxitos 658 00:45:13,000 --> 00:45:17,000 e unha coma e un punto de interrogação. 659 00:45:17,000 --> 00:45:20,000 O ordenador tamén formas especiais para representar 660 00:45:20,000 --> 00:45:23,000 o número 7 como un enteiro. 661 00:45:23,000 --> 00:45:27,000 El ten un xeito especial para representar o número 7 como un número de coma flotante, 662 00:45:27,000 --> 00:45:29,000 e aqueles que son moi diferentes. 663 00:45:29,000 --> 00:45:32,000 Typecasting é como dicir ao ordenador "Ola, eu quero que converter 664 00:45:32,000 --> 00:45:37,000 a partir dunha representación a outra representación ". 665 00:45:37,000 --> 00:45:40,000 Por que non imos dar un ollo niso. 666 00:45:40,000 --> 00:45:44,000 >> Tamén quere dar un ollo a curto en bibliotecas e en curto compiladores. 667 00:45:44,000 --> 00:45:47,000 Os falar sobre o proceso de compilación, 668 00:45:47,000 --> 00:45:53,000 que é unha biblioteca, e pasar por riba de algunhas desas preguntas que pode se preguntas. 669 00:45:53,000 --> 00:45:55,000 Preguntas sobre o material Semana 1? 670 00:45:55,000 --> 00:46:03,000 Hai algún tema aquí que parecen asustado que desexa cubrir? 671 00:46:03,000 --> 00:46:07,000 Estou tentando explotar na maioría destes temas anteriores, para que poidamos chegar a 672 00:46:07,000 --> 00:46:13,000 punteiros e facer un pouco de recursão. 673 00:46:13,000 --> 00:46:15,000 Pensamentos? 674 00:46:15,000 --> 00:46:19,000 Calquera cousa para cubrir? 675 00:46:19,000 --> 00:46:21,000 Tempo para un pouco de chocolate, quizais? 676 00:46:21,000 --> 00:46:23,000 Vostedes están a traballar con el. 677 00:46:23,000 --> 00:46:26,000 Vou continuar a beber o meu café. 678 00:46:26,000 --> 00:46:31,000 Semana 2. 679 00:46:31,000 --> 00:46:34,000 Boa chamada, boa chamada. 680 00:46:34,000 --> 00:46:38,000 Na 2 ª semana falamos un pouco máis sobre funcións. 681 00:46:38,000 --> 00:46:43,000 >> Os primeiros xogos de problemas poucas que realmente non escribir ningunha función en todo 682 00:46:43,000 --> 00:46:45,000 diferente do que función? 683 00:46:45,000 --> 00:46:47,000 [Estudante] principal. >> Principal, exactamente. 684 00:46:47,000 --> 00:46:51,000 E así vimos os traxes diferentes que viste principal. 685 00:46:51,000 --> 00:46:54,000 Hai aquel en que non ten argumentos, 686 00:46:54,000 --> 00:46:58,000 e nós só dicir baleiro entre os parénteses, 687 00:46:58,000 --> 00:47:01,000 e despois hai outro onde queremos ter argumentos de liña de comandos, 688 00:47:01,000 --> 00:47:08,000 e, como vimos, que é onde ten argc int e cadea matriz argv 689 00:47:08,000 --> 00:47:13,000 ou agora que nós realmente expostos cadea para o char que é 690 00:47:13,000 --> 00:47:20,000 Nós imos comezar a escribilo lo como char * argv e corchetes. 691 00:47:20,000 --> 00:47:22,000 No conxunto de problemas 3, vostedes viron unha morea de funcións, 692 00:47:22,000 --> 00:47:27,000 e aplicou unha morea de funcións, deseñar, ollar para arriba, scramble. 693 00:47:27,000 --> 00:47:31,000 Os prototipos foron todos escritos alí para ti. 694 00:47:31,000 --> 00:47:33,000 >> O que eu quería falar aquí con funcións moi rapidamente 695 00:47:33,000 --> 00:47:38,000 é que hai 3 partes a eles sempre que escribir unha función. 696 00:47:38,000 --> 00:47:43,000 Ten que especificar o tipo de retorno da función. 697 00:47:43,000 --> 00:47:46,000 Ten que especificar un nome para a función, e entón ten que especificar 698 00:47:46,000 --> 00:47:51,000 a lista de argumentos ou a lista de parámetros. 699 00:47:51,000 --> 00:47:57,000 Por exemplo, se eu fose escribir unha función para resumir unha morea de números enteiros 700 00:47:57,000 --> 00:48:03,000 e despois volver para min a suma do que sería o meu tipo de retorno 701 00:48:03,000 --> 00:48:06,000 se eu quería sumar enteiros e despois volver a suma? 702 00:48:06,000 --> 00:48:12,000 A continuación, o nome da función. 703 00:48:12,000 --> 00:48:27,000 Se eu ir adiante e escribir en verde, esa parte é o tipo de retorno. 704 00:48:27,000 --> 00:48:34,000 Esta parte é o nome. 705 00:48:34,000 --> 00:48:40,000 E entón, entre parénteses 706 00:48:40,000 --> 00:48:46,000 é onde eu dou os argumentos, 707 00:48:46,000 --> 00:48:56,000 moitas veces abreviado como args, ás veces chamado params para os parámetros. 708 00:48:56,000 --> 00:49:00,000 E se ten un, só especificar a un. 709 00:49:00,000 --> 00:49:06,000 Se ten varios de separar cada un con comas. 710 00:49:06,000 --> 00:49:13,000 E para cada argumento que dea dúas cousas que son-Kevin? 711 00:49:13,000 --> 00:49:18,000 [Kevin] Ten que dar o tipo e logo o nome. 712 00:49:18,000 --> 00:49:21,000 E entón o nome, eo nome é o nome que vai empregar 713 00:49:21,000 --> 00:49:25,000 para referirse a ese argumento dentro da función suma, 714 00:49:25,000 --> 00:49:27,000 dentro da función que está escribindo actualmente. 715 00:49:27,000 --> 00:49:32,000 >> Non ten que, por exemplo, se eu estou indo para resumir, 716 00:49:32,000 --> 00:49:41,000 dicir, unha matriz de números enteiros: nós facer matriz int, 717 00:49:41,000 --> 00:49:46,000 e eu vou dar algunhas claves alí- 718 00:49:46,000 --> 00:49:51,000 entón, cando eu pasar un array para a función suma 719 00:49:51,000 --> 00:49:55,000 I pasalo na primeira posición da lista de argumentos. 720 00:49:55,000 --> 00:49:59,000 Pero a matriz que pasar non ten que ter o nome arr. 721 00:49:59,000 --> 00:50:07,000 Arr. vai ser como eu me refiro a ese argumento dentro do corpo da función. 722 00:50:07,000 --> 00:50:10,000 A outra cousa que temos que ter en conta, 723 00:50:10,000 --> 00:50:14,000 e iso é un pouco diferente de funcións, pero eu creo que é un punto importante, 724 00:50:14,000 --> 00:50:20,000 é que, no C, cando estou escribindo unha función como esta 725 00:50:20,000 --> 00:50:29,000 Como sei cantos elementos están nesta matriz? 726 00:50:29,000 --> 00:50:31,000 Isto é un pouco de unha pregunta capciosa. 727 00:50:31,000 --> 00:50:35,000 Nós conversas sobre iso un pouco na sección da última semana. 728 00:50:35,000 --> 00:50:40,000 Como sei que o número de elementos dentro dunha matriz en C? 729 00:50:40,000 --> 00:50:44,000 Existe unha maneira? 730 00:50:44,000 --> 00:50:49,000 >> Acontece que non hai ningunha forma de saber. 731 00:50:49,000 --> 00:50:52,000 Ten que pasalo por separado. 732 00:50:52,000 --> 00:50:55,000 Existe un truco que pode facer 733 00:50:55,000 --> 00:51:00,000 se está na mesma función que a matriz fose declarado, 734 00:51:00,000 --> 00:51:04,000 e está a traballar con unha gran pila. 735 00:51:04,000 --> 00:51:06,000 Pero iso só funciona se vostede está na mesma función. 736 00:51:06,000 --> 00:51:09,000 Despois de pasar unha matriz a outra función ou se ten declarado unha matriz 737 00:51:09,000 --> 00:51:12,000 e pór esa matriz na pila, xa usou malloc 738 00:51:12,000 --> 00:51:15,000  e este tipo de cousas, entón todas as apostas están fóra. 739 00:51:15,000 --> 00:51:18,000 Entón, o que realmente ten que pasar en torno a 740 00:51:18,000 --> 00:51:21,000 un argumento especial ou outro parámetro 741 00:51:21,000 --> 00:51:23,000 dicindo o quão grande é a matriz. 742 00:51:23,000 --> 00:51:28,000 Neste caso, eu quere empregar unha coma-Sinto moito, vai a fóra da pantalla aquí- 743 00:51:28,000 --> 00:51:32,000 e eu pasar outro argumento 744 00:51:32,000 --> 00:51:40,000  e chamalo len int ao longo. 745 00:51:40,000 --> 00:51:44,000 >> Unha cousa que poida xurdir no cuestionario 746 00:51:44,000 --> 00:51:49,000 está pedindo para escribir ou implementar unha función especial chamada algo. 747 00:51:49,000 --> 00:51:54,000 Se non lle dar o prototipo, entón esa cousa toda aquí, 748 00:51:54,000 --> 00:51:58,000 toda esa confusión é chamado de declaración de función ou o prototipo da función, 749 00:51:58,000 --> 00:52:01,000 Esta é unha das primeiras cousas que vai querer predicar para abaixo, se non é dado 750 00:52:01,000 --> 00:52:03,000 para vostede inmediatamente no cuestionario. 751 00:52:03,000 --> 00:52:06,000 O outro truco que eu aprendín é que 752 00:52:06,000 --> 00:52:11,000 dicir que lle dan un prototipo para unha función, e dicimos: "Ei, ten que escribir." 753 00:52:11,000 --> 00:52:16,000 Dentro das claves que ten no cuestionario 754 00:52:16,000 --> 00:52:20,000 Se notar que existe un tipo de retorno e entender que tipo de retorno 755 00:52:20,000 --> 00:52:25,000 é algo diferente de carga, o que significa que a función non retorna nada, 756 00:52:25,000 --> 00:52:28,000 a continuación, unha cousa que sempre quere facer é escribir 757 00:52:28,000 --> 00:52:33,000 algún tipo de instrución de retorno ao final da función. 758 00:52:33,000 --> 00:52:40,000 Retorno, e neste caso, imos poñer un en branco, porque queremos encher o espazo en branco. 759 00:52:40,000 --> 00:52:44,000 Pero isto fai pensar da maneira correcta sobre como é que eu vou abordar este problema? 760 00:52:44,000 --> 00:52:49,000 E lembra que vai ter que voltar un valor 761 00:52:49,000 --> 00:52:51,000 á chamador da función. 762 00:52:51,000 --> 00:52:54,000 >> Si >> [Estudante] O estilo aplícase cando estamos escribindo código no exame? 763 00:52:54,000 --> 00:52:58,000 Como recuar e este tipo de cousas? >> [Estudante] Yeah. 764 00:52:58,000 --> 00:53:00,000 Non, non é tan grande. 765 00:53:00,000 --> 00:53:09,000 Eu creo que unha morea de-isto é algo que vai aclarar sobre o exame o día da, 766 00:53:09,000 --> 00:53:15,000 pero normalmente se preocupar con # inclúe e ese tipo de cousas, é unha especie de fóra. 767 00:53:15,000 --> 00:53:17,000 [Estudante] Debe comentar o seu código escrito a man? 768 00:53:17,000 --> 00:53:19,000 Debe comentar o seu código escrito a man? 769 00:53:19,000 --> 00:53:24,000 Comentando sempre é bo se está preocupado con crédito parcial 770 00:53:24,000 --> 00:53:29,000 ou quere comunicar a súa intención para o alumno. 771 00:53:29,000 --> 00:53:33,000 Pero, unha vez máis, vai aclarar sobre o cuestionario en si e día quiz, 772 00:53:33,000 --> 00:53:39,000 pero eu non creo que vai ser obrigado a escribir comentarios, non. 773 00:53:39,000 --> 00:53:42,000 Normalmente non, pero é sempre o tipo de cousas que 774 00:53:42,000 --> 00:53:45,000 pode comunicar a súa intención, como "Ola, aquí é onde eu estou indo con iso." 775 00:53:45,000 --> 00:53:49,000 E ás veces isto pode axudar con crédito parcial. 776 00:53:49,000 --> 00:53:51,000 Cool. 777 00:53:51,000 --> 00:53:53,000 >> Basil. 778 00:53:53,000 --> 00:53:56,000 [Basil] Cal é a diferenza entre establecer, por exemplo, int lang 779 00:53:56,000 --> 00:54:03,000 nos argumentos ou parámetros contra declarar unha variable dentro da función? 780 00:54:03,000 --> 00:54:05,000 Guau, o café caeu na traquea. 781 00:54:05,000 --> 00:54:07,000 [Basil] Como as cousas que queremos poñer en argumentos. 782 00:54:07,000 --> 00:54:09,000 Si, esta é unha gran cuestión. 783 00:54:09,000 --> 00:54:11,000 Como vostede escolle as cousas que quere poñer nos argumentos 784 00:54:11,000 --> 00:54:17,000 versus o que ten que facer as cousas dentro da función? 785 00:54:17,000 --> 00:54:24,000 Neste caso, incluíu ambos como argumentos 786 00:54:24,000 --> 00:54:29,000 porque é algo que quen vai usar a función suma 787 00:54:29,000 --> 00:54:32,000 Debe especificar estas cousas. 788 00:54:32,000 --> 00:54:35,000 >> A función suma, como falamos, non ten como saber 789 00:54:35,000 --> 00:54:40,000 como é grande a matriz que queda do seu interlocutor ou quen está a usar a función suma. 790 00:54:40,000 --> 00:54:44,000 El non ten forma de saber o tamaño desa matriz é. 791 00:54:44,000 --> 00:54:48,000 A razón hai que pasar nese longo aquí como un argumento 792 00:54:48,000 --> 00:54:51,000 é porque iso é algo que nós estamos basicamente dicindo o chamador da función, 793 00:54:51,000 --> 00:54:55,000 quen vai usar a función suma: "Ei, non só ten que dar unha matriz 794 00:54:55,000 --> 00:54:59,000 de enteiros, tamén ten que dicir o quão grande a matriz que nos deu. " 795 00:54:59,000 --> 00:55:03,000 [Basil] Os serán ambos argumentos de liña de comandos? 796 00:55:03,000 --> 00:55:06,000 Non, estes son argumentos reais que ten que pasar para a función. 797 00:55:06,000 --> 00:55:10,000 >> Deixe-me facer unha nova páxina aquí. 798 00:55:10,000 --> 00:55:13,000 [Basil] Como nome pasaría- 799 00:55:13,000 --> 00:55:24,000 [Nate H.] Se eu tivera int main (void), 800 00:55:24,000 --> 00:55:27,000 e eu vou poñer no meu retorno 0 aquí na parte inferior, 801 00:55:27,000 --> 00:55:31,000 e dicir que quero chamar a función suma. 802 00:55:31,000 --> 00:55:42,000 Quero dicir int x = suma (); 803 00:55:42,000 --> 00:55:46,000 Para utilizar a función suma eu teño que pasar tanto a matriz que quero resumir 804 00:55:46,000 --> 00:55:51,000 é a lonxitude da matriz, de xeito que este é o lugar onde 805 00:55:51,000 --> 00:55:54,000 supoñendo que eu tivese un array de enteiros, 806 00:55:54,000 --> 00:56:12,000 din tiven Numbaz int [] = 1, 2, 3, 807 00:56:12,000 --> 00:56:16,000 tipo de uso que hackeou sintaxe alí, 808 00:56:16,000 --> 00:56:21,000 entón o que me gustaría facer é en definitiva gustaríame pasar 809 00:56:21,000 --> 00:56:27,000 tanto Numbaz e número 3 810 00:56:27,000 --> 00:56:30,000 para dicir a función de suma "Ok, aquí está a matriz que quero que sumar." 811 00:56:30,000 --> 00:56:34,000 "Aquí é o seu tamaño." 812 00:56:34,000 --> 00:56:39,000 Isto ten sentido? Isto responde a súa pregunta? 813 00:56:39,000 --> 00:56:42,000 >> En moitos aspectos, fai paralelo o que estamos facendo o principal 814 00:56:42,000 --> 00:56:44,000 cando temos os argumentos de liña de comandos. 815 00:56:44,000 --> 00:56:47,000 Un programa como o César cifra, por exemplo, que precisaba 816 00:56:47,000 --> 00:56:53,000 argumentos de liña de comandos non sería capaz de facer calquera cousa. 817 00:56:53,000 --> 00:56:57,000 Non sabería como Encriptar se non informar que a clave para usar 818 00:56:57,000 --> 00:57:03,000 ou se non dixo a el o que quería corda para cifrar. 819 00:57:03,000 --> 00:57:08,000 Solicitude de unha entrada, este é o lugar onde temos dous mecanismos diferentes 820 00:57:08,000 --> 00:57:14,000 para a toma de entrada a partir do usuario para a toma de información a partir do usuario. 821 00:57:14,000 --> 00:57:19,000 Para conxunto de problemas 1 vimos este GetInt, GetString forma, GetFloat 822 00:57:19,000 --> 00:57:26,000 de solicitude de entrada, e que se chama usando o fluxo de entrada estándar. 823 00:57:26,000 --> 00:57:28,000 É un pouco diferente. 824 00:57:28,000 --> 00:57:31,000 É algo que podes facer nun tempo en oposición a 825 00:57:31,000 --> 00:57:35,000 cando chamar o programa cando inicia o programa en execución. 826 00:57:35,000 --> 00:57:41,000 Os argumentos de liña de comandos especifícanse todos cando se inicia o funcionamento do programa. 827 00:57:41,000 --> 00:57:47,000 Temos a mestura dos dous destes. 828 00:57:47,000 --> 00:57:52,000 Cando usamos argumentos para unha función, é moi parecido cos argumentos de liña de ordes para a principal. 829 00:57:52,000 --> 00:57:56,000 É cando chamar a función que precisa dicir a el 830 00:57:56,000 --> 00:58:05,000 exactamente o que necesita para realizar as súas tarefas. 831 00:58:05,000 --> 00:58:08,000 Outra cousa boa para ollar, e eu vou deixar ollar no seu tempo libre, 832 00:58:08,000 --> 00:58:11,000 e foi cuberto no cuestionario, era esa noción de ámbito 833 00:58:11,000 --> 00:58:15,000 e as variables locais versus variables globais. 834 00:58:15,000 --> 00:58:18,000 Preste atención a iso. 835 00:58:18,000 --> 00:58:23,000 >> Agora que estamos chegando a estas outras cousas, 836 00:58:23,000 --> 00:58:27,000 a Semana 3 comezamos a falar sobre investigación e clasificación. 837 00:58:27,000 --> 00:58:32,000 Busca e clasificación, polo menos no CS50, 838 00:58:32,000 --> 00:58:39,000 é moito máis unha introdución a algunhas das partes máis teóricas da ciencia da computación. 839 00:58:39,000 --> 00:58:42,000 O problema da investigación, o problema da ordenación 840 00:58:42,000 --> 00:58:46,000 son grandes problemas canônicos. 841 00:58:46,000 --> 00:58:52,000 Como atopar un número específico dunha matriz de miles de millóns de enteiros? 842 00:58:52,000 --> 00:58:55,000 Como atopar un nome específico dentro dun libro de teléfono 843 00:58:55,000 --> 00:58:59,000 que está almacenado no seu portátil? 844 00:58:59,000 --> 00:59:04,000 E, así, introducir esta noción de tempo de execución asintótica 845 00:59:04,000 --> 00:59:11,000 realmente cuantificar canto tempo, o quão duro estes problemas son, 846 00:59:11,000 --> 00:59:14,000 Canto tempo leva para resolver. 847 00:59:14,000 --> 00:59:20,000 En, creo, 2011 do cuestionario hai un problema que eu creo que merece 848 00:59:20,000 --> 00:59:27,000 cubrindo moi rápido, o que é un agasallo, problema 12. 849 00:59:27,000 --> 00:59:32,000 O non, é Omega. 850 00:59:32,000 --> 00:59:41,000 >> Aquí estamos falando sobre o tempo de execución máis rápido posible 851 00:59:41,000 --> 00:59:46,000 para un determinado algoritmo e, a continuación, o tempo de execución máis lenta posible. 852 00:59:46,000 --> 00:59:52,000 Este Omega e O son realmente só atallos. 853 00:59:52,000 --> 00:59:55,000 Son atallos de notación por dicir 854 00:59:55,000 --> 00:59:59,000 rapidez no caso mellor posible vontade nosa carreira algoritmo, 855 00:59:59,000 --> 01:00:06,000 e como lento no peor caso posible o noso algoritmo pode executar? 856 01:00:06,000 --> 01:00:10,000 Imos facer un par destes, e estes foron tamén códigos 857 01:00:10,000 --> 01:00:13,000 no curto sobre notación asintótica, o que eu recomendo. 858 01:00:13,000 --> 01:00:17,000 Jackson fixo un traballo realmente bo. 859 01:00:17,000 --> 01:00:23,000 Con busca binaria, falamos de busca binaria como un algoritmo, 860 01:00:23,000 --> 01:00:28,000 e adoitamos falar sobre iso en termos da súa gran O. 861 01:00:28,000 --> 01:00:30,000 O que é o gran? 862 01:00:30,000 --> 01:00:34,000 Cal é o tempo de execución máis lenta posible de busca binaria? 863 01:00:34,000 --> 01:00:36,000 [Estudante] N ²? 864 01:00:36,000 --> 01:00:41,000 Pechar, eu creo semellante a iso. 865 01:00:41,000 --> 01:00:43,000 É moito máis rápido do que iso. 866 01:00:43,000 --> 01:00:45,000 [Estudante] binario? >> Si, busca binaria. 867 01:00:45,000 --> 01:00:47,000 [Estudante] É rexistro n. 868 01:00:47,000 --> 01:00:49,000 Log n, entón o que log n significa? 869 01:00:49,000 --> 01:00:51,000 É metades que cada iteração. 870 01:00:51,000 --> 01:00:56,000 Exactamente, por iso, no caso de que o máis lento posible, 871 01:00:56,000 --> 01:01:00,000 dicir se ten un array ordenado 872 01:01:00,000 --> 01:01:08,000 dun millón de números enteiros eo número que está a buscar 873 01:01:08,000 --> 01:01:14,000 ou é o primeiro elemento da matriz ou o último elemento na matriz. 874 01:01:14,000 --> 01:01:18,000 Lembre, o algoritmo de procura binaria funciona ollando para o elemento do medio, 875 01:01:18,000 --> 01:01:21,000 ver se ese é o xogo que está a procurar. 876 01:01:21,000 --> 01:01:23,000 Se for, entón gran, que o atopou. 877 01:01:23,000 --> 01:01:27,000 >> No mellor caso posible, o quão rápido é executado de busca binaria? 878 01:01:27,000 --> 01:01:29,000 [Os alumnos] 1. 879 01:01:29,000 --> 01:01:32,000 1, é de tempo constante, grande do 1. Si 880 01:01:32,000 --> 01:01:36,000 [Estudante] Eu teño unha pregunta. Cando di facer de n, quere dicir con respecto a base 2, non? 881 01:01:36,000 --> 01:01:40,000 Si, de xeito que é a outra cousa. 882 01:01:40,000 --> 01:01:44,000 Dicimos n log, e eu creo que cando estaba na escola 883 01:01:44,000 --> 01:01:48,000 Eu sempre pensei que era log base 10. 884 01:01:48,000 --> 01:01:57,000 Si, iso si, facer 2 base normalmente é o que usan. 885 01:01:57,000 --> 01:02:02,000 Unha vez máis, volvendo a busca binaria, se está a buscar por un ou outro 886 01:02:02,000 --> 01:02:05,000 o elemento ao final ou o elemento en principio, 887 01:02:05,000 --> 01:02:08,000 porque comeza no medio e despois de descartar 888 01:02:08,000 --> 01:02:13,000 o que media non cumprir os criterios que está a buscar, 889 01:02:13,000 --> 01:02:15,000 e vai ao seguinte semestre e do próximo semestre e do próximo semestre. 890 01:02:15,000 --> 01:02:19,000 Se eu estou buscando o maior elemento da matriz de enteiros millóns 891 01:02:19,000 --> 01:02:25,000 Vou reducir á metade é de máis rexistro de 1 millón de veces 892 01:02:25,000 --> 01:02:28,000 antes de finalmente probar e ver que o elemento que eu estou buscando 893 01:02:28,000 --> 01:02:33,000 está na maior ou en maior índice de matriz, 894 01:02:33,000 --> 01:02:38,000 e que terá rexistro n, faga o login de 1 millón de veces. 895 01:02:38,000 --> 01:02:40,000 >> Especie de burbulla. 896 01:02:40,000 --> 01:02:43,000 Vostedes lembrar o algoritmo de ordenación burbulla? 897 01:02:43,000 --> 01:02:47,000 Kevin, que me pode dar unha rápida recapitulação do que aconteceu no algoritmo de ordenación burbulla? 898 01:02:47,000 --> 01:02:50,000 [Kevin] Basicamente el pasa por todo na lista. 899 01:02:50,000 --> 01:02:52,000 El mira para os dous primeiros. 900 01:02:52,000 --> 01:02:55,000 O primeiro é maior que a segunda ela pasa-los. 901 01:02:55,000 --> 01:02:58,000 A continuación, el compara, segundo e terceiro, a mesma cousa, swaps, 902 01:02:58,000 --> 01:03:00,000 terceiro e cuarto, todo o camiño. 903 01:03:00,000 --> 01:03:03,000 Números máis grandes seguirá ata o final. 904 01:03:03,000 --> 01:03:07,000 E despois de moitas voltas con todo está feito. 905 01:03:07,000 --> 01:03:11,000 Exactamente por iso que Kevin dixo é que nós imos ver números maiores 906 01:03:11,000 --> 01:03:15,000 burbulla até o final da matriz. 907 01:03:15,000 --> 01:03:19,000 Por exemplo, se importa de camiñar connosco a través deste exemplo, esta é a nosa matriz? 908 01:03:19,000 --> 01:03:21,000 [Kevin] Vai tomar 2 e 3. 909 01:03:21,000 --> 01:03:23,000 3 é maior que 2, entón troca-los. 910 01:03:23,000 --> 01:03:29,000 [Nate H.] Certo, entón nós trocamos estes, e así temos 2, 3, 6, 4 e 9. 911 01:03:29,000 --> 01:03:31,000 [Kevin] Entón comparar a 3 e 6. 912 01:03:31,000 --> 01:03:33,000 3 é menor que 6, de modo que deixalos, 913 01:03:33,000 --> 01:03:37,000 e 6 e 4, que troca-los por 4 é menor que 6. 914 01:03:37,000 --> 01:03:42,000 [Nate H.] Dereito, por iso fico 2, 3, 4, 6, 9. 915 01:03:42,000 --> 01:03:46,000 [Kevin] e 9 é maior que 6, entón deixalo. 916 01:03:46,000 --> 01:03:48,000 E volver con el de novo. 917 01:03:48,000 --> 01:03:50,000 >> [Nate H.] Estou feito neste momento? >> [Kevin] Non 918 01:03:50,000 --> 01:03:52,000 E por que non estou feito neste momento? 919 01:03:52,000 --> 01:03:54,000 Porque parece que a miña matriz é clasificada. Estou mirando para el. 920 01:03:54,000 --> 01:03:57,000 [Kevin] pasar por iso de novo e asegúrese de que hai swaps non máis 921 01:03:57,000 --> 01:04:00,000 antes de deixar totalmente. 922 01:04:00,000 --> 01:04:04,000 Exactamente, por iso é necesario manter a atravesar e asegúrese de que non existen swaps 923 01:04:04,000 --> 01:04:06,000 que podes facer neste momento. 924 01:04:06,000 --> 01:04:08,000 Era realmente só sorte, como dixen, que rematou 925 01:04:08,000 --> 01:04:12,000 só ter que facer unha pasaxe e estamos clasificados. 926 01:04:12,000 --> 01:04:16,000 Pero, para iso, no caso xeral, imos realmente ten que facer iso unha e outra vez. 927 01:04:16,000 --> 01:04:20,000 E, de feito, este foi un exemplo do mellor caso posible, 928 01:04:20,000 --> 01:04:24,000 como vimos no problema. 929 01:04:24,000 --> 01:04:28,000 Nós vimos que o mellor caso posible foi n. 930 01:04:28,000 --> 01:04:32,000 Pasamos por un momento matriz. 931 01:04:32,000 --> 01:04:35,000 Cal é o peor caso posible para este algoritmo? 932 01:04:35,000 --> 01:04:37,000 [Kevin] n ². 933 01:04:37,000 --> 01:04:41,000 E o que iso parece? O que sería un ollar matriz como que levaría tempo n ²? 934 01:04:41,000 --> 01:04:43,000 [Kevin] [inaudível] clasificados. 935 01:04:43,000 --> 01:04:51,000 Exactamente, por iso, se eu tivese a matriz de 9, 7, 6, 5, 2, 936 01:04:51,000 --> 01:04:54,000 primeiro o 9 sería burbulla todo o camiño ata. 937 01:04:54,000 --> 01:04:59,000 Despois dunha iteração teriamos 7, 6, 5, 2, 9. 938 01:04:59,000 --> 01:05:07,000 A continuación, a 7 sería borbulhar, 6, 5, 2, 7, 9, e así por diante e así por diante. 939 01:05:07,000 --> 01:05:13,000 >> Nós teriamos que pasar por toda a matriz n veces, 940 01:05:13,000 --> 01:05:16,000 e realmente pode estar un pouco máis preciso do que iso 941 01:05:16,000 --> 01:05:23,000 porque unha vez que cambiamos o 9 de todo o camiño ata a súa última posición posible 942 01:05:23,000 --> 01:05:26,000 sabemos que nunca temos que comparar co elemento novo. 943 01:05:26,000 --> 01:05:29,000 Así que comezar a borbulhar 7-se 944 01:05:29,000 --> 01:05:35,000 sabemos que podemos deixar unha vez que o 7 é pronto antes da 9 945 01:05:35,000 --> 01:05:37,000 unha vez que xa comparou a 9 para el. 946 01:05:37,000 --> 01:05:46,000 Se fai iso de forma intelixente, non é verdade, eu creo que moito tempo. 947 01:05:46,000 --> 01:05:49,000 Non vai comparar todas as posibles combinacións de [inaudível] 948 01:05:49,000 --> 01:05:55,000 cada vez que pasar por cada iteração. 949 01:05:55,000 --> 01:05:59,000 Pero, aínda así, cando falamos sobre este límite superior dicimos que 950 01:05:59,000 --> 01:06:04,000 vostede está ollando para n ² comparacións durante todo o tempo. 951 01:06:04,000 --> 01:06:12,000 >> Imos volver, e xa estamos empezando a estar un pouco en curto tempo 952 01:06:12,000 --> 01:06:15,000 Eu diría que ten que definitivamente pasar o resto da táboa, 953 01:06:15,000 --> 01:06:17,000 cubrir todo. 954 01:06:17,000 --> 01:06:20,000 Debería exemplos. Debería exemplos concretos. 955 01:06:20,000 --> 01:06:22,000 Iso é moi práctico e útil para facelo. 956 01:06:22,000 --> 01:06:25,000 Retirala la. 957 01:06:25,000 --> 01:06:28,000 Este é o tipo de táboa que como pasar en ciencia da computación 958 01:06:28,000 --> 01:06:32,000 ten que realmente comezar a coñecer estes corazón por. 959 01:06:32,000 --> 01:06:34,000 Estes son os tipos de preguntas que vostede poñerse en entrevistas. 960 01:06:34,000 --> 01:06:36,000 Estes son os tipos de cousas que son boas para saber, 961 01:06:36,000 --> 01:06:41,000 e pensar sobre os casos de punta, realmente descubrir como pensar 962 01:06:41,000 --> 01:06:45,000 sabendo que a burbulla clasificar a matriz peor posible 963 01:06:45,000 --> 01:06:52,000 de clasificar que é aquel que está en orde inversa. 964 01:06:52,000 --> 01:06:58,000 >> Punteiros. Imos falar un pouco sobre punteiros. 965 01:06:58,000 --> 01:07:03,000 Nos últimos minutos que temos aquí 966 01:07:03,000 --> 01:07:11,000 Sei que iso é algo xunto co arquivo de I / O que é novo. 967 01:07:11,000 --> 01:07:19,000 Cando falamos de punteiros a razón pola que quero falar sobre punteiros 968 01:07:19,000 --> 01:07:24,000 é, pois, un, cando estamos a traballar en C 969 01:07:24,000 --> 01:07:33,000 estamos realmente en un nivel moi baixo en comparación con linguaxes de programación máis modernas. 970 01:07:33,000 --> 01:07:38,000 Somos realmente capaces de manipular as variables na memoria, 971 01:07:38,000 --> 01:07:43,000 descubrir onde eles están, en realidade, situado dentro da nosa memoria RAM. 972 01:07:43,000 --> 01:07:46,000 Unha vez que pasou a ter aulas de sistema operativo que ver 973 01:07:46,000 --> 01:07:48,000 que iso é, de novo, unha especie de abstracción. 974 01:07:48,000 --> 01:07:50,000 Isto non é realmente o caso. 975 01:07:50,000 --> 01:07:52,000 Temos memoria virtual que está escondendo os detalles de nós. 976 01:07:52,000 --> 01:07:58,000 >> Pero, por agora pode asumir que cando ten un programa, 977 01:07:58,000 --> 01:08:02,000 por exemplo, cando comezar a realizar o seu programa de cifrado de César 978 01:08:02,000 --> 01:08:06,000 Vou volver para o meu iPad moi rapidamente- 979 01:08:06,000 --> 01:08:12,000 que, en principio, o seu programa, se ten, digamos, 980 01:08:12,000 --> 01:08:15,000 4 gigabytes de memoria RAM do seu ordenador portátil, 981 01:08:15,000 --> 01:08:21,000 se esquecer ese anaco, e nós imos chamar iso de RAM. 982 01:08:21,000 --> 01:08:25,000 E comeza nun lugar que nós imos chamar 0, 983 01:08:25,000 --> 01:08:30,000 e remata nun lugar que nós imos chamar de 4 gigabytes. 984 01:08:30,000 --> 01:08:37,000 Eu realmente non podo escribir. O home, que é cortado. 985 01:08:37,000 --> 01:08:40,000 Cando o programa é executado 986 01:08:40,000 --> 01:08:44,000 o sistema operativo esculpe a memoria RAM, 987 01:08:44,000 --> 01:08:51,000 e especifica segmentos diferentes para distintas partes do seu programa para vivir 988 01:08:51,000 --> 01:08:58,000 Aquí abaixo esta área é unha especie de terra de ninguén. 989 01:08:58,000 --> 01:09:02,000 Cando vai ata un pouco máis aquí 990 01:09:02,000 --> 01:09:05,000 ten realmente o lugar onde 991 01:09:05,000 --> 01:09:09,000 o código para a vida dos seus programas. 992 01:09:09,000 --> 01:09:13,000 Este código binario real, que en realidade arquivo executábel é cargado na memoria 993 01:09:13,000 --> 01:09:17,000 cando executar un programa, e que vive no segmento de código. 994 01:09:17,000 --> 01:09:22,000 E como o programa é executado o procesador mira para este segmento de código 995 01:09:22,000 --> 01:09:24,000 para descubrir o que é a instrución seguinte? 996 01:09:24,000 --> 01:09:27,000 Cal é a seguinte liña de código que eu teño para executar? 997 01:09:27,000 --> 01:09:31,000 >> Hai tamén un segmento de datos, e é aí onde os constantes da cadea 998 01:09:31,000 --> 01:09:34,000 quedan almacenados que está a usar. 999 01:09:34,000 --> 01:09:42,000 E despois máis arriba hai un lugar chamado a pila. 1000 01:09:42,000 --> 01:09:46,000 Nós acceder á memoria usando malloc, 1001 01:09:46,000 --> 01:09:49,000 e despois para arriba do seu programa 1002 01:09:49,000 --> 01:09:52,000 hai a pila, 1003 01:09:52,000 --> 01:09:57,000 e é aí onde temos que chegou a xogar a maior parte do inicio. 1004 01:09:57,000 --> 01:09:59,000 Esta non é a escala ou nada. 1005 01:09:59,000 --> 01:10:03,000 Moito diso é moi dependente da máquina, 1006 01:10:03,000 --> 01:10:10,000 dependentes do sistema operativo, pero iso é como as cousas son relativamente fragmentada arriba. 1007 01:10:10,000 --> 01:10:17,000 Cando executar un programa e declarar unha variable chamada x- 1008 01:10:17,000 --> 01:10:27,000 Vou chamar a outra caixa de abaixo, e iso vai ser RAM tamén. 1009 01:10:27,000 --> 01:10:29,000 E eu vou mirar. 1010 01:10:29,000 --> 01:10:34,000 Imos debuxar liñas irregulares para indicar esta é só unha pequena parte da RAM 1011 01:10:34,000 --> 01:10:38,000 e non a súa totalidade como deseñar na parte superior. 1012 01:10:38,000 --> 01:10:43,000 >> Se eu declarar unha variable enteira chamada x, 1013 01:10:43,000 --> 01:10:49,000 entón o que eu en realidade é un mapeamento 1014 01:10:49,000 --> 01:10:54,000 que é almacenado na táboa de símbolos do meu programa 1015 01:10:54,000 --> 01:11:00,000 que une o X nome a esta rexión de memoria que eu deseño 1016 01:11:00,000 --> 01:11:03,000 aquí entre as barras verticais. 1017 01:11:03,000 --> 01:11:08,000 Se eu tivera unha liña de código no meu programa que di que x = 7 1018 01:11:08,000 --> 01:11:15,000 o procesador sabe "Oh, ok, eu sei que vive x neste lugar na memoria." 1019 01:11:15,000 --> 01:11:25,000 "Eu estou indo a ir adiante e escribir un 7 alí." 1020 01:11:25,000 --> 01:11:28,000 Como el sabe o que esta situación é na memoria? 1021 01:11:28,000 --> 01:11:30,000 Ben, todo isto está feito en tempo de compilación. 1022 01:11:30,000 --> 01:11:34,000 O compilador coida de reservar onde cada unha das variables están a ir 1023 01:11:34,000 --> 01:11:40,000 e creando un mapeamento especial ou mellor conectar os puntos 1024 01:11:40,000 --> 01:11:43,000 entre un símbolo e onde está indo, o nome dunha variable 1025 01:11:43,000 --> 01:11:46,000 e onde vai vivir na memoria. 1026 01:11:46,000 --> 01:11:50,000 Pero acontece que nós realmente podemos acceder a ela nos nosos programas tamén. 1027 01:11:50,000 --> 01:11:55,000 Iso queda importante cando comezamos a falar sobre algunhas das estruturas de datos, 1028 01:11:55,000 --> 01:11:58,000 que é un concepto que imos introducir máis tarde. 1029 01:11:58,000 --> 01:12:09,000 >> Pero, por agora, o que pode saber é que podo crear un punteiro para este local, x. 1030 01:12:09,000 --> 01:12:12,000 Por exemplo, podo crear unha variable punteiro. 1031 01:12:12,000 --> 01:12:16,000 Cando creamos unha variable punteiro usan a notación estrela. 1032 01:12:16,000 --> 01:12:21,000 Neste caso, este di que eu estou indo para crear un punteiro para un int. 1033 01:12:21,000 --> 01:12:24,000 É un tipo como calquera outro. 1034 01:12:24,000 --> 01:12:27,000 Dar-lle unha variable como y, 1035 01:12:27,000 --> 01:12:32,000 e entón configurar-lo igual ao enderezo a un enderezo. 1036 01:12:32,000 --> 01:12:38,000 Neste caso, podemos definir y para apuntar para x 1037 01:12:38,000 --> 01:12:43,000 tomando o enderezo de x, o que facemos con este comercial, 1038 01:12:43,000 --> 01:12:55,000 e, entón, establecer y para apuntar para el. 1039 01:12:55,000 --> 01:12:59,000 O que isto fai é esencialmente se miramos para a nosa memoria RAM 1040 01:12:59,000 --> 01:13:02,000 Isto crea unha variable independente. 1041 01:13:02,000 --> 01:13:04,000 El vai chamalo de y, 1042 01:13:04,000 --> 01:13:06,000 e cando esta liña de código é executado 1043 01:13:06,000 --> 01:13:13,000 Está realmente indo para crear un punteiro pouco que normalmente deseñar coma unha frecha, 1044 01:13:13,000 --> 01:13:15,000 e define y para apuntar para x. 1045 01:13:15,000 --> 01:13:17,000 Si 1046 01:13:17,000 --> 01:13:19,000 [Estudante] Se x é xa un punteiro, que acaba de facer 1047 01:13:19,000 --> 01:13:22,000 int * y = x en vez de ter o comercial? 1048 01:13:22,000 --> 01:13:24,000 Si 1049 01:13:24,000 --> 01:13:27,000 Se x é xa un punteiro, entón podes definir dous punteiros iguais uns aos outros, 1050 01:13:27,000 --> 01:13:30,000 caso en que y non ía apuntar para x, 1051 01:13:30,000 --> 01:13:34,000 pero chama a atención sobre o que quere que x está a apuntar. 1052 01:13:34,000 --> 01:13:37,000 Desafortunadamente, estamos fóra do tempo. 1053 01:13:37,000 --> 01:13:44,000 >> O que quere dicir neste momento, podemos falar sobre iso desconectada, 1054 01:13:44,000 --> 01:13:49,000 pero eu diría que comezar a traballar con este problema, # 14. 1055 01:13:49,000 --> 01:13:53,000 Podes ver que hai xa un pouco cuberto para vostede aquí. 1056 01:13:53,000 --> 01:13:57,000 Podes ver que cando declaramos dous punteiros, int * x e y *, 1057 01:13:57,000 --> 01:14:01,000 e teña en conta que apuntar o * próximo á variable foi algo que se fixo o ano pasado. 1058 01:14:01,000 --> 01:14:05,000 Acontece que este é semellante ao que nós estamos facendo este ano. 1059 01:14:05,000 --> 01:14:11,000 Non importa onde vostede escribe o * cando está declarando o punteiro. 1060 01:14:11,000 --> 01:14:17,000 Pero temos escrito o * ó lado do tipo 1061 01:14:17,000 --> 01:14:24,000 porque que o fai moi claro que está declarando unha variable punteiro. 1062 01:14:24,000 --> 01:14:27,000 Podes ver que declarar os dous punteiros nos dá dúas caixas. 1063 01:14:27,000 --> 01:14:31,000 Aquí cando imos definir x igual a malloc 1064 01:14:31,000 --> 01:14:34,000 o que iso está dicindo é deixar de lado a memoria no heap. 1065 01:14:34,000 --> 01:14:41,000 Esta pequena caixa aquí, este círculo, está situado na pila. 1066 01:14:41,000 --> 01:14:43,000 X está a apuntar cara a el. 1067 01:14:43,000 --> 01:14:46,000 Teña en conta que y non está a apuntar cara algo. 1068 01:14:46,000 --> 01:14:50,000 Para memoria para almacenar o número 42 en x 1069 01:14:50,000 --> 01:14:55,000 poderiamos usar o que a notación? 1070 01:14:55,000 --> 01:14:59,000 [Estudante] * x = 42. 1071 01:14:59,000 --> 01:15:01,000 Exactamente, * x = 42. 1072 01:15:01,000 --> 01:15:06,000 Isto significa que siga a frecha e xogar 42 en alí. 1073 01:15:06,000 --> 01:15:09,000 Aquí onde imos definir y e x temos y apuntando para x. 1074 01:15:09,000 --> 01:15:13,000 De novo, iso é como o que Kevin dixo onde imos definir y igual a x. 1075 01:15:13,000 --> 01:15:15,000 Y non está a apuntar cara x. 1076 01:15:15,000 --> 01:15:19,000 En vez diso, está apuntando para o que x está a apuntar cara ben. 1077 01:15:19,000 --> 01:15:24,000 >> E entón, finalmente nesta última caixa hai dúas cousas posibles que poderiamos facer. 1078 01:15:24,000 --> 01:15:28,000 Un deles é, poderiamos dicir * x = 13. 1079 01:15:28,000 --> 01:15:33,000 A outra cousa é que podería dicirse Alex, vostede sabe o que podemos facer aquí? 1080 01:15:33,000 --> 01:15:37,000 Vostede podería dicir * x = 13 ou- 1081 01:15:37,000 --> 01:15:41,000 [Estudante] Vostede podería dicir o que int. 1082 01:15:41,000 --> 01:15:45,000 [Nate H.] Se isto foi referido como unha variable int que podería facelo. 1083 01:15:45,000 --> 01:15:49,000 Poderiamos tamén dicir * y = 13, pois ambos están apuntando para o mesmo lugar, 1084 01:15:49,000 --> 01:15:51,000 para que pudéssemos usar unha variable para chegar alí. 1085 01:15:51,000 --> 01:15:56,000 Si >> [Estudante] Cal sería a súa aparencia só dicir que x int é 13? 1086 01:15:56,000 --> 01:16:00,000 Iso sería declarar unha nova variable chamada x, que non ía funcionar. 1087 01:16:00,000 --> 01:16:04,000 Nós teriamos unha colisión porque declarou x para ser un punteiro aquí. 1088 01:16:04,000 --> 01:16:10,000 [Estudante] Se só tivemos esa afirmación por si só o que sería o seu aspecto en termos do círculo? 1089 01:16:10,000 --> 01:16:14,000 Se tivésemos x = 13, entón teriamos unha caixa e, en vez de ter unha frecha 1090 01:16:14,000 --> 01:16:16,000 saíndo da caixa de nós deseña-lo como só un 13. 1091 01:16:16,000 --> 01:16:19,000 [Estudante] Na caixa. Okay. 1092 01:16:19,000 --> 01:16:24,000 >> Grazas por asistir, e boa sorte en 0 Quiz. 1093 01:16:24,000 --> 01:16:28,000 [CS50.TV]