1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Semana 2, continuación] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [Esta é CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Todo ben. Este é CS50, e este é o fin de semana 2. 5 00:00:10,990 --> 00:00:14,410 Se esperar a estar con fame volta a esta hora mañá, 6 00:00:14,410 --> 00:00:18,620 sei que nós imos convocar coma un pequeno grupo mañá, xoves, 1:15 pm. 7 00:00:18,620 --> 00:00:21,360 Hai esa URL aquí se desexa RSVP. 8 00:00:21,360 --> 00:00:26,740 O espazo é limitado, polo tanto, por favor, Perdoando o formulario foi cuberto polo tempo que cubrir isto. 9 00:00:26,740 --> 00:00:29,300 Outra URL, con todo, que pode ser de interese é ese. 10 00:00:29,300 --> 00:00:32,369 En só preto de un mes, o curso vai ser facilitado 11 00:00:32,369 --> 00:00:36,890 todo o máis amplamente por EDX, a través do cal as persoas na Internet será capaz de seguir, 12 00:00:36,890 --> 00:00:39,380 implican no curso bastante activa, en realidade. 13 00:00:39,380 --> 00:00:42,270 Eles van estar a usar o aparello CS50 e CS50 Discutir 14 00:00:42,270 --> 00:00:45,490 e na maioría das varias ferramentas de software que xa veñen utilizando este semestre. 15 00:00:45,490 --> 00:00:48,710 E unha das iniciativas que quere asumir como unha experiencia deste ano 16 00:00:48,710 --> 00:00:51,930 é ver o que de contido que pode traducir 17 00:00:51,930 --> 00:00:53,960 noutras linguas faladas e escritas. 18 00:00:53,960 --> 00:00:57,500 Entón, se pode ter interese en participar neste proxecto 19 00:00:57,500 --> 00:01:02,270 cal iremos proporcionar transcricións en inglés e subtítulos para conferencias do curso 20 00:01:02,270 --> 00:01:05,450 e shorts e seminarios e seccións e similares, 21 00:01:05,450 --> 00:01:08,200 se falar fluentemente ou escribir con fluidez outra lingua, 22 00:01:08,200 --> 00:01:12,290 nós queremos involucrar vostede neste proxecto polo cal asume un ou máis dos vídeos, 23 00:01:12,290 --> 00:01:15,200 traducilo las nunha lingua que coñece moi ben. 24 00:01:15,200 --> 00:01:18,700 >> Para darlle un sentido de interface, non hai esa interface de usuario baseada na web 25 00:01:18,700 --> 00:01:22,090 que nós imos usar que pode crear, esencialmente, unha interface de usuario como este. 26 00:01:22,090 --> 00:01:24,290 Isto foi me ensinando uns Halloween atrás, 27 00:01:24,290 --> 00:01:27,390 e no lado dereito alí negro ao lado destes selos de tempo, 28 00:01:27,390 --> 00:01:31,210 vai ver as moitas cousas que saíron da miña boca aquel día, 29 00:01:31,210 --> 00:01:34,850 e abaixo, será capaz de traducir a outra lingua 30 00:01:34,850 --> 00:01:38,690 exactamente o que é o mapeamento entre, neste caso, inglés e, digamos, español. 31 00:01:38,690 --> 00:01:40,440 Entón, é realmente unha ferramenta moi agradable. 32 00:01:40,440 --> 00:01:43,370 Pode retroceder e avanzar moi rapidamente con atallos de teclado. 33 00:01:43,370 --> 00:01:47,490 Entón, se quere participar nesta experiencia e ter as súas palabras visto e lido 34 00:01:47,490 --> 00:01:51,850 por potencialmente miles de persoas alí fóra, por favor, Sinto-se libre para participar. 35 00:01:51,850 --> 00:01:54,350 Unha palabra sobre o gatinho de luns. 36 00:01:54,350 --> 00:02:00,350 Para que non nos enviou unha mensaxe de moi asustado, facer entender que, como suxiren as horas de oficina 37 00:02:00,350 --> 00:02:03,300 e como seccións suxire, o deseño do curso é moi 38 00:02:03,300 --> 00:02:07,360 ter alumnos a colaborar e falando para traballar con conxuntos de problemas 39 00:02:07,360 --> 00:02:11,260 e problemas xuntos, e realmente a liña só vén para abaixo, 40 00:02:11,260 --> 00:02:16,010 novo, o traballo que, en última análise presentar debe ser o seu propio. 41 00:02:16,010 --> 00:02:18,860 E así, sinceramente, en horario de oficina é totalmente normal, 42 00:02:18,860 --> 00:02:22,240 É totalmente de esperar mesmo, para estar falando con algún amigo ao seu lado. 43 00:02:22,240 --> 00:02:24,370 >> Se el ou ela está loitando con algún tema e é como, 44 00:02:24,370 --> 00:02:27,940 "Oh, así, deixe-me dar-lle un reflexo dalgunha liña de código que escribín", que é bo, 45 00:02:27,940 --> 00:02:31,250 o que pasa, e iso é moi favorable, creo que, co proceso de aprendizaxe. 46 00:02:31,250 --> 00:02:36,750 Onde a liña está cruzada é cando a cabeza é unha especie de inclinada aquí para segundo demasiadas 47 00:02:36,750 --> 00:02:41,160 ou minutos para que realmente ser só unha oportunidade de desbloqueo para o seu amigo, 48 00:02:41,160 --> 00:02:44,160 e, por suposto, cando as cousas están trocadas por correo electrónico e Dropbox e afíns, 49 00:02:44,160 --> 00:02:45,640 alí tamén é a liña. 50 00:02:45,640 --> 00:02:48,620 Entón, por todos os medios sentirse cómodo e sentirse estimular a falar cos amigos 51 00:02:48,620 --> 00:02:52,810 e compañeiros sobre serie de exercicios e máis e só entender que o que finalmente presentar 52 00:02:52,810 --> 00:02:57,340 realmente debe ser o produto da súa creación e non outra persoa. 53 00:02:57,340 --> 00:03:00,490 E así un dos problemas específicos de dominio para pset2, 54 00:03:00,490 --> 00:03:04,740 que sairá mañá á noite tarde, e mergullo no mundo da criptografía, 55 00:03:04,740 --> 00:03:08,970 Que é a arte de cifrado ou codificación da información, 56 00:03:08,970 --> 00:03:12,600 e esta última instancia, para o mundo da seguridade. 57 00:03:12,600 --> 00:03:16,560 Agora, a seguridade para a maioría de nós ven en forma de mecanismos moi mundanas. 58 00:03:16,560 --> 00:03:19,050 Todos temos nomes de usuarios e contrasinais, 59 00:03:19,050 --> 00:03:23,450 e todos temos nomes de usuarios e contrasinais moi malas, máis probable. 60 00:03:23,450 --> 00:03:28,240 >> Se o teu contrasinal é o mesmo en varios sitios, que probablemente non é a mellor idea, 61 00:03:28,240 --> 00:03:30,070 como discutir cara finais do semestre. 62 00:03:30,070 --> 00:03:34,720 Se o teu contrasinal está escrito nunha nota - non é broma - no seu monitor, 63 00:03:34,720 --> 00:03:38,350 que tamén non é necesariamente o mellor proxecto, pero un fenómeno bastante común. 64 00:03:38,350 --> 00:03:42,470 E se non está a usar cifrado para cifrar as súas claves, 65 00:03:42,470 --> 00:03:44,210 son particularmente vulnerables. 66 00:03:44,210 --> 00:03:47,270 Entón, se pensas que está a ser super intelixente por un documento de Word oculta 67 00:03:47,270 --> 00:03:49,910 en algún lugar no seu disco duro que ten todas as súas claves 68 00:03:49,910 --> 00:03:53,670 pero é en unha carpeta que ninguén vai buscar, iso non é un mecanismo moi seguro. 69 00:03:53,670 --> 00:03:56,990 E entón o que pset2 ha introducir e esta arte de cifrado 70 00:03:56,990 --> 00:04:02,010 e loitando información para que cousas como claves son as máis seguras. 71 00:04:02,010 --> 00:04:05,790 O contexto aquí é que, con datos inseguros 72 00:04:05,790 --> 00:04:07,930 vén unha oportunidade de criptografía-lo e para embaralhar-lo. 73 00:04:07,930 --> 00:04:11,470 E para que este, por exemplo, é un exemplo dunha mensaxe cifrada. 74 00:04:11,470 --> 00:04:14,700 Isto realmente di algo en inglés, pero claramente non é totalmente obvia. 75 00:04:14,700 --> 00:04:18,279 E imos pechar o círculo hoxe a separar o que esta mensaxe segredo aquí é. 76 00:04:18,279 --> 00:04:23,490 Pero no mundo real dos ordenadores, as cousas nin sequera ollar como poden ser frases en inglés. 77 00:04:23,490 --> 00:04:28,430 Por exemplo, este é o que se pode atopar nun estándar de Linux ou Mac ou ordenador UNIX 78 00:04:28,430 --> 00:04:32,070 nun arquivo que foi outrora chamado de arquivo de contrasinal. 79 00:04:32,070 --> 00:04:34,200 >> Hoxe en día, el foi trasladado para outros lugares. 80 00:04:34,200 --> 00:04:39,210 Pero se ollar no lugar seguro nun sistema, verás que non só o seu nome de usuario 81 00:04:39,210 --> 00:04:43,400 ou doutras persoas no sistema, pero vai ver unha versión cifrada da súa contrasinal. 82 00:04:43,400 --> 00:04:47,980 De feito, a cripta palabra alí suxire que o material que se segue é cifrada, 83 00:04:47,980 --> 00:04:52,680 e esta serie de letras aparentemente aleatorias e personaxes e números e así por diante 84 00:04:52,680 --> 00:04:56,480 pode ser decifrada só por xeralmente sabendo algún segredo - 85 00:04:56,480 --> 00:04:58,840 unha palabra secreta, un número secreto - 86 00:04:58,840 --> 00:05:03,160 e así, de feito, a arte de cifrado, en última análise resúmese a confianza dalgún tipo 87 00:05:03,160 --> 00:05:05,650 e saber algo que alguén non fai. 88 00:05:05,650 --> 00:05:10,090 Entón, imos explorar iso en detalles un pouco máis hoxe e no pset para vir. 89 00:05:10,090 --> 00:05:12,200 E agora unha palabra sobre pasa / fallo. 90 00:05:12,200 --> 00:05:15,360 Especialmente como algúns de vós xa mergullou pset1, o aparello, 91 00:05:15,360 --> 00:05:19,080 e un mundo moi novo para si mesmo, entender que as frustracións e confusión 92 00:05:19,080 --> 00:05:21,700 e só a dificultades técnicas son moi de esperar, 93 00:05:21,700 --> 00:05:24,180 especialmente coa pset primeiro, onde hai tanta cousa nova, 94 00:05:24,180 --> 00:05:27,730 só familiarizarse co ls e CD e todos estes comandos arcanos 95 00:05:27,730 --> 00:05:33,050 e un novo ambiente, e está separado do material real e propia programación. 96 00:05:33,050 --> 00:05:36,940 Entón entendemos tamén que hai certamente expediente que existen como unha estrutura de apoio. 97 00:05:36,940 --> 00:05:38,880 >> Seccións comezan o vindeiro domingo. 98 00:05:38,880 --> 00:05:42,960 Pero o máis importante, se está sentindo só que este non é o mundo para ti, 99 00:05:42,960 --> 00:05:44,710 entender que realmente levan tempo. 100 00:05:44,710 --> 00:05:48,600 E se non fose por esa oportunidade hai anos para me dar un pase de clase / falla, 101 00:05:48,600 --> 00:05:50,990 Honesta, eu nunca tería sequera puxo os pés na aula. 102 00:05:50,990 --> 00:05:53,690 E pode cambiar isto ata, digamos, o luns quinta do curso, 103 00:05:53,690 --> 00:05:58,280 por iso, se está no bordo agora, entender que, no canto de cabeza nalgunhas outras augas completamente, 104 00:05:58,280 --> 00:06:01,260 que seguramente considerar só cambiando a aprobación / reprovação. 105 00:06:01,260 --> 00:06:04,570 De novo, non hai realmente esta cultura aquí en Harvard de levar as cousas de aprobación / reprovação 106 00:06:04,570 --> 00:06:08,670 xa que todo o mundo realmente quere alcanzar ou superar, 107 00:06:08,670 --> 00:06:11,130 pero, francamente, esta é unha boa forma de probar algo fóra 108 00:06:11,130 --> 00:06:16,720 que pode non ser familiar a vostede, e vai acabar facendo, na maioría dos casos, moi ben, 109 00:06:16,720 --> 00:06:18,210 quizais a súa sorpresa. 110 00:06:18,210 --> 00:06:20,980 E, en termos máis concretos, o que eu creo que pasa / fallo xeralmente fai, 111 00:06:20,980 --> 00:06:22,940 especialmente no que se pode probar con pset0, 112 00:06:22,940 --> 00:06:26,560 se pór en 10 horas, 15 horas, 25 horas nalgúns pset 113 00:06:26,560 --> 00:06:29,920 e só está bater a cabeza contra a parede e está quedando super tarde da noite 114 00:06:29,920 --> 00:06:33,950 pero tomou os 90% pset do camiño e simplemente non pode descubrir unha cousa, 115 00:06:33,950 --> 00:06:36,520 pasa / falla realmente leva a bordo fora dunha clase como esta, 116 00:06:36,520 --> 00:06:39,100 onde podes Ordenar dicir afortunadamente, "Ok, sei que non é perfecto, 117 00:06:39,100 --> 00:06:42,350 pero eu traballei para caramba sobre iso, eu estou moi feliz con o lugar onde acabou " 118 00:06:42,350 --> 00:06:44,850 e que van atender as expectativas de aprobación / reprovação. 119 00:06:44,850 --> 00:06:47,540 Así que manter isto presente. Todo ben. 120 00:06:47,540 --> 00:06:50,520 >> Entón, aqueles de vostedes que teñen se pretensado para usar a Universidade de Harvard Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 sei que hai un SSID CS50, unha conexión Wi-Fi, flotando 122 00:06:54,780 --> 00:06:56,490 que pode ter mellor sorte para. 123 00:06:56,490 --> 00:07:00,130 É un pouco irónico que o contrasinal que se quere tentar conectar a este 124 00:07:00,130 --> 00:07:08,350 para as velocidades mellores - e déixenos saber se non é mellor - é 12345, todo o camiño ata o 8 125 00:07:08,350 --> 00:07:10,910 8, porque é máis seguro que 5. 126 00:07:10,910 --> 00:07:16,910 Entón, se precisa de contrasinal de acceso Wi-Fi, conectar-se sen fíos CS50 aquí, 12345678, 127 00:07:16,910 --> 00:07:20,380 e puxo en CS50 Discutir se aínda ten problemas intermitentes de conectividade, 128 00:07:20,380 --> 00:07:25,420 e imos deixar que os poderes que coñece a este espazo. Todo ben. 129 00:07:25,420 --> 00:07:32,230 Entón, un teaser rápido, especialmente para aqueles de vostedes que son nenos ou nenas de fans de Apple de todo as cousas. 130 00:07:32,230 --> 00:07:37,460 O que eu retirado uns anos era este ficheiro aquí, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 só para o tipo de facer máis concreto e máis complexo 132 00:07:39,930 --> 00:07:42,560 algúns dos programas máis básicos C que teño escrito. 133 00:07:42,560 --> 00:07:46,910 Entón eu abri-lo arquivo, iUnlock.c. Está dispoñible na páxina de conferencias para hoxe. 134 00:07:46,910 --> 00:07:49,810 No lado esquerdo podes ver unha longa lista de funcións. 135 00:07:49,810 --> 00:07:53,230 Así, o suxeito que escribiu este escribiu unha morea de funcións, máis que de inicio. 136 00:07:53,230 --> 00:07:57,340 El usou unha morea de bibliotecas aquí, e comezar a percorrer, 137 00:07:57,340 --> 00:08:04,890 o que dicir realmente é, é o primeiro de crack, eu creo, para o iPhone orixinal. 138 00:08:04,890 --> 00:08:09,830 >> Cando quería facer o Jailbreak do iPhone orixinal, o que significa untether os da AT & T 139 00:08:09,830 --> 00:08:13,710 e realmente instalar un programa especial sobre el e facer as cousas que Apple non quere que as persoas fan, 140 00:08:13,710 --> 00:08:18,480 alguén tivo tempo para descubrir exactamente como eles poderían explotar erros de software, 141 00:08:18,480 --> 00:08:22,690 erros, erros en programas de Apple, e así naceu iUnlock.c - 142 00:08:22,690 --> 00:08:26,760 que se compilou no seu ordenador e instala-lo en un iPhone 143 00:08:26,760 --> 00:08:29,430 que foi conectado ao ordenador a través de, por exemplo, un cable USB, 144 00:08:29,430 --> 00:08:32,450 isto lle daría privilexios administrativos ou raíz no seu iPhone 145 00:08:32,450 --> 00:08:34,620 e deixalo facer practicamente o que quere. 146 00:08:34,620 --> 00:08:36,400 E así houbo este gato fascinante e rato 147 00:08:36,400 --> 00:08:39,340 entre a Apple eo resto do mundo, en particular no que, como moitas empresas, 148 00:08:39,340 --> 00:08:43,350 tentar bloquear as súas cousas para abaixo así que só pode facer con el o que pretenden. 149 00:08:43,350 --> 00:08:47,360 Pero, grazas a xente como esta e para a comprensión de detalles de baixo nivel - 150 00:08:47,360 --> 00:08:50,830 e, neste caso, de programación C - e moitas das construcións coñecidas 151 00:08:50,830 --> 00:08:55,280 que xa comezou a xogar con, vostede é capaz de realmente aproveitar o hardware 152 00:08:55,280 --> 00:08:59,250 dunha maneira que pensar mellor e non necesariamente unha entidade corporativa. 153 00:08:59,250 --> 00:09:01,600 Así, por exemplo, eu non teño idea do que todo isto está facendo, 154 00:09:01,600 --> 00:09:03,580 GetVersion pero soa moi sinxelo, 155 00:09:03,580 --> 00:09:05,710 e parece que esta é unha función que a persoa escribiu. 156 00:09:05,710 --> 00:09:09,250 É preciso algún tipo de número enteiro como argumento, non retorna nada, 157 00:09:09,250 --> 00:09:13,710 pero parece loop cun lazo e un aquí a condición, se a interrupción condición, 158 00:09:13,710 --> 00:09:16,770 e dalgunha forma relacionado con números de versión desprazarse cara a abaixo, 159 00:09:16,770 --> 00:09:19,650 aínda que moitas destas palabras clave vai ser novo. 160 00:09:19,650 --> 00:09:22,590 E hai toda unha serie de funcións no aquí nunca vimos e quizais nunca máis ver 161 00:09:22,590 --> 00:09:24,350 ao longo do semestre. 162 00:09:24,350 --> 00:09:29,160 >> Ao final do día, el segue as mesmas regras e lóxica que vimos xogar ata agora. 163 00:09:29,160 --> 00:09:34,340 Polo tanto, este é vello de máis para romper o seu iPhone ou 3s 4s 5S ou logo estes días, 164 00:09:34,340 --> 00:09:38,830 pero sei que está todo moi derivado deste mundo que nos mergullou. 165 00:09:38,830 --> 00:09:42,280 Imos dar un ollo a un exemplo un pouco máis simple: 166 00:09:42,280 --> 00:09:46,260 este, só para quentar cunha sintaxe e tamén outro tipo de datos 167 00:09:46,260 --> 00:09:48,910 que temos falado, pero realmente non teño visto en C. 168 00:09:48,910 --> 00:09:53,670 Este é un ficheiro chamado positive1.c, e por os comentarios na parte superior, 169 00:09:53,670 --> 00:09:56,070 este só esixe que o usuario facilite un número positivo. 170 00:09:56,070 --> 00:09:59,910 Entón, é un exemplo de un loop do-tempo, o que é bo para os programas de usuario interactivas 171 00:09:59,910 --> 00:10:02,070 onde cómpre dicir ao usuario para facer algo, 172 00:10:02,070 --> 00:10:05,530 e se eles non cooperaren vostede gritar con eles ou rexeitar a súa entrada. 173 00:10:05,530 --> 00:10:10,480 Caso en cuestión: Eu vou facer liñas de 19 a 24 174 00:10:10,480 --> 00:10:14,620 sempre que o usuario non teña me deu un número positivo. 175 00:10:14,620 --> 00:10:21,340 Este detalle aquí na liña 18, por que eu declarar n riba deste looping toda construción 176 00:10:21,340 --> 00:10:26,870 en oposición á dereita ao lado da liña 22, onde realmente importan para n? Si 177 00:10:26,870 --> 00:10:29,330 [Alumno] Alcance. >> Si, entón esa cuestión da eido. 178 00:10:29,330 --> 00:10:31,770 E, en termos leigos, o que ámbito se refire? 179 00:10:34,880 --> 00:10:41,560 Si >> [Resposta do alumno inaudível] >> Podes falar un pouco máis alto? 180 00:10:41,560 --> 00:10:45,440 [Alumno] Onde podes acceder a esta variable. >> Perfecto. 181 00:10:45,440 --> 00:10:47,610 Onde podes acceder a unha determinada variable. 182 00:10:47,610 --> 00:10:50,990 E, xeralmente, a regra de ouro ata agora foi a de que o alcance dalgunhas variables 183 00:10:50,990 --> 00:10:56,140 é definido polas claves máis recentes rizados que xa viu. 184 00:10:56,140 --> 00:11:03,070 >> E por iso, neste caso, se eu cometín o erro de declarar n na liña 22, que a liña ía traballar. 185 00:11:03,070 --> 00:11:10,840 Quere obter un int, e quere poñelas en que n variable na liña 22, 186 00:11:10,840 --> 00:11:17,060 pero que liña de código que agora non teñen idea do que estou falando? >> [Alumno] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, e verifica-se 24, pero tamén porque, neste caso, está fóra das claves. 188 00:11:23,840 --> 00:11:28,550 Entón, un pouco de problema, pero moi doado de resolver, pode declarar a variable 189 00:11:28,550 --> 00:11:30,700 fóra da propia función. 190 00:11:30,700 --> 00:11:32,760 Imos ver máis tarde hoxe pode ir un paso máis aló 191 00:11:32,760 --> 00:11:34,940 e pode ata quedar un pouco preguiceiro. 192 00:11:34,940 --> 00:11:39,660 E iso non é recomendado en xeral, pero pode ata ir con preguiza 193 00:11:39,660 --> 00:11:44,150 e poñer unha variable global, por así dicir, e non dentro dunha función, e non dentro dun loop, 194 00:11:44,150 --> 00:11:49,800 pero no propio arquivo, fóra de todas as funcións que escribiu, como eu fixen aquí en liña 15. 195 00:11:49,800 --> 00:11:55,220 Este é xeralmente desaprovado, pero que esta é unha solución, por veces, a outros problemas, 196 00:11:55,220 --> 00:11:56,910 como vai finalmente ver. 197 00:11:56,910 --> 00:11:59,500 Entón, por agora, imos deixalo así, pero imos ver se podemos reescribir esa 198 00:11:59,500 --> 00:12:02,360 só para comezar a expresar-nos un pouco diferente. 199 00:12:02,360 --> 00:12:05,550 Este programa, só para quedar claro, é positive1. 200 00:12:05,550 --> 00:12:11,980 Deixe-me ir á fronte e aquí na miña xanela de terminal facer positive1, Intro. 201 00:12:11,980 --> 00:12:15,080 Compila ben. Vou correr positive1, prema Intro. 202 00:12:15,080 --> 00:12:19,250 Eu esixo que me dea un número enteiro positivo. Eu vou dicir -1. Isto non funcionou. 203 00:12:19,250 --> 00:12:22,340 0, 99. Que parece funcionar. 204 00:12:22,340 --> 00:12:25,310 Quizais non a proba máis rigoroso, pero polo menos é un bo test de sanidade 205 00:12:25,310 --> 00:12:27,100 que estamos no camiño correcto. 206 00:12:27,100 --> 00:12:29,570 >> Entón, agora deixe-me ir adiante e abra a versión 2 do presente, 207 00:12:29,570 --> 00:12:32,800 eo que é diferente xa? 208 00:12:32,800 --> 00:12:39,030 El aplica a mesma cousa, pero o que está pulando fóra tan claramente distinto desta vez? 209 00:12:40,790 --> 00:12:47,090 Este bool en verde. Destaca no verde, esta palabra clave coñecida como bool, que é un tipo de datos. 210 00:12:47,090 --> 00:12:50,510 El non vén construído en todas as versións de C. 211 00:12:50,510 --> 00:12:52,650 Debe incluír unha biblioteca específica. 212 00:12:52,650 --> 00:12:56,460 No noso caso, eu incluída a biblioteca CS50 para que teñamos acceso a bool. 213 00:12:56,460 --> 00:12:59,860 Pero, na liña 18, parece que temos un valor booleano aquí chamado agradecido. 214 00:12:59,860 --> 00:13:02,190 Eu podería ter chamado este nada, pero eu chamei-lle grata 215 00:13:02,190 --> 00:13:04,750 só para transmitir algún tipo de significado semántico. 216 00:13:04,750 --> 00:13:07,700 Polo tanto, inicialmente na liña 18, eu non son aparentemente grata 217 00:13:07,700 --> 00:13:12,230 porque o valor booleano grata é inicializar como false na liña 18. 218 00:13:12,230 --> 00:13:16,500 E entón parece que eu fixen aquí en liñas de 21 a 23 219 00:13:16,500 --> 00:13:19,200 é que eu teño só unha especie de reescrita miña lóxica. 220 00:13:19,200 --> 00:13:26,100 Polo tanto, non funcionalmente diferente, pero na liña 22 agora comprobar que o int usuario proporcionou 221 00:13:26,100 --> 00:13:31,360 é maior que 0, entón eu simplemente cambiar o valor de grata a verdade. 222 00:13:31,360 --> 00:13:35,590 E por que eu faría iso? Porque, na liña 25, ao parecer, eu estou indo para comprobar unha condición. 223 00:13:35,590 --> 00:13:39,760 Fai iso loop while grata é falsa. 224 00:13:39,760 --> 00:13:42,960 Entón eu propuxen iso como unha alternativa á versión 1 225 00:13:42,960 --> 00:13:47,050 porque é polo menos un pouco máis intuitivo, quizais, sexa un pouco máis fundamentada en inglés. 226 00:13:47,050 --> 00:13:51,980 Entón faga o seguinte mentres non está grata ou agradecido mentres é falso. 227 00:13:51,980 --> 00:13:56,220 E esta vez tamén eu, ao parecer, non se preocupan en lembrar o que o usuario introduciu 228 00:13:56,220 --> 00:14:00,050 porque non hai ningún aviso n variable, polo tanto, en realidade, unha pequena mentira alí. 229 00:14:00,050 --> 00:14:03,290 >> Funcionalmente, o programa é un pouco diferente, xa que chegar ao fondo da cuestión 230 00:14:03,290 --> 00:14:04,960 porque eu non estou lembrando que n é. 231 00:14:04,960 --> 00:14:09,120 Pero eu quería demostrar aquí tamén que aínda que vimos GetInt 232 00:14:09,120 --> 00:14:13,780 e GetString a empregar no lado da man dereita de un sinal de igual ata agora 233 00:14:13,780 --> 00:14:17,310 para que recordar o valor, tecnicamente, iso non é estrictamente necesario. 234 00:14:17,310 --> 00:14:20,290 Se por calquera motivo vostede simplemente non lles importa para salvar o valor, 235 00:14:20,290 --> 00:14:25,540 quere só comprobar o valor, observe que podemos simplemente escribir isto como GetInt, 236 00:14:25,540 --> 00:14:27,320 aberto paren, paren preto. 237 00:14:27,320 --> 00:14:30,570 Esta función devolverá un valor, como temos benvida a dicir. 238 00:14:30,570 --> 00:14:32,220 Vai dar de volta un int. 239 00:14:32,220 --> 00:14:34,460 E se pensas que mentalmente de isto acontecer, 240 00:14:34,460 --> 00:14:38,190 cando inserir 99, GetInt retorna o número 99, 241 00:14:38,190 --> 00:14:41,840 e así, conceptualmente, é coma se o meu código eran, en realidade iso. 242 00:14:41,840 --> 00:14:45,950 Entón, se 99 é de feito maior que 0, entón grata se fai realidade, 243 00:14:45,950 --> 00:14:50,810 despois a liña 25 realiza Ooh, estamos a facer porque eu son grata agora, 244 00:14:50,810 --> 00:14:53,970 e na liña 26, nós simplemente dicir: "Grazas pola enteiro positivo!" 245 00:14:53,970 --> 00:14:55,960 o que quere que estivese. 246 00:14:55,960 --> 00:14:59,140 Agora imos facer azucre sintático lixeiro aquí, por así dicir. 247 00:14:59,140 --> 00:15:04,670 Imos ver se conseguimos limpar esa liña 25 con esta variante terceiro e último positive3. 248 00:15:04,670 --> 00:15:13,600 >> Observe a única diferenza agora é que liña de código? >> [Alumno] 25. >> [Malan] Si, 25. 249 00:15:13,600 --> 00:15:17,680 E nós non temos realmente visto este truco aínda, pero fixo ver o punto de exclamación o luns, 250 00:15:17,680 --> 00:15:21,070 que denota o que? >> [Alumno] non. Non >> ou denegación. 251 00:15:21,070 --> 00:15:23,510 Entón, ter un valor booleano e virar o seu valor. 252 00:15:23,510 --> 00:15:25,810 Torna-se certo, o falso se fai certo. 253 00:15:25,810 --> 00:15:30,420 Así, gustaríame propoñer, é ata un pouco máis intuitiva xeito de escribir o código 254 00:15:30,420 --> 00:15:33,430 porque eu aínda arrincar grata a falsa, aínda facer o seguinte, 255 00:15:33,430 --> 00:15:36,010 Eu define grata a verdade cando chegue a hora, 256 00:15:36,010 --> 00:15:40,880 pero agora pode realmente só traducir este código verbalmente esquerda a dereita, 257 00:15:40,880 --> 00:15:45,630 while (grato!);, porque o signo de admiración ou estrondo denota a noción de non, 258 00:15:45,630 --> 00:15:47,580 Así, aínda que non grata. 259 00:15:47,580 --> 00:15:49,900 Entón, de novo, non introduciron novos conceptos en si. 260 00:15:49,900 --> 00:15:53,730 Nós conversas sobre booleanos atrás cando nós tocamos co scratch, 261 00:15:53,730 --> 00:15:56,720 pero entendo agora podemos só comezar a escribir o noso código de moitas maneiras diferentes. 262 00:15:56,720 --> 00:16:01,060 Así, especialmente no pset1 se é unha especie de loita para descubrir a forma de escribir algún programa, 263 00:16:01,060 --> 00:16:04,340 probabilidades son que está con sorte, porque non pode haber ningún número de solucións 264 00:16:04,340 --> 00:16:06,110 que pode ocorrer enriba. 265 00:16:06,110 --> 00:16:10,500 Por exemplo, esta é só a 3, mesmo para o máis simple dos programas. Todo ben. 266 00:16:10,500 --> 00:16:14,200 E agora lembrar o luns que deixou esta nota con valores de retorno. 267 00:16:14,200 --> 00:16:18,450 Así, a primeira vez que escribiu nun programa que non só principal; 268 00:16:18,450 --> 00:16:22,550 tamén ten a súa propia función personalizada que escribín aquí. 269 00:16:22,550 --> 00:16:26,810 Así, na liña 31 a 34 eu apliquei unha función cubo. 270 00:16:26,810 --> 00:16:30,240 Non é complexo. É só a * a * a neste caso. 271 00:16:30,240 --> 00:16:34,750 Pero o que é importante sobre o que é que eu estou tendo entrada en forma de 272 00:16:34,750 --> 00:16:39,180 e estou retornando saída baixo a forma dun * a * a. 273 00:16:39,180 --> 00:16:43,560 Entón agora eu teño a capacidade, tanto como eu adoitaba facer prinf só, 274 00:16:43,560 --> 00:16:47,240 chamar esta función chamando a función cubo. 275 00:16:47,240 --> 00:16:51,970 >> E a función cubo ten algunha entrada, ea función cubo retorna algunha saída. 276 00:16:51,970 --> 00:16:56,960 Por outra banda, printf só fixen algo. 277 00:16:56,960 --> 00:17:00,840 El non devolveu algo que importaba, aínda que como un aparte non voltar un valor; 278 00:17:00,840 --> 00:17:03,110 normalmente só ignore-lo. 279 00:17:03,110 --> 00:17:06,510 Printf só fixen algo. El tiña un efecto colateral de impresión á pantalla. 280 00:17:06,510 --> 00:17:11,770 En contraste aquí, temos a función de cubo, que en realidade volve algo. 281 00:17:11,770 --> 00:17:15,520 Polo tanto, para aqueles familiarizados con este, que é unha idea moi sinxelo. 282 00:17:15,520 --> 00:17:19,640 Pero, para os menos familiarizados coa idea de pasar entradas e saídas de volver, 283 00:17:19,640 --> 00:17:21,950 imos tentar só algo simple super. 284 00:17:21,950 --> 00:17:25,490 Alguén está cómodo chegando no escenario brevemente? 285 00:17:25,490 --> 00:17:28,040 Ten que estar cómodo con unha cámara tamén. Si? Okay. 286 00:17:28,040 --> 00:17:31,240 Cal é o seu nome? >> [Alumno] Ken. >> Ken. Todo ben. Ken, imos alí cara arriba. 287 00:17:31,240 --> 00:17:35,050 Ken vai ser unha función do tipo aquí. 288 00:17:35,050 --> 00:17:38,720 Imos adiante e facelo. Imos pegar un pouco de fantasía. 289 00:17:38,720 --> 00:17:42,260 Pracer de coñece lo. Benvido ao centro do escenario. Todo ben. 290 00:17:42,260 --> 00:17:46,640 Imos bater este botón aquí. Todo ben. 291 00:17:46,640 --> 00:17:49,820 Entón aquí tes un cadro moderno, 292 00:17:49,820 --> 00:17:53,470 eo que eu son é a función principal, por exemplo, 293 00:17:53,470 --> 00:17:56,460 e eu non teño un iPad na man. 294 00:17:56,460 --> 00:17:59,710 >> Eu realmente non me lembro como - Ben, eu non podo dicir iso. 295 00:17:59,710 --> 00:18:02,480 Eu realmente non teño boa caligrafía, 296 00:18:02,480 --> 00:18:05,520 e así, polo tanto, quero que imprimir algo na pantalla para min. 297 00:18:05,520 --> 00:18:12,040 Eu estou sendo o programa principal, e eu vou ter que dicir isto 298 00:18:12,040 --> 00:18:16,720 escribindo no meu cero polo e logo pasando-lle unha entrada. 299 00:18:16,720 --> 00:18:20,400 Tan parvo que este exercicio é, a noción de funcións e chamar a unha función 300 00:18:20,400 --> 00:18:22,400 e retornando dunha función en realidade se reduce a iso. 301 00:18:22,400 --> 00:18:26,260 Estou principal, que acabo de escribir printf, algo entre comiñas na pantalla, 302 00:18:26,260 --> 00:18:29,110 Estou executando este programa, e logo que printf é chamado, 303 00:18:29,110 --> 00:18:32,880 é preciso un argumento ou un parámetro, por veces, entre comiñas dobres. 304 00:18:32,880 --> 00:18:35,880 Aquí é que o argumento. Estou pasando para Ken. 305 00:18:35,880 --> 00:18:39,020 El é unha caixa negra escrito un número de anos 306 00:18:39,020 --> 00:18:41,510 que, ao parecer, só sabe como imprimir cousas na pantalla. 307 00:18:41,510 --> 00:18:43,150 Entón executar. 308 00:18:49,280 --> 00:18:51,280 Isto non é malo. Moi bo. 309 00:18:51,280 --> 00:18:55,510 Entón, agora está feito Ken execución. Será que precisa me dar nada a cambio? 310 00:18:55,510 --> 00:18:57,470 Non é que vimos ata agora. 311 00:18:57,470 --> 00:19:00,460 Unha vez máis, printf fai realmente voltar un número, pero imos ignorar que, por agora 312 00:19:00,460 --> 00:19:03,470 porque nunca usei. Entón é iso para Ken. 313 00:19:03,470 --> 00:19:08,580 E agora principal asume o control do programa de novo 314 00:19:08,580 --> 00:19:11,060 porque esa liña de código, printf, está feita a execución. 315 00:19:11,060 --> 00:19:14,050 E nós imos sobre o noso camiño, executando as outras liñas están alí. 316 00:19:14,050 --> 00:19:17,320 Entón, agora imos tratar un exemplo un pouco diferente. 317 00:19:17,320 --> 00:19:24,940 Esta vez, aquí imos primeiro limpar a pantalla, e esta vez imos facer a función de cubagem, 318 00:19:24,940 --> 00:19:27,080 pero esta vez, espero un valor de saída. 319 00:19:27,080 --> 00:19:29,180 >> Entón, imos adiante e facelo. 320 00:19:29,180 --> 00:19:35,790 Agora eu teño unha liña de código que se x recibe cubo de x. 321 00:19:41,370 --> 00:19:46,370 A liña de código, recall, queda así: x = cubo (x); 322 00:19:46,370 --> 00:19:50,930 Entón, como é que isto vai funcionar? Imos adiante e dar-lle unha pantalla branca de novo. 323 00:19:50,930 --> 00:19:54,070 Eu vou escribir agora o valor de x, 324 00:19:54,070 --> 00:20:01,400 que, neste momento pasa a ser, digamos, de 2 a mantelo simple. 325 00:20:01,400 --> 00:20:06,150 Eu escribín nun anaco de papel o valor 2, que é o meu valor x. 326 00:20:06,150 --> 00:20:10,920 Eu entregalo a Ken. >> E eu só escribir a resposta? >> Si, imos só escribir a resposta. 327 00:20:12,760 --> 00:20:18,940 Okay. E agora ten que volver-me algo. Perfecto. Segue agradable. 328 00:20:18,940 --> 00:20:23,120 Entón, agora me dá de volta o valor de 8, neste caso, eo que fago con el? 329 00:20:23,120 --> 00:20:28,250 En realidade - imos ver, obter este dereito. O que eu vou facer con el? 330 00:20:28,250 --> 00:20:33,440 Agora eu vou levar ese valor e, de feito, almacena-lo nos mesmos bits na memoria. 331 00:20:33,440 --> 00:20:35,170 Pero repare que eu son o tipo de loita aquí. 332 00:20:35,170 --> 00:20:38,210 Estou un pouco confuso, porque onde eu realmente escribir o valor de x, 333 00:20:38,210 --> 00:20:43,150 porque o que eu acaba de facer é Ken fisicamente man dun anaco de papel que tiña o valor 2, 334 00:20:43,150 --> 00:20:46,590 que era x, e, de feito, iso é precisamente o que pasou. 335 00:20:46,590 --> 00:20:50,210 Así, verifícase que cando chamar a función e pasar un argumento 336 00:20:50,210 --> 00:20:53,290 como Ola, mundo ou pasa un argumento como 2, 337 00:20:53,290 --> 00:20:57,110 xeralmente, está pasando unha copia do argumento. 338 00:20:57,110 --> 00:21:00,730 E como eu escribín o número 2 aquí e entregouna a Ken, 339 00:21:00,730 --> 00:21:04,720 iso debe significar que eu aínda teño unha copia do valor de dous en algún lugar 340 00:21:04,720 --> 00:21:08,890 porque en realidade, agora que eu comece de novo o valor 8, eu teño volver na memoria RAM 341 00:21:08,890 --> 00:21:12,130 e realmente escribir 8, onde unha vez eu tiven o número 2. 342 00:21:12,130 --> 00:21:16,950 Así, visualmente, lembre-se esta noción de paso en, literalmente, unha copia do valor. 343 00:21:16,950 --> 00:21:20,780 >> Ken fai a súa cousa, me dá de volta algo - neste caso un valor como 8 - 344 00:21:20,780 --> 00:21:24,980 e entón eu teño que facer algo con ese valor, se eu queira mantelo por preto. 345 00:21:24,980 --> 00:21:29,650 Entón, todo isto vai volver a ser todo moi familiar antes de tempo. 346 00:21:29,650 --> 00:21:34,920 Moitas grazas por esta demo aquí, Ken. [Aplausos] 347 00:21:34,920 --> 00:21:36,920 Moi ben feito. 348 00:21:36,920 --> 00:21:42,690 Imos ver como é que, en última análise relaciónase con algunhas das funcións de chamada que estamos facendo aquí. 349 00:21:42,690 --> 00:21:47,910 Deixe-me ir adiante e nos traer de volta ao exemplo cubagem aquí. 350 00:21:47,910 --> 00:21:53,300 Teña en conta que, se queremos realmente comezar a tomar isto aínda máis, 351 00:21:53,300 --> 00:21:57,570 imos ter que estar atentos ao feito de que o número x que está a ser pasado aquí 352 00:21:57,570 --> 00:22:01,530 é diferente do que realmente está a ser pasado para a función. 353 00:22:01,530 --> 00:22:05,880 Entón, de novo, este pase por copia vai tornar-se bastante pertinente en só un momento. 354 00:22:05,880 --> 00:22:09,580 Imos dar un ollo a algo que non funciona moi ben certo aínda. 355 00:22:09,580 --> 00:22:13,250 Eu estou indo a ir adiante e abrir un exemplo de buggy terceiro, que é fallo por natureza, 356 00:22:13,250 --> 00:22:18,550 e chámase buggy3 e implementa unha función de cambio. 357 00:22:18,550 --> 00:22:25,110 Aquí temos unha función principal que X e Y arbitrariamente inicializar con 1 e 2, respectivamente. 358 00:22:25,110 --> 00:22:27,700 Nós poderiamos usar GetInt, pero só precisa dun simple exercicio 359 00:22:27,700 --> 00:22:30,170 entón é codificado como 1 e 2. 360 00:22:30,170 --> 00:22:35,340 Nas liñas 21 e 22, que, ao parecer, imprimir X e Y, 1 por liña. 361 00:22:35,340 --> 00:22:39,720 A continuación, na liña 23, eu afirmo que estou cambiando estes valores, punto, punto, punto. 362 00:22:39,720 --> 00:22:44,170 Eu aparentemente chamar unha función na liña 24 intercambio de chamada que leva dous argumentos. 363 00:22:44,170 --> 00:22:48,300 É totalmente lexítimo para funcións de tomar dous argumentos. Vimos printf facelo xa. 364 00:22:48,300 --> 00:22:51,830 >> Entón intercambio aparentemente leva x e y, e como o propio nome suxire, 365 00:22:51,830 --> 00:22:54,670 Espero que vai cambiar estes dous valores. 366 00:22:54,670 --> 00:23:00,090 Entón eu reclamar na liña 25 "trocados!" e I reimprimir X e Y 367 00:23:00,090 --> 00:23:03,070 baixo a suposición de que realmente foron trocados. 368 00:23:03,070 --> 00:23:06,080 Pero se realmente executar este programa - deixe-me abrir unha xanela de terminal, 369 00:23:06,080 --> 00:23:09,860 deixe-me facer buggy3 - como o nome suxire, iso non vai acabar ben 370 00:23:09,860 --> 00:23:15,770 porque cando prema Intro, observe que x é 1, y é 2, 371 00:23:15,770 --> 00:23:19,420 e aínda, ao final do programa, eles aínda son, de feito, o mesmo. 372 00:23:19,420 --> 00:23:22,960 Así, con base na demostración só agora con Ken, o que está realmente a suceder? 373 00:23:22,960 --> 00:23:28,710 Imos mergullo esta función de intercambio. É super curto. É só unhas liñas de código longo. 374 00:23:28,710 --> 00:23:34,520 Pero cal é o problema fundamental, baseado na historia sinxela contada aquí con Ken? 375 00:23:34,520 --> 00:23:36,670 Por que o intercambio de partido? 376 00:23:36,670 --> 00:23:39,660 [Alumno] Está almacenando a unha copia, e non variable. 377 00:23:39,660 --> 00:23:43,980 Exactamente. Estamos almacenando a unha copia, e non a propia variable. 378 00:23:43,980 --> 00:23:47,170 Noutras palabras, cambio aparentemente leva dous argumentos, un int, 379 00:23:47,170 --> 00:23:49,370 e é chamada arbitrariamente a e b, 380 00:23:49,370 --> 00:23:54,420 e aquí eu pase en X e Y, que son, respectivamente, 1 e 2, 381 00:23:54,420 --> 00:23:58,770 pero eu non estou literalmente pasando x, eu non estou literalmente pasando y, 382 00:23:58,770 --> 00:24:01,450 Estou pasando unha copia de X e unha copia do y. 383 00:24:01,450 --> 00:24:04,510 É case como se copiado e pegado a cambio 384 00:24:04,510 --> 00:24:07,810 os valores que quere que realmente manipular. 385 00:24:07,810 --> 00:24:14,480 Entón, se ese é o caso, cando o inicio do programa executando a liña 35, entón 36, 386 00:24:14,480 --> 00:24:18,650 cando chegar á liña 37, neste punto da historia, o que é o valor dunha? 387 00:24:21,040 --> 00:24:25,050 Neste punto da historia, liña 37, que é o valor dun, neste punto? >> [Alumno] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Debe ser só un, non, porque x foi pasado como o primeiro argumento, 389 00:24:29,280 --> 00:24:33,080 e esta función só arbitrariamente está chamando o seu primeiro argumento un. 390 00:24:33,080 --> 00:24:38,200 Do mesmo xeito é y segundo argumento, e é só arbitrariamente chamar a b segundo argumento. 391 00:24:38,200 --> 00:24:40,990 >> Esta dicotomía é realmente moi sinxelo explicou. Pense sobre iso. 392 00:24:40,990 --> 00:24:43,320 Ningún de nós coñeceu a persoa que escribiu printf, 393 00:24:43,320 --> 00:24:50,770 así, certamente, el ou ela non ten idea do que as nosas variables 30 anos máis tarde vai ser chamado. 394 00:24:50,770 --> 00:24:56,650 Entón, ten que haber unha distinción entre o que chama de variables en funcións que está escribindo 395 00:24:56,650 --> 00:25:02,080 e que vostedes chaman de variables en funcións que está chamando ou usar. 396 00:25:02,080 --> 00:25:05,340 Polo tanto, noutras palabras, eu escribín os meus variables como X e Y, 397 00:25:05,340 --> 00:25:08,890 pero se alguén tiña escrito a función de intercambio, el ou ela certamente non sabería 398 00:25:08,890 --> 00:25:10,690 o que os meus variables van ser chamados, 399 00:25:10,690 --> 00:25:13,830 para entender que é por iso que ten esta dualidade de nomes. 400 00:25:13,830 --> 00:25:16,750 Tecnicamente, eu podería facelo por coincidencia, 401 00:25:16,750 --> 00:25:20,080 pero eles aínda ser pasado como copias. 402 00:25:20,080 --> 00:25:23,650 Sería só pura coincidencia esteticamente se esa persoa que escribiu cambio 403 00:25:23,650 --> 00:25:26,150 usara os mesmos nomes. 404 00:25:26,150 --> 00:25:32,370 Polo tanto, neste punto da historia, liña 37, un é 1, B e 2, e agora debo proceder para trocalos. 405 00:25:32,370 --> 00:25:34,900 Primeiro de todo, deixe-me realmente facelo moito máis simple. 406 00:25:34,900 --> 00:25:36,690 Eu non sei o que estas tres liñas de código foron facendo. 407 00:25:36,690 --> 00:25:41,210 Deixe-me facer isto: b = a, a = b; feito. 408 00:25:41,210 --> 00:25:44,690 Por que iso é roto, loxicamente? 409 00:25:46,490 --> 00:25:48,900 É o tipo de cousa intuitiva, non? 410 00:25:48,900 --> 00:25:52,560 Así, torna-se e ab b torna-se, 411 00:25:52,560 --> 00:25:57,730 pero o problema é que, logo que liña 37 é executado, o que é o valor a e b? 412 00:25:57,730 --> 00:26:03,410 O mesmo, 1, porque derrotado, por así dicir, vostede cambiou b para igualar un. 413 00:26:03,410 --> 00:26:08,890 Polo tanto, unha vez liña 37 foi executado, iso é óptimo, agora tes dúas copias do número 1 414 00:26:08,890 --> 00:26:13,350 dentro desta función, así entón cando di na liña 38 a = b, 415 00:26:13,350 --> 00:26:17,640 está ferrado tipo de porque está só a asignación de 1 a 1. 416 00:26:17,640 --> 00:26:20,580 Vostede medio que perdín o valor que se preocupaba. 417 00:26:20,580 --> 00:26:23,220 Así, na versión orixinal do presente, observe o que eu fixen. 418 00:26:23,220 --> 00:26:26,850 Eu en vez tivo unha terceira liña de código que era así. 419 00:26:26,850 --> 00:26:28,580 Eu declaro dunha variable temporal. 420 00:26:28,580 --> 00:26:32,170 >> Tmp é un nome moi común para unha variable temporal, e é un int 421 00:26:32,170 --> 00:26:34,580 porque ten que coincidir co que quero facer unha copia. 422 00:26:34,580 --> 00:26:39,770 Eu gardar copia dun dentro tmp, entón cando liña 37 foi executado, 423 00:26:39,770 --> 00:26:45,860 o valor de a é - verificación de sanidade rápido - 1, o valor de b é 2, 424 00:26:45,860 --> 00:26:48,970 e o valor do tmp tamén é 1. 425 00:26:48,970 --> 00:26:52,060 Entón agora eu executar a liña 38. 426 00:26:52,060 --> 00:27:00,540 Unha vez liña 38 é executado, unha toma o valor de b. B foi de 2, así que unha é agora 2. 427 00:27:00,540 --> 00:27:05,210 Así, neste punto da historia, a é 2, B e 2 e tmp é 1, 428 00:27:05,210 --> 00:27:11,060 agora, loxicamente, podemos só valor tmp plop de en B e estamos a facer. 429 00:27:11,060 --> 00:27:12,800 Entón nós decidimos este problema. 430 00:27:12,800 --> 00:27:17,720 Desafortunadamente, cando executar este programa baixo esta forma, que en realidade non cambiar os valores. 431 00:27:17,720 --> 00:27:20,100 Pero, para ser claro, por que? 432 00:27:23,660 --> 00:27:26,450 Resolve o problema lóxico dun momento atrás, 433 00:27:26,450 --> 00:27:31,020 pero, de novo, se eu executar este programa, X e Y permanecen inalterados 434 00:27:31,020 --> 00:27:33,310 ata o final da execución do programa. 435 00:27:33,310 --> 00:27:37,220 [Comentario do estudante inaudível] >> Non devolveu nada, entón iso é verdade. 436 00:27:37,220 --> 00:27:39,670 Pero acontece que hai un pouco de un problema aquí, porque, ata agora, 437 00:27:39,670 --> 00:27:44,170 a única cousa que teño sido capaz de volver é unha cousa, e esta é unha restrición de C. 438 00:27:44,170 --> 00:27:49,070 Só podes volver realmente un valor, caso en que eu son o tipo de preso aquí 439 00:27:49,070 --> 00:27:53,310 porque eu podería voltar o novo valor de x ou eu podería voltar o novo valor de y, 440 00:27:53,310 --> 00:27:55,190 pero quero tanto de volta. 441 00:27:55,190 --> 00:27:58,650 Entón, retornando non é a solución simple aquí. 442 00:27:58,650 --> 00:28:01,710 Pero o problema fundamental é por que? O que realmente trocados? 443 00:28:01,710 --> 00:28:04,190 [Estudante] a e b. >> A e B. 444 00:28:04,190 --> 00:28:08,230 Pero a e b son copias de x e y, o que significa que só fixo todo este traballo, 445 00:28:08,230 --> 00:28:11,650 que acabamos pasado 3 minutos falando sobre a función de intercambio e todos os 3 destas variables, 446 00:28:11,650 --> 00:28:15,420 e iso é óptimo, perfectamente correcto en illamento, 447 00:28:15,420 --> 00:28:20,740 pero e ámbito de b é só nestas liñas aquí. 448 00:28:20,740 --> 00:28:24,790 >> Entón, como un loop, se declara un enteiro i dentro do loop for, 449 00:28:24,790 --> 00:28:28,760 Do mesmo xeito, se está declarando dentro a e b dunha función que escribiu, 450 00:28:28,760 --> 00:28:33,320 son só válido dentro desa función, o que significa que, unha vez que intercambio é feito executando 451 00:28:33,320 --> 00:28:38,470 e imos da liña 24 para a liña 25, x e y non foron alteradas de forma algunha. 452 00:28:38,470 --> 00:28:42,790 Vostede desperdiçar só unha morea de tempo a cambio de copias de variables. 453 00:28:42,790 --> 00:28:47,010 Así, verifícase que a solución para iso é, en realidade, non obvia. 454 00:28:47,010 --> 00:28:50,670 Non é ben abondo para voltar valores, porque só podemos voltar un valor, 455 00:28:50,670 --> 00:28:53,470 e eu realmente quero cambiar x e y, ao mesmo tempo, 456 00:28:53,470 --> 00:28:55,210 entón nós imos ter que volver a este. 457 00:28:55,210 --> 00:29:01,020 Pero, por agora, entender que a cuestión fundamentalmente derivada do feito de que a e b son copias 458 00:29:01,020 --> 00:29:03,630 e eles están no seu propio ámbito. 459 00:29:03,630 --> 00:29:05,050 Imos tentar solucionar isto de algunha maneira. 460 00:29:05,050 --> 00:29:11,250 Deixe-me realmente rolar de volta aquí e abrir-se, por exemplo, unha cuarta variante deste, buggy4. 461 00:29:11,250 --> 00:29:13,370 Que tal isto? 462 00:29:13,370 --> 00:29:17,810 Este é un problema semellante, pero máis sinxelo de ollar antes de tomar unha facada en resolver-lo. 463 00:29:17,810 --> 00:29:24,190 Este programa é chamado de incremento, e, ao parecer, arrincar un número enteiro de 1 x na liña 18. 464 00:29:24,190 --> 00:29:28,150 Eu, entón, dicir que x é 1, entón eu reclamar "incrementando ..." 465 00:29:28,150 --> 00:29:33,730 Eu, entón, chamar incremento, pero, a continuación, as liñas 22 e 23, eu afirmo que foi incrementado, 466 00:29:33,730 --> 00:29:40,220 Eu reivindico x agora que quere que sexa - 2, probabelmente -, pero este programa é buggy. 467 00:29:40,220 --> 00:29:42,610 Cal é o problema? 468 00:29:43,440 --> 00:29:50,160 Si >> [Resposta do alumno inaudível] >> Exactamente. 469 00:29:50,160 --> 00:29:52,490 Entón x foi declarada, obviamente, na liña 18. 470 00:29:52,490 --> 00:29:54,700 Que está dentro de chaves principais. 471 00:29:54,700 --> 00:29:58,440 Polo tanto, a resposta simple é que mentres x existe aquí, 472 00:29:58,440 --> 00:30:03,930 non existe na liña 32, así que este programa realmente non vai nin compilar. 473 00:30:03,930 --> 00:30:07,940 O compilador cando intento compilar este código vai berrar comigo 474 00:30:07,940 --> 00:30:14,100 sobre algúns identificador non declarado ou algo nese sentido. En realidade, imos tratar. 475 00:30:14,100 --> 00:30:18,470 Esta é facer buggy4. Non é. 476 00:30:18,470 --> 00:30:22,110 Uso de 'x' identificador non declarado na liña 32. 477 00:30:22,110 --> 00:30:25,580 E, de feito, imos ser máis explícito aquí hoxe para que iso sexa útil 478 00:30:25,580 --> 00:30:27,580 en horario de oficina e na casa. 479 00:30:27,580 --> 00:30:29,300 >> Teña en conta que é un pouco enigmática escritura. 480 00:30:29,300 --> 00:30:37,270 Pero o feito de que Clang ten chamado, dicindo buggy4.c: 32:5, é realmente útil. 481 00:30:37,270 --> 00:30:42,050 Isto significa que o erro está na liña 32 na posición de carácter 5. 482 00:30:42,050 --> 00:30:46,700 Entón, 1, 2, 3, 4, 5. Isto é, de feito, onde está o problema. 483 00:30:46,700 --> 00:30:49,790 E, tamén, tamén, ter presente á hora de oficina e na casa, teño sorte aquí. 484 00:30:49,790 --> 00:30:52,990 Eu teño un erro. Vai ser relativamente doado de corrixir. 485 00:30:52,990 --> 00:30:55,990 Pero se recibir unha pantalla chea de mensaxes de erro esmagadora, 486 00:30:55,990 --> 00:31:00,330 novo entender que o máis inferior pode ser só un síntoma da dun superior. 487 00:31:00,330 --> 00:31:03,450 Entón, sempre perseguir os seus erros, de arriba para abaixo 488 00:31:03,450 --> 00:31:05,820 porque non pode ser só un efecto en cadea 489 00:31:05,820 --> 00:31:09,240 que está suxerindo que ten problemas de xeito máis que realmente fai. 490 00:31:09,240 --> 00:31:15,150 Entón, como poderiamos resolver iso o meu obxectivo é incrementar x? >> [Alumno] Facer x global. 491 00:31:15,150 --> 00:31:17,060 Ok, entón podemos facer x global. 492 00:31:17,060 --> 00:31:20,480 Imos incorporarse a ligazón que eu avisei sobre a anterior, pero que demo, só necesitamos unha solución rápida, 493 00:31:20,480 --> 00:31:25,730 entón imos só dicir int x aquí. Isto fai x global. 494 00:31:25,730 --> 00:31:31,800 Entón, agora principal ten acceso a el e incremento ten acceso a el, 495 00:31:31,800 --> 00:31:34,110 e entón deixe-me ir adiante e compile iso agora. 496 00:31:34,110 --> 00:31:37,630 Fai buggy4, Intro. Parece compilar. 497 00:31:37,630 --> 00:31:41,230 Imos correr buggy4. E parece realmente funciona. 498 00:31:41,230 --> 00:31:45,150 Esta é unha desas cousas que fan o que eu digo, non o que fago, 499 00:31:45,150 --> 00:31:47,010 como eu acaba de facer aquí, porque, en xeral, 500 00:31:47,010 --> 00:31:50,440 Os nosos programas van ser moito máis interesante e máis que iso, 501 00:31:50,440 --> 00:31:56,390 e se a súa solución para os problemas da vida é só poñer todas as variables na parte superior do seu arquivo, 502 00:31:56,390 --> 00:31:59,690 moi rapidamente que os programas están terriblemente difícil de xestionar. 503 00:31:59,690 --> 00:32:02,190 Está máis difícil de pensar en novos nomes de variables, 504 00:32:02,190 --> 00:32:05,240 está máis difícil de entender o que está facendo o que variable, 505 00:32:05,240 --> 00:32:08,460 e así, en xeral, isto non é unha boa solución. 506 00:32:08,460 --> 00:32:10,030 Entón, imos facelo mellor. 507 00:32:10,030 --> 00:32:12,160 Nós non queremos usar unha variable global aquí. 508 00:32:12,160 --> 00:32:16,240 >> Eu quero incrementar x, para que eu puidese obviamente - 509 00:32:16,240 --> 00:32:18,670 ao final do día, este é un tipo de historia boba, porque acabamos de facer iso - 510 00:32:18,670 --> 00:32:24,450 pero se eu non sabía que o operador ou eu non tiña permiso para cambia-lo no principal en si, 511 00:32:24,450 --> 00:32:30,730 de que outra forma eu podería aplicar Ken aquí esta vez non para cubo, pero para incrementar? 512 00:32:31,380 --> 00:32:33,190 ¿Como cambiar a cousa aquí? Si 513 00:32:33,190 --> 00:32:38,480 [Alumno] Paso en x e logo voltar [inaudível] >> Ok, bo. 514 00:32:38,480 --> 00:32:41,900 Entón, por que non eu pasar x e en seguida, en vez de devolve-lo, 515 00:32:41,900 --> 00:32:44,870 Por que non só me volver x + 1. 516 00:32:44,870 --> 00:32:47,710 Máis algunhas cousas teñen que cambiar aquí. Eu estou no camiño correcto. 517 00:32:47,710 --> 00:32:49,770 O que máis me teño para axustar? Alguén. Si 518 00:32:49,770 --> 00:32:51,740 [Resposta do alumno inaudível] 519 00:32:51,740 --> 00:32:54,730 Eu teño cambiar o tipo de retorno de incremento porque non está baleiro. 520 00:32:54,730 --> 00:32:57,780 Non significa nada baleiro está a ser devolto, pero claramente agora, 521 00:32:57,780 --> 00:32:59,830 para iso ten que cambiar a - >> [alumno] int. 522 00:32:59,830 --> 00:33:02,740 int para ser coherente co que realmente estou volvendo. 523 00:33:02,740 --> 00:33:05,180 Agora outra cousa aínda é buggy aquí. Si 524 00:33:05,180 --> 00:33:08,400 [Resposta do alumno inaudível] >> [Malan] Entón eu teño incrementar x? 525 00:33:08,400 --> 00:33:12,080 [Resposta do alumno inaudível] >> [Malan] Ah, entón eu teño pasar x. 526 00:33:12,080 --> 00:33:16,660 Entón eu teño que facer iso aquí. >> [Comentario do estudante inaudível] 527 00:33:16,660 --> 00:33:20,050 [Malan] Entón o prototipo, eu teño que cambiar isto aquí. 528 00:33:20,050 --> 00:33:22,930 Polo tanto, este ten que facer un int, este ten que facer - 529 00:33:22,930 --> 00:33:25,620 hmm, realmente teño un erro aquí. Imos solucionar isto primeiro. 530 00:33:25,620 --> 00:33:29,590 O que isto realmente debe ser? Ten que ser unha cousa int. 531 00:33:29,590 --> 00:33:32,700 Podería ser X, pero, francamente, se comezar a chamar toda a súa x variables, 532 00:33:32,700 --> 00:33:35,390 só pode ir cada vez menos clara cal é cal. 533 00:33:35,390 --> 00:33:39,560 >> Entón imos escoller arbitrariamente unha convención de nomenclatura diferente para as miñas funcións de auxiliares, 534 00:33:39,560 --> 00:33:41,940 as funcións que eu estou escribindo. Imos chamar-lle unha, ou podemos chamalo - 535 00:33:41,940 --> 00:33:45,010 Imos chamalo de número ser aínda máis explícito. 536 00:33:45,010 --> 00:33:47,560 Entón eu teño que devolver calquera que sexa o número máis 1, 537 00:33:47,560 --> 00:33:50,740 e agora eu teño que cambiar unha cousa aquí e outra cousa aquí. 538 00:33:50,740 --> 00:33:54,350 O que eu teño que cambiar en liña 21 en primeiro lugar? >> [Resposta do alumno inaudível] 539 00:33:54,350 --> 00:33:57,610 [Malan] Eu teño que asignar a x. Eu non podo simplemente chamar de incremento (x). 540 00:33:57,610 --> 00:34:01,960 Cómpre lembrar a resposta, cambiando o valor de x na parte esquerda. 541 00:34:01,960 --> 00:34:04,680 E aínda que x é agora á esquerda e á dereita, que é totalmente ben 542 00:34:04,680 --> 00:34:08,860 porque o lado dereito é executado primeiro, entón, é a cousa pulou na súa man esquerda - 543 00:34:08,860 --> 00:34:10,600 x neste caso. 544 00:34:10,600 --> 00:34:12,159 E entón, finalmente, este é un reparación doado agora. 545 00:34:12,159 --> 00:34:17,230 Este debe só combinar o que hai alí embaixo, número int. 546 00:34:17,230 --> 00:34:20,570 Entón, unha morea de cambios para unha función realmente estúpido 547 00:34:20,570 --> 00:34:24,420 pero representativa de cousas que nós imos cada vez máis quere facer. 548 00:34:24,420 --> 00:34:27,090 Entón faga buggy4. Eu estraguei todo en algún lugar. 549 00:34:27,090 --> 00:34:30,139 Oh, meu Deus. Cinco erros nun programa de 6 liñas. 550 00:34:30,139 --> 00:34:35,690 Entón, o que hai de malo en liña 18, o personaxe de 5? 551 00:34:35,690 --> 00:34:39,610 Entón eu teño que declarar este int,. 552 00:34:39,610 --> 00:34:41,920 Imos ver. Hai unha morea de outros erros. 553 00:34:41,920 --> 00:34:47,010 Oh, meu Deus - 19, 18, 21 - pero, de novo, imos limpar a pantalla, L Control aquí, 554 00:34:47,010 --> 00:34:49,380 e executa de novo Clang. 555 00:34:49,380 --> 00:34:51,340 Entón, cinco problemas que en realidade é só unha. 556 00:34:51,340 --> 00:34:57,520 Entón, agora imos realizar buggy4, Intro. Uf, X foi incrementado correctamente. 557 00:34:57,520 --> 00:35:02,720 Todo ben. Calquera dúbida sobre como incrementar números? Si 558 00:35:02,720 --> 00:35:09,870 [Pregunta estudante inaudível] >> Boa pregunta. 559 00:35:09,870 --> 00:35:14,220 Como é que podo simplemente cambiar o número x eo programa vai saber inmediatamente? 560 00:35:14,220 --> 00:35:16,200 >> Unha vez máis, pense nisto como esa abstracción. 561 00:35:16,200 --> 00:35:21,600 Entón, se eu son de inicio e Ken e incremento, francamente, eu non me importa o Ken chama o seu iPad. 562 00:35:21,600 --> 00:35:26,570 Eu non ligo para o que el chama de nada que teña que ver coa súa implementación desa función. 563 00:35:26,570 --> 00:35:33,340 Este é un detalle de implementación que, de inicio, non ten que se preocupar. 564 00:35:33,340 --> 00:35:38,250 E así simplemente cambiar consistente dentro da función - número aquí e número aquí - 565 00:35:38,250 --> 00:35:40,960 é todo o que leva tanto tempo como eu recompilar. 566 00:35:40,960 --> 00:35:44,180 É unha especie de sabor, se pensar que moitos de nós, aqueles con bolsas de condutor 567 00:35:44,180 --> 00:35:46,770 que teñen conducido ou se mesmo conducido nun coche, 568 00:35:46,770 --> 00:35:50,950 a maioría de nós non ten idea de como un coche funciona baixo o capo. 569 00:35:50,950 --> 00:35:54,970 E, literalmente, se abrir o capó, a maioría de nós - eu incluído - 570 00:35:54,970 --> 00:35:56,940 non están indo para realmente saber o que estamos mirando, 571 00:35:56,940 --> 00:35:59,220 tipo de como pode se sentir con cousas como esta agora. 572 00:35:59,220 --> 00:36:01,480 Pero nós realmente non se preocupe como o coche funciona, 573 00:36:01,480 --> 00:36:05,970 non temos que coidar o que todos os bastóns e pistóns e os cables dentro do coche 574 00:36:05,970 --> 00:36:08,160 están realmente facendo. 575 00:36:08,160 --> 00:36:12,770 Polo tanto, algo así como o que vostedes chaman o pistón non importa aquí neste caso. Mesma idea. 576 00:36:12,770 --> 00:36:25,300 Si >> [Cuestión estudante inaudível] 577 00:36:25,300 --> 00:36:29,180 Se hai máis usos do momento XA variable atrás, 578 00:36:29,180 --> 00:36:32,150 ti, programador, tería que cambiar todos os lugares. 579 00:36:32,150 --> 00:36:36,600 Ou pode literalmente facer menú Arquivo, e en Buscar, Reemplazar - algo así - 580 00:36:36,600 --> 00:36:39,170 pero vai ter que facer estas modificacións mesmo. 581 00:36:39,170 --> 00:36:47,450 Ten que ser consistente. >> [Alumno] Se hai múltiples variables [inaudível] 582 00:36:47,450 --> 00:36:53,100 A orde particular como aquí, se iso era int outro número? >> [Alumno] correcta. 583 00:36:53,100 --> 00:36:56,590 [Malan] Yeah. Orde importa cando está chamando a función. 584 00:36:56,590 --> 00:37:00,050 >> Entón, se eu estivese chamando incremento aquí con algo coma algo 585 00:37:00,050 --> 00:37:01,680 hai un mapeamento directo. 586 00:37:01,680 --> 00:37:05,690 A primeira variable, o que se chama, faise unha copia do primeiro argumento aquí. 587 00:37:05,690 --> 00:37:07,760 Sentímolo. Isto non debe ser un paréntese. 588 00:37:07,760 --> 00:37:11,490 O segundo argumento liñas anteriores co segundo. Así, a orde, si, importa. Todo ben. 589 00:37:11,490 --> 00:37:17,020 Sentímolo. Tomei o camiño máis longo para chegar alí. Outras preguntas? Todo ben. 590 00:37:17,020 --> 00:37:20,610 Entón imos ver se non podemos pintar unha imaxe do que está realmente a suceder aquí 591 00:37:20,610 --> 00:37:23,090 debaixo do capó, por así dicir. 592 00:37:23,090 --> 00:37:26,640 Este é un rectángulo que pode representar a memoria do seu ordenador. 593 00:37:26,640 --> 00:37:30,970 Mesmo se non ten idea de como funciona a memoria ou como funciona a memoria RAM, 594 00:37:30,970 --> 00:37:33,940 polo menos asumir que ten acios de hoxe en día. 595 00:37:33,940 --> 00:37:36,280 Tes megabytes de que, ten gigabytes de que, 596 00:37:36,280 --> 00:37:40,870 e sabemos que a partir da semana que un byte 0 é só o que? >> [Alumno] 8 bits. 597 00:37:40,870 --> 00:37:42,950 8 bits, non? Entón 8 ceros e 1. 598 00:37:42,950 --> 00:37:45,880 Entón, se o seu ordenador ten un giga de RAM, 2 Gb de RAM nestes días, 599 00:37:45,880 --> 00:37:55,030 ten un billón ou 2 millóns de bytes de memoria ou preto de 8.000 millóns ou 16 millóns de bits 600 00:37:55,030 --> 00:37:56,890 dentro do seu ordenador. 601 00:37:56,890 --> 00:38:00,590 Ao contrario do exemplo pouco Willy Wooly, non é tipicamente máis partículas magnéticas. 602 00:38:00,590 --> 00:38:04,450 Cada vez máis - en portátiles, polo menos - é drives de estado sólido, SSDs 603 00:38:04,450 --> 00:38:08,580 que só non teñen partes móbiles. É todo electrónico. É todo baseado en electricidade. 604 00:38:08,580 --> 00:38:14,060 Entón, creo que dese rectángulo como só representando os 1 ou 2 gigabytes de memoria que ten. 605 00:38:14,060 --> 00:38:16,020 >> Polo tanto, é unha peza da memoria. 606 00:38:16,020 --> 00:38:19,830 O mundo da informática ten a sorte de dissociado 607 00:38:19,830 --> 00:38:22,950 anacos de memoria para facer cousas distintas. 608 00:38:22,950 --> 00:38:27,190 Por exemplo, se esta é a memoria RAM do ordenador, como suxerido polo rectángulo alí, 609 00:38:27,190 --> 00:38:31,130 verifícase que, por convención, na parte superior da súa memoria RAM, por así dicir, 610 00:38:31,130 --> 00:38:33,660 é, xeralmente, o que se denomina un segmento de texto. 611 00:38:33,660 --> 00:38:36,740 Estes son os 0s e 1s que teña compilado. 612 00:38:36,740 --> 00:38:39,020 Entón, cando nós miramos debaixo do capo que a.out é, 613 00:38:39,020 --> 00:38:41,980 todos estes 0s e 1s, cando executar un programa, 614 00:38:41,980 --> 00:38:46,290 os 0s e 1s son cargados a partir do seu disco duro en algo chamado de memoria RAM, 615 00:38:46,290 --> 00:38:49,320 e na RAM son colocadas na parte superior. 616 00:38:49,320 --> 00:38:52,770 Mentres tanto, ten outras cousas: iniciar os datos, non arrincar datos. 617 00:38:52,770 --> 00:38:57,510 Eses dous fragmentos de memoria refírense a variables globais, que non adoita usar 618 00:38:57,510 --> 00:39:00,760 pero, ás veces, se fai iso, eles acaban alí tamén. 619 00:39:00,760 --> 00:39:04,260 Despois, hai algunhas outras cousas: as variables de ambiente, que non vai pasar moito tempo, 620 00:39:04,260 --> 00:39:06,860 pero, a continuación, dúas cousas importantes que van volver ao longo do semestre, 621 00:39:06,860 --> 00:39:08,550 pila e heap. 622 00:39:08,550 --> 00:39:12,210 Así, a maioría da memoria do seu ordenador está reservado ao executar un programa 623 00:39:12,210 --> 00:39:15,370 para algo chamado de pila e algo chamado de pila. 624 00:39:15,370 --> 00:39:18,840 Non imos falar sobre a pila de hoxe, pero imos falar sobre a pila. 625 00:39:18,840 --> 00:39:24,600 A pila é destinado a conxurar a vista das comidas bandexas de comida salón en Mather Casa 626 00:39:24,600 --> 00:39:28,110 ou onde queira que sexa, onde o equipo comedor limpa-los todos os días, 627 00:39:28,110 --> 00:39:30,180 eles empilhá-los do chan enriba, 628 00:39:30,180 --> 00:39:34,550 e do mesmo xeito, na memoria, non é esa idea de poñer algo en unha pila, 629 00:39:34,550 --> 00:39:36,860 poñer algo nunha pila, poñer algo nunha pila. 630 00:39:36,860 --> 00:39:38,240 E o que queremos dicir con iso? 631 00:39:38,240 --> 00:39:41,860 >> Imos aumentar o zoom en só a metade inferior da imaxe, memoria RAM do seu ordenador, 632 00:39:41,860 --> 00:39:44,330 a propoñer o seguinte. 633 00:39:44,330 --> 00:39:48,170 Acontece que cando executar un programa como a.out ou Ola - 634 00:39:48,170 --> 00:39:50,100 calquera que sexa o programa que escribiu - 635 00:39:50,100 --> 00:39:54,020 de novo, os 0s e 1s son cargados a partir do seu disco duro, que é a longo prazo de almacenamento, 636 00:39:54,020 --> 00:39:57,230 permanece alí mesmo cando puxar a ficha, cargado na memoria RAM. 637 00:39:57,230 --> 00:40:00,610 RAM é máis rápida que os discos duros - é menor que os discos duros - 638 00:40:00,610 --> 00:40:03,300 pero é que os programas en directo, mentres está executando-os. 639 00:40:03,300 --> 00:40:08,230 Entón premer dúas veces un programa en un Mac ou PC, é cargado do disco duro para a memoria RAM. 640 00:40:08,230 --> 00:40:11,520 Así como é cargado na memoria RAM, o go 0s e 1s na parte superior forma, 641 00:40:11,520 --> 00:40:16,610 o segmento de texto chamado, pero así que o programa realmente comeza a correr, 642 00:40:16,610 --> 00:40:21,360 A principal función é chamado, e principal, como xa vimos, moitas veces ten variables locais, 643 00:40:21,360 --> 00:40:24,870 e ints e cordas e carácter e semellantes. 644 00:40:24,870 --> 00:40:29,180 Polo tanto, se o seu programa que escribiu ou o programa que premer dúas veces 645 00:40:29,180 --> 00:40:32,970 usou algunhas variables dentro principal, 646 00:40:32,970 --> 00:40:37,240 eles acaban no fondo da súa pila de memoria, por así dicir. 647 00:40:37,240 --> 00:40:39,410 Máis concretamente, o que iso realmente significa? 648 00:40:39,410 --> 00:40:48,450 Isto só significa que se nós estabamos indo ao número de bytes de memoria RAM no seu computador, 649 00:40:48,450 --> 00:40:55,750 conta que este pode ser o número de bytes 0, este pode ser o número de bytes 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 todo o camiño ata 2 millóns sería todo o camiño ata alí enriba. 651 00:41:01,480 --> 00:41:05,880 Polo tanto, noutras palabras, cando falamos de memoria RAM ou en termos de bytes, 652 00:41:05,880 --> 00:41:11,500 significa só que alguén decidiu que a partir cada un destes anacos de memoria. 653 00:41:11,500 --> 00:41:16,650 Así, cando precisa de 32 bits para un int ou precisa de 8 bits para un char, 654 00:41:16,650 --> 00:41:18,840 onde é que acaban na memoria? 655 00:41:18,840 --> 00:41:22,350 >> Conceptualmente, eles simplemente acabar no fondo dunha cousa chamada a pila. 656 00:41:22,350 --> 00:41:25,870 Pero o que é interesante agora é cando chama unha función principal - 657 00:41:25,870 --> 00:41:28,750 supoña que unha función chamada foo, só o nome dun arbitrario - 658 00:41:28,750 --> 00:41:32,330 o que pasa é principal na parte inferior desta pila de memoria; 659 00:41:32,330 --> 00:41:35,680 foo agora é poñer enriba do principal na memoria. 660 00:41:35,680 --> 00:41:40,990 Así, todas as variables locais que foo ten acaban tipo de conceptualmente por riba dos de inicio. 661 00:41:40,990 --> 00:41:47,070 Se foo chama outra función chamada bar, estas variables acaban aquí. 662 00:41:47,070 --> 00:41:50,120 Se a barra de chama outra cousa, aquí, aquí, aquí. 663 00:41:50,120 --> 00:41:53,830 Entón, o que é interesante sobre a execución dun programa que, como chamar funcións 664 00:41:53,830 --> 00:41:57,750 e como esas funcións chamar funcións e como esas funcións chamar funcións, 665 00:41:57,750 --> 00:42:01,470 construír esta pila de funcións na memoria. 666 00:42:01,470 --> 00:42:06,890 E só unha vez a función devolve comezar a que a memoria de volta. 667 00:42:06,890 --> 00:42:10,860 Polo tanto, unha das formas máis fáciles de quedar sen memoria nun programa de ordenador 668 00:42:10,860 --> 00:42:14,360 é escribir funcións que nunca retornan. 669 00:42:14,360 --> 00:42:18,900 Así, por exemplo, imos demostrar tanto cun programa intencionalmente buggy. 670 00:42:18,900 --> 00:42:22,230 Deixe-me ir adiante e facer # include, 671 00:42:22,230 --> 00:42:25,000 int main (void), 672 00:42:25,000 --> 00:42:32,940 e eu vou facer mentres (2> 1), o que probablemente non vai cambiar en nós, 673 00:42:32,940 --> 00:42:37,560 e deixe-me ir adiante agora e facer printf. 674 00:42:37,560 --> 00:42:40,700 En realidade, iso vai ser menos interesante visualmente. Imos facelo. 675 00:42:40,700 --> 00:42:50,240 Para int i = 0; i> 0 - imos cometer ese erro - I + +. 676 00:42:50,240 --> 00:42:52,720 E non imos printf aquí. Imos practicar o que eu estaba predicando. 677 00:42:52,720 --> 00:43:00,190 Imos ter un método aquí, refrán baleiro, e imos dicir int i, 678 00:43:00,190 --> 00:43:06,830 e entón eu vou dicir printf - non, imos facer isto máis interesante. 679 00:43:06,830 --> 00:43:15,790 Non imos realmente imprimir nada. Imos facer o seguinte: coro (i). 680 00:43:15,790 --> 00:43:20,390 Todo ben. Polo tanto, este é buggy por que? 681 00:43:20,390 --> 00:43:23,380 Eu estou facendo iso como eu ir, porque o programa non fai nada de interese. 682 00:43:23,380 --> 00:43:25,320 >> Pero ese non é o obxectivo. 683 00:43:25,320 --> 00:43:29,630 O obxectivo é escribir un programa que ten como principal función fai o que, ao parecer? 684 00:43:30,720 --> 00:43:32,860 Identificar. E, en realidade, nós non precisamos do loop. 685 00:43:32,860 --> 00:43:37,200 Imos mesmo simplificar este só para non perder de vista o erro realmente fundamental. 686 00:43:37,200 --> 00:43:39,640 Chamadas principais coro a cantar algunha coro, 687 00:43:39,640 --> 00:43:41,440 entón eu fixen algo estúpido e eu tiven coro chamada coro 688 00:43:41,440 --> 00:43:43,760 porque eu asumir alguén estaba indo a implementar lo, quizais, 689 00:43:43,760 --> 00:43:47,210 e agora iso non vai compilar aínda. Eu teño que facer o que? 690 00:43:47,210 --> 00:43:49,970 Eu teño do prototipo, lembre-se. 691 00:43:49,970 --> 00:43:56,110 Entón, eu preciso ter-se aquí coro void (int i); 692 00:43:56,110 --> 00:43:59,210 Polo tanto, agora eu baixar aquí - na verdade, imos usar a xanela máis grande. 693 00:43:59,210 --> 00:44:01,980 Imos adiante e facer coro. 694 00:44:01,980 --> 00:44:06,490 Imos adiante e facer coro. 695 00:44:06,490 --> 00:44:08,370 Utilización de identificador non declarado i. 696 00:44:08,370 --> 00:44:12,500 Ah, iso foi estúpido. Nós non precisamos do argumento. Imos facelo. 697 00:44:12,500 --> 00:44:16,370 Gustaríame que tivese comezado desta maneira. Sería un programa moito máis doado escribir. 698 00:44:16,370 --> 00:44:25,590 Alí. Agora imos para a miña xanela de terminal, siga novamente Clang, e aquí imos nós. 699 00:44:25,590 --> 00:44:28,460 Iso foi moi rápido. 700 00:44:28,460 --> 00:44:31,150 O que realmente aconteceu, mentres? 701 00:44:31,150 --> 00:44:33,730 Ben, agora eu vou engadir a liña de impresión para que poidamos ver. 702 00:44:33,730 --> 00:44:43,490 Deixe-me dicir printf ("Eu estou aquí") - non variables. Imos deixalo así. 703 00:44:43,490 --> 00:44:47,480 Deixe-me facer reprise. Deixe-me reprise coro. 704 00:44:47,480 --> 00:44:57,380 E ... imos alí. Continúe indo. 705 00:44:57,380 --> 00:44:59,930 Como un aparte, por que aínda non caeu aínda? 706 00:44:59,930 --> 00:45:02,080 O fallo de segmentación ocorreu super rápido antes. 707 00:45:02,080 --> 00:45:06,570 [Resposta do alumno inaudível] >> Exactamente. Entón, hai que tempo para imprimir, non? 708 00:45:06,570 --> 00:45:08,610 El só ten máis traballo por parte do ordenador. 709 00:45:08,610 --> 00:45:10,620 E alí está: fallo de segmento. 710 00:45:10,620 --> 00:45:12,340 >> Entón, observe o quão rápido os programas executados. 711 00:45:12,340 --> 00:45:14,130 Se vostede non está imprimindo nada, super rápido. 712 00:45:14,130 --> 00:45:18,770 Pero aínda teño esa fallo de segmento, porque o que estaba a suceder? 713 00:45:18,770 --> 00:45:21,210 Se pensar sobre como a memoria do seu ordenador e colocar a fóra, 714 00:45:21,210 --> 00:45:28,740 este pasa a ser principal, pero aquí imos chamar este coro, e imos chamar este refrán. 715 00:45:28,740 --> 00:45:34,550 E agora, se eu fai a miña estética certo, iso só vai dicir coro coro, coro, 716 00:45:34,550 --> 00:45:40,550 coro, coro, coro, coro, relativa nauseum, e, finalmente, o que vai ocorrer? 717 00:45:40,550 --> 00:45:45,630 Se a imaxe grande, literalmente, é iso, o que pasa só conceptualmente? 718 00:45:46,520 --> 00:45:48,630 As derrapagens pila a pila. 719 00:45:48,630 --> 00:45:51,940 Ou, peor, só superado todo, incluíndo o segmento de texto, 720 00:45:51,940 --> 00:45:54,590 que é a 0s e 1s que representan o seu programa. 721 00:45:54,590 --> 00:45:57,080 En suma, este é só super, super-malo. 722 00:45:57,080 --> 00:45:58,830 O seu programa entrou nunha espiral fóra de control. 723 00:45:58,830 --> 00:46:01,220 Está a usar a memoria moito máis do que pretendeu 724 00:46:01,220 --> 00:46:03,960 todo por causa dun erro estúpido, neste caso, 725 00:46:03,960 --> 00:46:08,040 ou, neste caso unha función moi deliberadamente feito ligando-se. 726 00:46:08,040 --> 00:46:09,500 Agora, iso non é de todo malo. 727 00:46:09,500 --> 00:46:13,800 Funcións que chaman-se, en realidade, ten un gran poder cando usalo correctamente. 728 00:46:13,800 --> 00:46:15,800 Eu non teño usado correctamente aquí. 729 00:46:15,800 --> 00:46:19,780 Entón iso non é de todo malo, pero o feito de que eu nunca realmente deixar de chamar-me 730 00:46:19,780 --> 00:46:23,520 é unha debilidade fundamental aquí deste programa. 731 00:46:23,520 --> 00:46:26,400 Entón onde estamos indo con todo isto? O que está realmente a suceder? 732 00:46:26,400 --> 00:46:30,340 Cando eu chamo a función de incremento como estabamos facendo nestes exemplos, 733 00:46:30,340 --> 00:46:33,420 Eu teño un valor como unha que eu pasar dentro 734 00:46:33,420 --> 00:46:37,570 Eu pasar unha copia do número 1, entón acontece o seguinte. 735 00:46:37,570 --> 00:46:44,240 Imos ao exemplo de incremento, este cara por aquí. 736 00:46:44,240 --> 00:46:46,870 Aquí está o que realmente está a suceder. 737 00:46:46,870 --> 00:46:53,400 Cando eu chamo incremento e eu pasar x, pictoricamente, o que está a suceder aquí é esta. 738 00:46:53,400 --> 00:46:59,520 >> Se eu tivera o valor dun almacenados aquí e realmente chamar incremento, 739 00:46:59,520 --> 00:47:04,330 que agora é chamado coro - o iPad está xogando-me aquí. 740 00:47:04,330 --> 00:47:09,760 Imos chamar ese incremento, e non sabemos o que esta función próximo vai ser. 741 00:47:09,760 --> 00:47:14,840 Entón o que está realmente a suceder aquí en algún lugar na principal Eu teño un anaco de memoria 742 00:47:14,840 --> 00:47:17,000 que está a gardar o número 1. 743 00:47:17,000 --> 00:47:19,380 Cando eu chamo incremento, está a usar outro anaco de memoria, 744 00:47:19,380 --> 00:47:21,230 pero agora eu teño a copia do 1. 745 00:47:21,230 --> 00:47:26,660 Cando incrementar ese valor, iso fai 2, 746 00:47:26,660 --> 00:47:30,560 pero entón o que ocorre logo que retorna de incremento? 747 00:47:30,560 --> 00:47:33,630 Esta memoria só queda trasladado ao seu sistema operativo, 748 00:47:33,630 --> 00:47:37,450 o que significa que todo o que fixo non é nada útil. 749 00:47:37,450 --> 00:47:43,120 O 1 que foi orixinalmente contido no principal aínda é realmente alí. 750 00:47:43,120 --> 00:47:44,890 Entón onde estamos indo con iso? 751 00:47:44,890 --> 00:47:49,770 Acontece que na memoria que vostede esta secuencia de back-to-back de bytes 752 00:47:49,770 --> 00:47:53,050 que pode poñer cousas dentro, e verifícase que vimos algo 753 00:47:53,050 --> 00:47:55,390 que implica poñer as cousas de volta para atrás, cara atrás, cara atrás. 754 00:47:55,390 --> 00:47:59,860 ¿Que é un texto baseado na 1 ª semana, e agora 2 semanas? 755 00:48:00,020 --> 00:48:01,980 É só unha colección de personaxes. 756 00:48:01,980 --> 00:48:04,310 Así, parece só como pode pór números na memoria, 757 00:48:04,310 --> 00:48:06,990 do mesmo xeito que pode poñer os caracteres na memoria. 758 00:48:06,990 --> 00:48:10,530 E cando comezamos a poñer personaxes na memoria de costas cara atrás, cara atrás, 759 00:48:10,530 --> 00:48:13,620 verifícase que usar a máis simple das cousas como un loop ou un loop while, 760 00:48:13,620 --> 00:48:17,170 podemos iterar de esquerda a dereita sobre os carácteres dunha cadea 761 00:48:17,170 --> 00:48:20,600 e comezar Masaxes-os en personaxes completamente diferentes - 762 00:48:20,600 --> 00:48:23,370 podería ser un b, b podería tornar-se c - 763 00:48:23,370 --> 00:48:27,780 de xeito que, en última análise, podemos tomar unha frase Inglés que realmente ten sentido 764 00:48:27,780 --> 00:48:30,310 e converter cada unha das referidas cartas de cada vez 765 00:48:30,310 --> 00:48:34,400 camiñando a través da memoria do noso ordenador esquerda a dereita para realmente cifrar. 766 00:48:34,400 --> 00:48:35,810 Polo tanto, imos ter a nosa pausa de cinco minutos aquí, 767 00:48:35,810 --> 00:48:40,730 e cando volten, imos comezar este proceso de codificación de información. 768 00:48:42,020 --> 00:48:43,520 >> Todo ben. 769 00:48:43,520 --> 00:48:48,070 Antes de mergullo en algúns cifrado e esas cousas chamadas de matrices, 770 00:48:48,070 --> 00:48:51,470 deixe-me facer unha pausa para todas as preguntas, porque eu sinto como se eu realmente tipo de confusa 771 00:48:51,470 --> 00:48:54,080 algúns destes temas. Entón imos corrixir agora, se pudermos. 772 00:48:54,080 --> 00:48:58,700 Acaba de falar sobre valores de retorno, nós conversas sobre argumentos, 773 00:48:58,700 --> 00:49:03,250 e falamos sobre esta noción, que nós imos volver nos próximas semanas, 774 00:49:03,250 --> 00:49:08,720 ver a memoria como unha morea de estas bandexas amoreadas, por así dicir, 775 00:49:08,720 --> 00:49:12,660 desde abaixo, de arriba, de tal xeito que cada bandexa, que é colocado na pila 776 00:49:12,660 --> 00:49:16,530 representa unha función que está a ser chamado. 777 00:49:17,900 --> 00:49:20,260 Algunha pregunta? 778 00:49:20,260 --> 00:49:22,640 Deixe-me facer unha pregunta aquí. 779 00:49:22,640 --> 00:49:27,890 Deixe-me simplificar iso volve ao que era antes de algúns dos nosos máis cedo Q & A. 780 00:49:27,890 --> 00:49:35,570 O feito de que o incremento ten paréntese aberto, número int, pechou parénteses - 781 00:49:35,570 --> 00:49:39,110 que é o que o número int representa? 782 00:49:39,110 --> 00:49:42,790 [Alumno] Un argumento. >> Un argumento. Okay. Pero o que é un argumento? 783 00:49:42,790 --> 00:49:46,370 [Resposta do alumno inaudível] >> ¿Que é iso? >> [Alumno] Algo que pasa dentro 784 00:49:46,370 --> 00:49:49,940 Ok, entón algo que pasa dentro e de modo máis xeral, é só a entrada. 785 00:49:49,940 --> 00:49:52,450 Se fose escribir unha función e finalidade desa función na vida 786 00:49:52,450 --> 00:49:55,770 é facer algo un pouco diferente cada vez que usalo, 787 00:49:55,770 --> 00:50:00,110 entón o único xeito para que isto ocorre realmente parece ser o de proporcionar con entrada 788 00:50:00,110 --> 00:50:03,510 para que poida facer algo diferente que a entrada de cada vez. 789 00:50:03,510 --> 00:50:06,650 >> Entón, ten que especificar dúas cousas cando leva unha función de entrada. 790 00:50:06,650 --> 00:50:09,590 Debe especificar o nome que quere dar a esta entrada 791 00:50:09,590 --> 00:50:12,700 exclusivamente para a súa propia conveniencia para que poida consultala la 792 00:50:12,700 --> 00:50:16,540 na función que mesmo está escribindo, como eu fixen aquí en liña 32. 793 00:50:16,540 --> 00:50:20,800 Pero tamén precisa especificar o tipo porque C é unha linguaxe de programación 794 00:50:20,800 --> 00:50:25,940 que esixe só que se quere unha variable, ten que dicir ao computador o tipo de datos que é, 795 00:50:25,940 --> 00:50:30,200 en gran parte, para que saiba cantos bits para reservar para esa variable 796 00:50:30,200 --> 00:50:33,020 porque podería ser 6 - desculpe, iso non vai ser 6. 797 00:50:33,020 --> 00:50:37,080 Pode ser de 16, pode ser de 8, pode ser de 32, aínda 64, 798 00:50:37,080 --> 00:50:39,130 pero o ordenador precisa saber. 799 00:50:39,130 --> 00:50:43,180 Agora, a int no lado esquerdo representa o que, por outra banda? 800 00:50:46,350 --> 00:50:48,850 [Resposta do alumno inaudível] >> ¿Que é iso? >> [Alumno] Tipo de función. 801 00:50:48,850 --> 00:50:53,610 O tipo de función e, máis concretamente, do tipo da súa produción. Dereito. 802 00:50:53,610 --> 00:50:57,380 Así, mentres que o único entre parénteses representa a súa entrada, se o houbera, 803 00:50:57,380 --> 00:50:59,660 a cousa á esquerda representa a súa saída. 804 00:50:59,660 --> 00:51:03,530 E, neste caso, o incremento aparentemente retorna un enteiro 805 00:51:03,530 --> 00:51:07,690 e así int é o tipo de retorno desta función. 806 00:51:07,690 --> 00:51:09,340 O que significa volver? 807 00:51:09,340 --> 00:51:15,090 Literalmente, usa a palabra chave return e entón, se o que está volvendo 808 00:51:15,090 --> 00:51:18,600 á dereita da palabra clave é un número enteiro, 809 00:51:18,600 --> 00:51:21,660 a continuación, que é de feito consistente co que prometeron. 810 00:51:21,660 --> 00:51:26,410 Non podería facer algo así - Ola mundo, - porque iso é unha cadea. 811 00:51:26,410 --> 00:51:28,860 >> Obviamente, isto non é un número enteiro. 812 00:51:28,860 --> 00:51:33,140 Así, en breve, a carga é realmente en nós, o programador, para ser específico 813 00:51:33,140 --> 00:51:37,770 En canto ao que estamos volvendo e entón realmente ir sobre a devolver. 814 00:51:37,770 --> 00:51:43,440 O contexto aquí agora é que a memoria do ordenador é un gigabyte, 2 gigabytes - 815 00:51:43,440 --> 00:51:45,920 calquera que sexa - quizais sexa máis, quizais sexa menos 816 00:51:45,920 --> 00:51:49,050 pero o ordenador velo como tendo distintas seccións. 817 00:51:49,050 --> 00:51:51,200 Algo vai alí, outra cousa vai alí enriba, 818 00:51:51,200 --> 00:51:54,290 cousas distintas vai no medio, e hoxe nós só comezar a contar a historia, 819 00:51:54,290 --> 00:51:56,340 pero imos volver a ese tempo rematou. 820 00:51:56,340 --> 00:51:59,980 Polo momento, a única lembranza que realmente importa é o segmento de texto 821 00:51:59,980 --> 00:52:03,360 porque iso só representa os 0s e 1s Clang que emite. 822 00:52:03,360 --> 00:52:06,050 Entón, cando executar un comando no teclado como a.out 823 00:52:06,050 --> 00:52:09,110 ou dobre clic nun icono en Mac OS ou Windows, 824 00:52:09,110 --> 00:52:11,880 seu programa cargado dende o disco duro para a memoria RAM 825 00:52:11,880 --> 00:52:16,330 e está estatelou na parte superior da RAM do seu ordenador, por así dicir. 826 00:52:16,330 --> 00:52:20,450 Mentres tanto, como o seu programa comeza a ser executado e principal é chamado 827 00:52:20,450 --> 00:52:23,640 no programa que escribiu ou o programa Microsoft ou Apple escribiu, 828 00:52:23,640 --> 00:52:27,860 calquera das súas variables locais acaban alí no fondo da memoria do seu ordenador. 829 00:52:27,860 --> 00:52:33,230 Pero, se as chamadas principais outra función que si ten variables ou argumentos, eles acaban por riba. 830 00:52:33,230 --> 00:52:36,680 E se esa función chámase algo, eles acaban por riba del, por riba del, por riba del. 831 00:52:36,680 --> 00:52:41,460 >> E só unha vez unha función de execución que está feito a pila de taboleiros, por así dicir, 832 00:52:41,460 --> 00:52:43,240 comezan a estar máis e máis. 833 00:52:43,240 --> 00:52:48,250 E isto é o que entón, en poucas palabras, explica porque cando chama cubo 834 00:52:48,250 --> 00:52:51,550 ou chamar incremento, está pasando unha copia do valor. 835 00:52:51,550 --> 00:52:55,520 E o que iso significa pictoricamente é que está, literalmente, escribindo o número 1 836 00:52:55,520 --> 00:53:00,460 noutra parte da memoria, cambiando que 1 a 2, no caso de incremento 837 00:53:00,460 --> 00:53:04,820 ou dun 8, no caso de cubo e, a continuación, que a memoria de distancia xogando 838 00:53:04,820 --> 00:53:09,140 así que o aumento ou a función devolve de cubo. Pregunta. 839 00:53:09,140 --> 00:53:12,900 [Estudante] Onde son variables globais son almacenados? 840 00:53:12,900 --> 00:53:18,100 As variables globais son almacenados en que está actualmente chamado os datos inicializados ou datos non inicializados, 841 00:53:18,100 --> 00:53:21,920 a diferenza é se ten unha variable global e lle atribúe un valor inmediato 842 00:53:21,920 --> 00:53:24,640 co signo igual, el acaba na parte superior alí, 843 00:53:24,640 --> 00:53:29,200 e acaba de dicir int x; sen valor, acaba un pouco menor na RAM 844 00:53:29,200 --> 00:53:31,710 simplemente por convención. 845 00:53:31,710 --> 00:53:34,940 Outras preguntas? Todo ben. 846 00:53:34,940 --> 00:53:37,340 Polo tanto, esta imaxe vai volver como temos máis poderoso 847 00:53:37,340 --> 00:53:39,170 co que podemos facer co ordenador, 848 00:53:39,170 --> 00:53:42,720 pero por agora, imos ter unha breve introdución á criptografía, 849 00:53:42,720 --> 00:53:46,080 un tipo específico de cifrado que non resolve todos os problemas do mundo 850 00:53:46,080 --> 00:53:47,720 pero non resolve algúns deles. 851 00:53:47,720 --> 00:53:51,700 Neste caso aquí, temos unha cousa chamada criptografía de clave secreta. 852 00:53:51,700 --> 00:53:56,410 Criptografía de clave secreta, como o nome suxire, deriva a súa seguridade a partir dun segredo. 853 00:53:56,410 --> 00:54:00,690 >> Por exemplo, se estaba de volta na escola e estaba pasando unha carta de amor pouco secreto 854 00:54:00,690 --> 00:54:04,850 para o neno ou a nena que estaba esmagando, se quería pasar esa nota por medio da audiencia, 855 00:54:04,850 --> 00:54:08,380 probablemente non ía escribir tal nota en inglés ou calquera que sexa a súa lingua nativa é. 856 00:54:08,380 --> 00:54:13,340 En vez diso, pode Encriptar ou pode só enviar-lles unha mensaxe de texto nestes días. 857 00:54:13,340 --> 00:54:15,460 Pero realmente pode pasar-lles unha nota ao longo da clase. 858 00:54:15,460 --> 00:54:18,700 E para facelo de forma segura, de tal forma que os seus amigos e os profesores 859 00:54:18,700 --> 00:54:22,650 non sei o que está escribindo, pode chegar a un algoritmo moi sinxelo, 860 00:54:22,650 --> 00:54:25,920 mozo que pode ser, só para embaralhar as palabras. 861 00:54:25,920 --> 00:54:28,130 Entón, en vez de escribir un pode escribir B, 862 00:54:28,130 --> 00:54:30,220 en vez de b pode escribir c, 863 00:54:30,220 --> 00:54:32,140 en vez de c podes escribir d, e así por diante. 864 00:54:32,140 --> 00:54:34,360 Ou pode vir con unha tradución máis sofisticado 865 00:54:34,360 --> 00:54:36,720 de cartas para letras diferentes. 866 00:54:36,720 --> 00:54:39,740 Pero o problema é o neno ou nena a quen está enviando esta nota 867 00:54:39,740 --> 00:54:45,020 Debe saber algo, que é o que, obviamente? >> [Alumno] O que está enviando. 868 00:54:45,020 --> 00:54:49,720 Cal é o seu segredo, como o que é que o mapeamento entre un e B e C e d's. 869 00:54:49,720 --> 00:54:54,650 É só engadindo unha a cada unha das letras para ir de un a B, B para C? 870 00:54:54,650 --> 00:54:56,670 O que é máis complexa do que a? 871 00:54:56,670 --> 00:55:01,540 >> Así, vostede ea súa paixón é preciso ter esa información secreta, 872 00:55:01,540 --> 00:55:03,190 pero hai unha especie de catch-22 aquí. 873 00:55:03,190 --> 00:55:06,830 Se esta é a primeira vez que está enviando esta carta de amor a través da clase, 874 00:55:06,830 --> 00:55:10,720 como é que o neno ou a nena vai saber o que o segredo é? 875 00:55:10,720 --> 00:55:13,930 Entón chave secreta de cifrado non resolve todos os problemas do mundo, 876 00:55:13,930 --> 00:55:16,320 e hai, en realidade, unha relación aquí que nós imos volver en dirección ao fin do semestre. 877 00:55:16,320 --> 00:55:25,110 Do mesmo xeito que non a maioría de nós coñece a alguén que traballa, por exemplo, a Amazon.com, 878 00:55:25,110 --> 00:55:28,190 e aínda que moitos de nós probablemente xa comprou cousas no Amazon.com, 879 00:55:28,190 --> 00:55:31,990 e nós fomos ensino a asumir que esas transaccións de comercio electrónico son seguras. 880 00:55:31,990 --> 00:55:36,470 A URL probablemente di https, hai quizais unha icona de cadeado pouco parvo en algún lugar, 881 00:55:36,470 --> 00:55:39,930 hai algún tipo de criptografía de protexer a súa información de tarxeta de crédito 882 00:55:39,930 --> 00:55:42,160 entre vostede e Amazon.com. 883 00:55:42,160 --> 00:55:45,430 E, con todo, a criptografía implica coñecer algún segredo 884 00:55:45,430 --> 00:55:48,620 e eu non coñezo ninguén en Amazon e eu certamente non dispostos calquera tipo de segredo 885 00:55:48,620 --> 00:55:52,710 con alguén na Amazonia, como é o meu ordenador ou o meu navegador facendo iso? 886 00:55:52,710 --> 00:55:55,720 Acontece que hai outros tipos de cifrado completamente que resolver este problema. 887 00:55:55,720 --> 00:55:57,670 Pero por hoxe, imos nos centrarse na simple 888 00:55:57,670 --> 00:56:00,290 onde podes organizar con antelación para saber algún segredo 889 00:56:00,290 --> 00:56:03,760 como unha ou algunhas cartografía entre un e B do. 890 00:56:03,760 --> 00:56:05,840 E o proceso de cifrado implica xeralmente a este. 891 00:56:05,840 --> 00:56:08,620 Ten algún texto simple, representado aquí na esquerda, 892 00:56:08,620 --> 00:56:12,930 executa-lo a través de algún tipo de algoritmo ou procedemento para criptografía-lo - 893 00:56:12,930 --> 00:56:15,100 quizais iso sexa só unha se fai b, b torna-se c - 894 00:56:15,100 --> 00:56:17,490 e entón acaba con texto cifrado. 895 00:56:17,490 --> 00:56:20,380 Mentres tanto, unha vez que a súa paixón recibe esta nota secreta, 896 00:56:20,380 --> 00:56:24,200 el ou ela ten que decifra-lo, entón por que xeralmente invertendo algoritmo 897 00:56:24,200 --> 00:56:27,190 para obter de volta o texto simple. 898 00:56:27,190 --> 00:56:28,960 Existen encarnações físicas deste. 899 00:56:28,960 --> 00:56:31,680 >> Por exemplo, este é un anel decodificar pouco segredo, 900 00:56:31,680 --> 00:56:35,110 e este é un anel, no sentido de que hai dous mostradores aquí. 901 00:56:35,110 --> 00:56:38,490 Na periferia fóra desta cousa, hai letras de A a Z, 902 00:56:38,490 --> 00:56:40,340 aínda están en orde aleatoria, 903 00:56:40,340 --> 00:56:42,880 e no interior, hai realmente algúns números 904 00:56:42,880 --> 00:56:46,620 de tal forma que con este anel, pode converter o tipo de fóra, pero non no interior 905 00:56:46,620 --> 00:56:49,140 , A fin de aliñar números con letras. 906 00:56:49,140 --> 00:56:53,020 A partir dun filme chamado Unha Historia de Nadal, vai ver que Ralphie pouco 907 00:56:53,020 --> 00:56:58,000 estaba tan ansioso para descubrir o que a mensaxe secreta Little Orphan Annie era para el 908 00:56:58,000 --> 00:57:02,570 que fora comunicado, penso eu, en forma de mensaxes numéricas nunha caixa de cereal 909 00:57:02,570 --> 00:57:07,220 e tivo que acumular todas as tarxetas pequenos que viñeron na caixa de cereal, 910 00:57:07,220 --> 00:57:09,770 tiña que envialos, tiña que volver o anel decodificar secreto 911 00:57:09,770 --> 00:57:13,910 de modo que pode finalmente descubrir o que é o mapeamento entre letras e números 912 00:57:13,910 --> 00:57:15,550 ou cartas e cartas. 913 00:57:15,550 --> 00:57:19,520 Como un ordenador pode ir sobre a implementación ou representando cousas como esta? 914 00:57:19,520 --> 00:57:22,560 Necesitamos un xeito de nos expresar un pouco máis flexible 915 00:57:22,560 --> 00:57:25,080 que as nosas variables ata agora permitiron. 916 00:57:25,080 --> 00:57:29,000 Tivemos ints, tivemos chars, tivemos coches alegóricos e de dobres e algúns outros, 917 00:57:29,000 --> 00:57:34,200 pero esas son pezas individuais de memoria que realmente non nos permiten expresar cousas 918 00:57:34,200 --> 00:57:36,440 como palabras e frases e oracións. 919 00:57:36,440 --> 00:57:38,630 En realidade, nós temos chamado cordas tales cousas, 920 00:57:38,630 --> 00:57:42,660 pero nós prometemos que iso é realmente só unha simplificación na biblioteca CS50 921 00:57:42,660 --> 00:57:45,540 que estamos coa intención de pelar. 922 00:57:45,540 --> 00:57:47,500 E así imos comezar a facelo aquí. 923 00:57:47,500 --> 00:57:49,840 Deixe-me ir adiante e abrir un ficheiro - 924 00:57:49,840 --> 00:57:54,100 todos estes arquivos están dispoñibles, como de costume, en liña - array.c chamado 925 00:57:54,100 --> 00:57:58,960 para resolver un problema relacionado con cordas, pero que pinta un cadro aquí 926 00:57:58,960 --> 00:58:01,520 de como podemos utilizar unha cousa chamada matriz. 927 00:58:01,520 --> 00:58:04,050 >> Unha matriz é un tipo de datos. 928 00:58:04,050 --> 00:58:10,730 É un tipo de variable do tipo que ten varios tipos de datos máis pequenos dentro dela 929 00:58:10,730 --> 00:58:12,680 de costas cara atrás, cara atrás. 930 00:58:12,680 --> 00:58:16,980 Así, por exemplo, se quixésemos escribir un pequeno programa que lle dá a súa media de proba 931 00:58:16,980 --> 00:58:19,780 para un curso como 50, que ten dous cuestionarios, 932 00:58:19,780 --> 00:58:23,450 podería moi facilmente escribir este programa baseado mesmo en algúns dos materiais da semana pasada 933 00:58:23,450 --> 00:58:28,830 usando GetInt e un par de variables: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 E é moi sinxelo. 935 00:58:30,550 --> 00:58:33,500 É quizais 10, 20 liñas de código máximo para aplicar un programa de 936 00:58:33,500 --> 00:58:38,940 que pide ao usuario para dúas puntuacións do cuestionario e calcúlase a media 937 00:58:38,940 --> 00:58:42,020 sumando os, dividindo por 2, e logo a impresión dos resultados. 938 00:58:42,020 --> 00:58:46,400 Nós probablemente podería facelo moi rapidamente agora, despois dun determinado número de minutos. 939 00:58:46,400 --> 00:58:49,450 Pero o problema é que, supoñamos que 50 tiñan 3 ou 4 probas. 940 00:58:49,450 --> 00:58:52,830 Supoña que vostede quería usar o mesmo programa para unha clase que tivo probas semanalmente. 941 00:58:52,830 --> 00:58:55,100 Debería unha clase que ten probas semanalmente. 942 00:58:55,100 --> 00:58:58,840 Se hai 16 ou máis semanas, nun semestre, agora ten 16 variables: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Así que comezar a ver esa redundancia, esta copia e pegado de código, 945 00:59:06,870 --> 00:59:09,810 debe comezar a facer desexa que houbese un xeito mellor. 946 00:59:09,810 --> 00:59:13,610 E, por sorte, porque de matrices hai. Entón, imos facelo. 947 00:59:13,610 --> 00:59:16,700 En primeiro lugar, deixe-me presentar unha cousa moi simple que non usei ata agora, 948 00:59:16,700 --> 00:59:18,820 pero vai ver que, en ocasións, en código. 949 00:59:18,820 --> 00:59:21,270 >> Isto é o que é xeralmente chamado de unha constante. 950 00:59:21,270 --> 00:59:24,410 Entón, é unha constante no sentido de que este valor nunca cambia. 951 00:59:24,410 --> 00:59:26,450 A convención humana ao crear unha constante 952 00:59:26,450 --> 00:59:30,420 é por todas as letras maiúsculas só para que realmente destaca no seu código, 953 00:59:30,420 --> 00:59:34,270 ea palabra clave especial que usa en C # é definir. 954 00:59:34,270 --> 00:59:39,970 Así, dicimos # define, entón, un espazo, entón a palabra que quere empregar o nome constante do 955 00:59:39,970 --> 00:59:41,730 e, a continuación, o valor da constante. 956 00:59:41,730 --> 00:59:44,710 Teña en conta que isto é diferente de asignar algo a unha variable. 957 00:59:44,710 --> 00:59:46,430 Non hai signo igual, non hai punto e coma. 958 00:59:46,430 --> 00:59:49,140 Isto é o que é xeralmente coñecido como unha directiva de pre-procesamento, 959 00:59:49,140 --> 00:59:50,840 pero máis sobre iso noutro momento. 960 00:59:50,840 --> 00:59:56,350 De momento, iso crea un valor inmutable chamado cuestionarios 961 00:59:56,350 --> 00:59:58,290 cuxo valor numérico real é 2. 962 00:59:58,290 --> 01:00:02,180 Entón, en calquera lugar que ve probas, cuestionarios, probas ao longo deste arquivo, 963 01:00:02,180 --> 01:00:04,230 iso é só o número 2. 964 01:00:04,230 --> 01:00:06,550 Se eu ollar para inicio Agora, imos ver como funciona isto. 965 01:00:06,550 --> 01:00:09,770 En primeiro lugar, parece un pouco enigmático, pero é todo cousa de 1 semana. 966 01:00:09,770 --> 01:00:12,210 Peza ao usuario notas. Como podemos facer iso? 967 01:00:12,210 --> 01:00:17,350 Na liña 22 - este é realmente a parte suculenta - Declaro un flotador 968 01:00:17,350 --> 01:00:23,240 pero non só un único flotador. Estou declarando, antes, un conxunto de valores de punto flotante. 969 01:00:23,240 --> 01:00:27,700 Esta variable vai ser chamado de notas, como implicado aquí, 970 01:00:27,700 --> 01:00:31,420 pero a única peza de nova sintaxe, entón son estes corchetes. 971 01:00:31,420 --> 01:00:37,280 O feito de que eu dixen notas float e, a continuación, soporte aberto e, a continuación, un número - 972 01:00:37,280 --> 01:00:40,980 entender esta é unha constante que é só como nós fixemos iso - 973 01:00:40,980 --> 01:00:46,840 isto significa, "Hey ordenador, dáme dous coches alegóricos e imos chamalos colectivamente notas." 974 01:00:46,840 --> 01:00:51,780 >> Isto está en contraste con un proceso moito máis tedioso así: flotador classe1; 975 01:00:51,780 --> 01:00:54,580 grade2 flotar, e así por diante. 976 01:00:54,580 --> 01:00:58,310 Así, unha matriz que nos permite implementar esta idea, pero moito menos messily, 977 01:00:58,310 --> 01:01:04,560 de xeito que podemos escribir unha liña de código, en vez de, digamos, 16 para un semestre de 16 semanas. 978 01:01:04,560 --> 01:01:09,060 Eu non quería ríxido código 2 porque se pensar sobre iso agora, loxicamente, 979 01:01:09,060 --> 01:01:12,560 supoño que o próximo ano CS50 cambios 3 quizzes vez 980 01:01:12,560 --> 01:01:15,010 e eu tiña o número 2 aquí, eu tiña o número 2 aquí, 981 01:01:15,010 --> 01:01:17,210 Eu tiven o número 2 aquí, o número 2 aquí. 982 01:01:17,210 --> 01:01:19,890 Tórnase moi tedioso e moi fácil de romper 983 01:01:19,890 --> 01:01:26,550 e cambiar accidentalmente un valor para 3 e perder algún outro valor de 2. 984 01:01:26,550 --> 01:01:30,660 Entón, eu estou indo a lugar abstracto iso adiante e utilizar esa constante que, 985 01:01:30,660 --> 01:01:32,520 Como o nome suxire, nunca cambia. 986 01:01:32,520 --> 01:01:35,870 E agora non importa se temos diferentes probas este ano ou o próximo, 987 01:01:35,870 --> 01:01:39,380 Eu só teño que mudalo nun lugar aquí enriba. 988 01:01:39,380 --> 01:01:41,230 Entón iso é todo unha constante é. 989 01:01:41,230 --> 01:01:47,100 Mentres tanto, o novo recurso conceptual que dunha matriz. 990 01:01:47,100 --> 01:01:55,030 Así, os corchetes me dar esta flota moitas e déixame chamalos colectivamente notas aquí. 991 01:01:55,030 --> 01:01:56,720 Entón agora imos ver o que eu vou facer. 992 01:01:56,720 --> 01:01:59,220 Aquí, na liña 24 é o inicio dun lazo. 993 01:01:59,220 --> 01:02:03,380 >> Isto é realmente nada extravagante. É só usar cuestionarios vez de un número codificado. 994 01:02:03,380 --> 01:02:06,740 Pero non hai nada intelectualmente diferente alí desde a semana pasada. 995 01:02:06,740 --> 01:02:11,650 Este é só printf, así printf ("Quiz d #% de% d:") 996 01:02:11,650 --> 01:02:16,670 porque eu só quero imprimir me dar cuestionario número 1 de 2 e, a continuación, 2 a 2. 997 01:02:16,670 --> 01:02:18,480 Entón iso é unha cousa puramente estética. 998 01:02:18,480 --> 01:02:21,000 Pero a parte interesante é agora na liña 27. 999 01:02:21,000 --> 01:02:27,840 Co fin de cubrir un dos dous marcadores de posición cun valor de punto flotante, 1000 01:02:27,840 --> 01:02:29,640 novo usar corchetes. 1001 01:02:29,640 --> 01:02:35,170 Neste caso, eu estou usando i porque este loop comezou con i igualando o valor que, ao parecer? 1002 01:02:35,170 --> 01:02:36,670 [Estudante] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Así, na primeira iteração do loop, é como se eu escribín iso no código, 1004 01:02:40,990 --> 01:02:46,310 pero na segunda iteração do loop, é como se eu escribín iso no meu código. 1005 01:02:46,310 --> 01:02:49,970 Pero o feito de que eu estou usando unha variable é perfecto, porque, como o nome suxire, 1006 01:02:49,970 --> 01:02:52,600 está variando o seu valor cada iteração, 1007 01:02:52,600 --> 01:02:55,900 entón eu estou cubrindo esta matriz un punto de cada vez. 1008 01:02:55,900 --> 01:02:57,380 O que esta matriz parece? 1009 01:02:57,380 --> 01:03:01,570 A razón que eu deseñei o rectángulo super sinxelo na pantalla aquí antes foi por este motivo. 1010 01:03:01,570 --> 01:03:05,590 Unha matriz é só unha peza de memoria seguido por outro anaco de memoria 1011 01:03:05,590 --> 01:03:08,570 seguido por outro bloque de memoria e así por diante. 1012 01:03:08,570 --> 01:03:13,120 Entón, se a miña matriz é de tamaño 2, neste caso, aquí, todo o que eu estaría facendo 1013 01:03:13,120 --> 01:03:20,200 escribindo na puntuación meus cuestionario como aquí - Eu teño 100 en un presente e entón eu teño un 99 nun presente - 1014 01:03:20,200 --> 01:03:24,970 entón esta memoria non pode ser usado incluso porque eu só preguntei o ordenador 1015 01:03:24,970 --> 01:03:26,840 para unha matriz de tamaño 2. 1016 01:03:26,840 --> 01:03:28,600 Estas prazas aínda están alí, non? 1017 01:03:28,600 --> 01:03:32,670 Aínda ten 2 gigabytes de memoria RAM, mesmo se está só pedindo para 2 coches alegóricos. 1018 01:03:32,670 --> 01:03:36,840 Así, a idea detrás de matrices é que o ordenador só ten un anaco da memoria 1019 01:03:36,840 --> 01:03:41,340 e despois reparte pequenos anacos de costas cara atrás, cara atrás. 1020 01:03:41,340 --> 01:03:43,310 E para que é todo unha matriz é. 1021 01:03:43,310 --> 01:03:47,350 >> É unha peza contiguo de memoria dentro do cal pode pór as cousas. 1022 01:03:47,350 --> 01:03:50,700 Isto acontece para despois facer só algúns aritmética chat. 1023 01:03:50,700 --> 01:03:54,640 Se rolar por aquí, este é o lugar onde eu entón iterar sobre o array. 1024 01:03:54,640 --> 01:03:58,020 Eu veño co sumatorio de todos os valores na matriz, 1025 01:03:58,020 --> 01:04:02,470 e entón eu uso a función round aquí para realmente facer a suma dividida por probas. 1026 01:04:02,470 --> 01:04:06,320 Pero deixe-me acenar a miña man no que, como especie de aritmética suficiente por agora. 1027 01:04:06,320 --> 01:04:08,370 Pero todo o que está facendo para min, en última análise é o cálculo dunha media. 1028 01:04:08,370 --> 01:04:13,580 Entón, primeiro cuestionario, máis segundo cuestionario dividido por 2 e despois mostralo como un int. 1029 01:04:13,580 --> 01:04:17,280 Pero imos transición agora un exemplo diferente, chamado string1, 1030 01:04:17,280 --> 01:04:20,700 que pinta un cadro similar, pero usando cordas. 1031 01:04:20,700 --> 01:04:23,940 Deixe-me ir adiante e simplificar este só por un momento. 1032 01:04:23,940 --> 01:04:27,090 Perdoe o recúo por agora. 1033 01:04:27,090 --> 01:04:30,870 Obsérvese na liña 19 deste exemplo, eu recibín unha cadea de usuario. 1034 01:04:30,870 --> 01:04:34,640 Pero teña en conta o que eu estou facendo o próximo liñas de 22 en diante. 1035 01:04:34,640 --> 01:04:41,250 En realidade, estou repetindo a partir de i-se - e este é un novo truco - strlen lonxitude da corda,. 1036 01:04:41,250 --> 01:04:44,880 Esta é unha función que vén co C que se pasar unha cadea, 1037 01:04:44,880 --> 01:04:47,730 el di que o número de caracteres que están na cadea. Isto é todo. 1038 01:04:47,730 --> 01:04:51,550 E o feito de que é strlen en vez de lonxitude da corda é só porque é máis sucinto. 1039 01:04:51,550 --> 01:04:55,100 Trinta anos, as persoas gustaban de escribir cousas da forma máis sucinta posible, 1040 01:04:55,100 --> 01:04:57,630 por iso temos mantido esta convención aquí. 1041 01:04:57,630 --> 01:05:00,660 i + + significa só incrementar i en cada iteração. 1042 01:05:00,660 --> 01:05:02,990 E agora entender iso, o que é realmente interesante. 1043 01:05:02,990 --> 01:05:09,180 Na liña 24, digo, "Ordenador, deixa-me un personaxe, 8 bits, e chamalo de c." 1044 01:05:09,180 --> 01:05:12,630 Pero o que é iso no lado dereito dicindo? 1045 01:05:13,490 --> 01:05:16,530 En inglés, o que iso supón? 1046 01:05:16,530 --> 01:05:18,730 [Alumno] O primeiro carácter da matriz. 1047 01:05:18,730 --> 01:05:20,790 Exactamente. Dáme o primeiro carácter da matriz. 1048 01:05:20,790 --> 01:05:24,090 Ou, máis xeralmente, dáme o carácter om na matriz. 1049 01:05:24,090 --> 01:05:26,100 E entender que é importante agora que os científicos de ordenador, 1050 01:05:26,100 --> 01:05:27,890 en realidade estamos a contar 0. 1051 01:05:27,890 --> 01:05:29,720 >> Non ten a criterio agora para comezar a facer iso. 1052 01:05:29,720 --> 01:05:34,160 Agora tes que comportarse de acordo coas expectativas do equipo e contar de 0 1053 01:05:34,160 --> 01:05:38,180 porque [0] vai ser o primeiro carácter nunha secuencia, 1054 01:05:38,180 --> 01:05:42,150 [1] será o segundo, [2], vai ser o terceiro, e así por diante. 1055 01:05:42,150 --> 01:05:49,720 Polo tanto, este programa, se eu compilar el, este é novo string1, así que string1, 1056 01:05:49,720 --> 01:05:54,670 e agora eu teño que correr string1 na miña xanela de terminal. 1057 01:05:54,670 --> 01:05:58,330 El está esperando por entrada, entón eu vou escribir David, intro 1058 01:05:58,330 --> 01:06:02,540 e agora ela imprime David todo en liñas diferentes, pois observe o que eu estou facendo. 1059 01:06:02,540 --> 01:06:05,820 Estou imprimindo un carácter de cada vez. 1060 01:06:05,820 --> 01:06:10,100 Non imos entrar en detalles hoxe sobre iso, pero eu deletei hai pouco esta verificación aquí. 1061 01:06:10,100 --> 01:06:15,480 Acontece que o usuario está comportándose mal, contraditorio, ou simplemente confuso 1062 01:06:15,480 --> 01:06:20,210 realmente pode deixar de dar unha secuencia de tempo. 1063 01:06:20,210 --> 01:06:22,860 Se bater na tecla equivocada no teclado, pode dar ningunha secuencia en todo, 1064 01:06:22,860 --> 01:06:26,950 ou se é malicioso, podes probar pegar no valor dun gigabyte dun ensaio 1065 01:06:26,950 --> 01:06:29,290 para cubrir esa secuencia, e se o ordenador ficar sen memoria, 1066 01:06:29,290 --> 01:06:32,710 Acontece que imos volver este valor especial chamado NULL. 1067 01:06:32,710 --> 01:06:35,580 Entón, por agora, só sei que hai ese valor especial chamado NULL 1068 01:06:35,580 --> 01:06:39,580 que nos permitirá comprobar cando estamos fóra de memoria, entre outras cousas. 1069 01:06:39,580 --> 01:06:45,630 Pero se eu abrir agora string2, notar unha diferenza aquí. 1070 01:06:45,630 --> 01:06:48,210 Teña en conta unha diferenza aquí con string2. 1071 01:06:48,210 --> 01:06:51,340 Con string2, este loop é un pouco diferente. 1072 01:06:51,340 --> 01:06:55,010 >> Deixe-me borrar os nulos, para que poidamos falar sobre iso outra hora. 1073 01:06:55,010 --> 01:06:57,800 ¿Que é diferente sobre o lazo se esta vez? 1074 01:06:59,620 --> 01:07:01,670 Eu podo volver ao exemplo anterior. 1075 01:07:01,670 --> 01:07:08,580 Entón esta é a versión 2, esta é a versión 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 A chamada strlen é onde? 1078 01:07:16,660 --> 01:07:18,860 É a primeira parte do loop. 1079 01:07:18,860 --> 01:07:21,830 Todos os pensamentos acerca de porque eu estou facendo isto? Si 1080 01:07:21,830 --> 01:07:24,560 [Estudante] Entón non chamar a función de cada vez. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Entón, nós non chamar a función en cada momento. Exactamente. 1082 01:07:26,440 --> 01:07:28,300 Lembre-se de lazos que son super sinxelo 1083 01:07:28,300 --> 01:07:31,770 unha vez que tipo de entender que esta é a inicialización, a condición ea actualización. 1084 01:07:31,770 --> 01:07:34,750 O problema é que a condición ocorre en cada iteração do loop. 1085 01:07:34,750 --> 01:07:40,010 E así, neste exemplo aquí, o que é malo sobre o feito de que esta é a miña condición? 1086 01:07:40,010 --> 01:07:41,830 [Alumno] está chamando strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] está chamando strlen novo e de novo e de novo. 1088 01:07:44,340 --> 01:07:47,410 Pero unha vez que eu escriba en David, a lonxitude da corda que é 5, 1089 01:07:47,410 --> 01:07:49,650 e iso non vai cambiar en cada iteração do loop 1090 01:07:49,650 --> 01:07:51,670 porque a cadea aínda é D-a-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Polo tanto, esta é unha información que vai facer unha idea cada vez máis importante 1092 01:07:55,320 --> 01:08:00,410 coñecido como unha decisión de proxecto, onde só non facer o ordenador facer un traballo innecesario. 1093 01:08:00,410 --> 01:08:03,920 >> Así como unha previa pset2, pset2 na edición estándar 1094 01:08:03,920 --> 01:08:07,030 vai desafia-lo para realmente implementar un número de cifras, 1095 01:08:07,030 --> 01:08:10,410 un número de algoritmos de cifrado, de modo que pode tanto cifrar 1096 01:08:10,410 --> 01:08:13,840 e descifrar mensaxes secretas, como a moito non Ralphie un decodificar. 1097 01:08:13,840 --> 01:08:16,810 Na edición de hacker de pset2, imos ir un pouco máis lonxe. 1098 01:08:16,810 --> 01:08:19,649 Nós imos entregar-lle un ficheiro dun sistema informático real 1099 01:08:19,649 --> 01:08:23,479 que contén unha chea de nomes de usuario e contrasinais cifradas reais, 1100 01:08:23,479 --> 01:08:26,939 eo desafío para a edición de hacker vai ser para romper os contrasinais 1101 01:08:26,939 --> 01:08:33,200 e descubrir o que o cifrado ou segredo foi usado para realmente xerar esas contrasinais. 1102 01:08:33,200 --> 01:08:36,109 E nós imos facelo empregando un novo recurso aquí C 1103 01:08:36,109 --> 01:08:40,630 que eu vou dar-lle só unha demo de coñecido como liña de comando argumentos. 1104 01:08:40,630 --> 01:08:44,229 Acontece que, como algúns de vostedes poden ver na sección ou nos libros de texto, 1105 01:08:44,229 --> 01:08:48,260 Inicio nin sempre ten que ser nula entre parénteses. 1106 01:08:48,260 --> 01:08:52,430 Acontece que principal tamén pode ser escrito así, con dous argumentos, 1107 01:08:52,430 --> 01:08:56,870 argc e argv, argc, onde é o número de palabras 1108 01:08:56,870 --> 01:09:00,020 que escribas logo o nome do programa na súa liña de ordes 1109 01:09:00,020 --> 01:09:03,420 e argv son as palabras reais. 1110 01:09:03,420 --> 01:09:07,540 E, como os corchetes alí suxerir, argv é, aparentemente, un array. 1111 01:09:07,540 --> 01:09:12,210 Vai ser unha secuencia, tras unha serie despois dunha serie na memoria. 1112 01:09:12,210 --> 01:09:16,010 >> Entón, o que nós imos ser capaces de facer comezando con pset 2 é algo como isto. 1113 01:09:16,010 --> 01:09:21,350 Se eu fai argv1, que é un exemplo que vai voltar a luns, e executa-lo, 1114 01:09:21,350 --> 01:09:23,370 notar que non parece facer nada aínda. 1115 01:09:23,370 --> 01:09:25,490 El só imprime o seu propio nome. 1116 01:09:25,490 --> 01:09:31,479 Pero se eu dixer adeus clase, aviso que este programa aparentemente itera 1117 01:09:31,479 --> 01:09:35,479 sobre cada unha das palabras que foron escritas no prompt. 1118 01:09:35,479 --> 01:09:41,630 E os medios polos que imos ter acceso a palabras que o usuario introduciu no poder 1119 01:09:41,630 --> 01:09:49,160 e cambiando principal a partir deste fin de semana int main (void) para int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 e, así, vai nacer de liña de comandos argumentos. 1121 01:09:52,050 --> 01:09:57,100 E unha vez que realmente sofisticado con iso, vai ser capaz de escribir programas realmente trippy 1122 01:09:57,100 --> 01:09:59,610 como este aquí, que vai enriba e alén 1123 01:09:59,610 --> 01:10:03,940 algunhas das características que temos feito ata agora, pero todos moi poderoso. 1124 01:10:03,940 --> 01:10:08,950 >> Entón, imos deixar isto con iso na pantalla, e imos velo o luns. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]