COLUMNA 1: Todo ben. Benvido de volta. Esta é a Semana Dúas das CS50, e nós temos ata agora foi o uso de funcións, pero en gran medida toma para concedida. Usamos printf que ten a efectos secundarios de impresión as cousas na pantalla. Usamos get int si flotar. Pero e se o desexa súas propias funcións, como algúns dos xa debería ter comezado a facer por Problem Set One, aínda non é estrictamente necesario? Ben, imos adiante e revisitar este problema de só pedindo ao usuario para o seu nome e a impresión algo na pantalla, pero intenta Fatorar algúns da comuñón que temos ver no noso código ata agora. Entón, por que quero dicir o seguinte. Eu estou indo a ir adiante e crear un novo programa, pode conectar para el HELLO.C como de costume. Eu estou indo a ir adiante e darme incluír io.h defecto na parte superior. Vou tamén darme cautelarmente a biblioteca de forma que CS50 Non me gritou polo compilador. E agora eu estou indo a ir adiante e declarar int, principal, nula. E entón, aquí, é aquí que quero para comezar a terceirizar funcionalidade para outra función que eu mesmo son vai escribir, pero que non hai actualmente. Por exemplo, supoñamos que eu quería escribir unha función que me permite imprimir Ola, comas, e entón o nome dalgún usuario. En vez de seguir facendo printf Ola,% s, non sería bo se había só unha función chamada non printf, pero o nome de impresión? Polo tanto, noutras palabras, quero ser capaz de escribir un programa que fai un pouco algo así. En primeiro lugar, eu vou dicir o printf nome, tendo, así, o usuario me dar o seu nome, e entón eu son vai utilizar as cordas s familiares para declarar unha cadea. Déame unha variable de tipo cadea, chamalo s, e tenda en que o resultado da chamada obter cadea. Pero, agora, nas últimas semanas, eu tería algo tediosamente feito Ola,% s / n. E, en outras palabras, vimos esta exemplo, unha morea de veces, e é un trivial exemplo, porque hai só unha liña de código para que el non é realmente un gran negocio para estar escribindo novo. Pero supoñamos que esta liña de código en realidade, estaban facendo un fardo, e non é unha liña de código, pero é 10 liñas de código de un par de semanas a partir de agora, e só está canso de copiar e pegar ou redigitação ese mesmo código. Non sería bo en vez de facer printf Ola,% s e así por diante, Non sería bo se houbese só unha función chamada nome de impresión que recibe un argumento - noutras palabras, é preciso entrada - e logo, punto e coma. Entón esa función, non sería Sería bo que existía? Así que non tería que preocuparse printf que é, o que% se todos estas complexidades que sexan non todo o que interesante. Son útiles. Así, o nome de impresión, por desgraza, non se inventou uns 40 anos máis atrás. Ninguén pensou en escribilo. Pero esa é a beleza de ter un linguaxe de programación, así como no De cero, pode definir bloques personalizados, para en C e calquera lingua, pode definir a súa propia función, pode definir as súas propias funcións. Polo tanto, a pesar de chegar principal automático de balde, podemos declarar nosas propias funcións. Entón, eu vou facer un espazo aquí enriba, e eu vou declarar o meu propia función que vai buscar un pouco raro no comezo, pero nós imos chegar de volta a este antes de tempo. Eu vou dicir nula, así indicando que esta función fai algo, ten un efecto secundario, pero non devolver algo para min no mesmo xeito que se int ou obter corda en si fai. E eu vou dar a este unha función nome do nome de impresión, e eu vou especifica que este cara vai levar unha cadea, e eu vou chamar a que nome cadea. Podería chamalo de calquera cousa que eu queira, pero eu quero o meu código para ser auto-documentado. Noutras palabras, se un de vós fose abrir este ficheiro e lelo, podería tipo de inferir a partir do nome que entrada o papel que debería desempeñar. E agora por baixo diso, eu vou abrir crespos e rizados cinta cinta pechada, e así entender que eu teño seguido a mesma estándar en liñas de catro a sete como Eu teño acompañado dunha boa semana, ademais de agora entre, digamos, nove liñas e 14 que compoñen principal. Noutras palabras, imprimir o nome é outra función. Agora, o compilador non vai saber chamar esa cousa automaticamente por que eu literalmente inventou, pero vai saber aínda para chamar principal automaticamente, e entón, por suposto, en liña 13, eu estou chamando miña propia función. E por que eu teño declarado que a función na liña catro, antes de inicio, iso vai ensinar o compilador o orzamento, pecha comiñas ", nome print" significa eo que debe facer. Entón, eu son unha especie de darlle un novo costume bloquear no contexto, digamos, cero. Entón, aquí, podo poñer isto moi común ou patrón recorrente de código gardo escrita en clase, printf Ola% s,% s / n "- o que quero poñer aquí? S? Entón, quero poñer o nome neste contexto. Entón, teña en conta un pouco de unha dicotomía aquí. Porque estou declarando miña propia función e eu teño un pouco arbitrariamente chamada que imprimir o nome, e por que eu teño indicado entre parénteses que esta función recibe un argumento, o tipo de que é unha cadea - polo que é unha palabra ou frase, ou algo así - e Estou chamando este nome argumento, que significa que a única variable que está en ámbito, por así dicir, é o nome. S só existe entre o que dous claves, claro? Ben, en realidade, así como a liña 10 mediante 14, entón só como o luns non pode usar S, pero o que podo facer é pasar S en nome de impresión. Imprimir o nome só acontece para darlle un alias, un sinónimo, un apelido, chamándoo de nome, e agora usalo nesta liña. Entón, agora déixeme gardar esta, zoom out. Déixeme ir adiante e facer Olá Parece bo. Non cuspir erros. . / Ola Intro. Cal é o meu nome? David. E Ola David. Así, non todo o que emocionante, pero só de pensar agora. Agora ten o mesmo ingrediente como fixemos en risco a facer as nosas propias funcións. Pero hai un pouco de unha pegadinha. Supoñamos que eu realmente non tiña pensado isto a través e realmente sen realmente pensar sobre iso escribiu esa función aquí. Sente perfectamente razoable. En risco, non hai noción de localización nos seus scripts. Podería poñer un aquí enriba, aquí enriba, un aquí, e isto pode comezar a a parecer un pouco confuso se non o fas poñelas perfectamente, pero non importa onde físicamente os guións estaban na pantalla. Por desgraza en C - e esta é diferente linguaxes como Java e Python e outros que pode estar familiarizado con - por desgraza, en C, a orde non importa, porque o que é reloxo vai pasar agora. A función estándar que está a suceder para realizar, por suposto, a principal. Principal vai chamar o nome de impresión en A liña de oito, pero, desgraciadamente, a compilador non vai nin saber que o nome de impresión Existe ata chegar a liña 11, que, por desgraza, é será demasiado tarde. Entón, imos facer facer Olá E agora, dous erros malditos xerada. Entón, agora déixeme ir ata a propia En primeiro lugar, como sempre hai que facer, e ter en conta que está berrando para min, "Declaración implícita da función imprimir o nome. " Entón, vimos esa mensaxe antes, declaración implícita de función. Cando vimos este tipo de erro? Cando eu non inclui unha biblioteca. Se eu esquezo cs50.h e eu ía estar gritou para corda ou obter int. Pero, neste caso, esta función de impresión nome non está na biblioteca, non? É literalmente neste arquivo, de xeito o que é realmente o problema? Ben, sentímolo, en C, é preciso que tan incrible literalmente que se quero unha función chamada nome de impresión para existe, ten que aplicar esta función na parte superior da súa código para que sexa accesíbel para baixar funcións, pero, francamente, que se fai desleixado moi rapidamente. Persoalmente, eu gosto de poñer principal en primeiro lugar por que, entón, é moi claro o que iso programa fai a primeira vista. E máis, pode poñerse no ángulo estraño casos en que se quere chamar x y mais y podería chamar x, só fisicamente non pode realmente colocar un por riba do outro. Pero resulta que en C, pode-se solucionar isto de xeito moi sinxelo. Vou poñer un pouco de espazo ata aquí, e eu só vou cautelarmente, aínda que algo redundante, vai ensinar a compilador que existe unha función chamou o nome de impresión, é preciso unha cadea, e eu vou chamar el nomear punto e coma. Polo tanto, este momento na liña de catro, o que nos non teña visto antes, é unha declaración un nome de función de impresión, pero é só unha promesa de que esta función finalmente definirse, finalmente ser aplicado. Este agora podo deixar só, porque agora esta é a definición, o implementación, unha especie de última milla da implantación deste función particular. Entón, francamente, é estúpido, é aburrido, pero este é o camiño é C, e é porque leva moito literalmente e, como un ordenador, a verdade debería, só fai exactamente o que diga a el facer, e para que orde é importante. Polo tanto, manter isto presente e, de novo, comezar a entender a recorrencia de estándares. As probabilidades son que vai, se non ten xa, comezar a atopar mensaxes coma este, que a primeira vista parecen totalmente enigmática, pero se comezar a ollar para estas palabras clave como "Declaración implícita", a mención dun función neste caso - e, a verdade, ten ás veces ata estar un pouco verde símbolo cenoria que lle di onde o problema pode ser - pode comezar a traballar o seu camiño a través de aínda mensaxes de erro invisible. Calquera dúbida sobre como escribir o seu propia función deste xeito? Imos facer algo que é un pouco máis convincente. En vez de só facer algo que ten un efecto colateral de impresión, deixe-me ir adiante e gardar un novo ficheiro, e nós imos chamar este positive.c, aínda que sexa será un pouco diferente contra a última vez. E esta vez, quero volver a aplicar exemplo positive.C a última vez, que é forzar ao usuario a dar me un enteiro positivo. Pero eu tiña que usar get int última vez. Non sería bo se houbese unha función chamada obter int positivo que eu podería simplemente terceirizar esa peza de funcionalidade para? Así, a diferenza aquí é que nós imos aplicar obter int positivo, pero a diferenza Nome impresión que tivo un efecto colateral - é non devolver algo para min como un número ou unha cadea - se int positivo é, por suposto, vai atrás, espero, un int positivo. Entón, imos facelo. Incluír cs50.h, inclúen Standard io.h. Int void main. E agora aquí, eu estou indo a ir adiante e digamos que int, chamalo de n, é igual a obter int positivo. E, así como obter int xa existe porque o persoal escribiu, eu vou asumir ao momento en que obteña int positivo existe, e agora eu vou para ir adiante e dicir printf, grazas pola% i / n ", n. Polo tanto, agora que eu compilar ese programa, o que que vai pasar no meu terminal fiestra na parte inferior da pantalla? Vou probablemente obter este mesmo erro de antes. Entón, imos tentar iso. Fai positiva. E unha vez máis, declaración implícita da función, obter int positivo. Así, podemos solucionar isto en un par de formas. Vou mantelo simple e só coloque miña declaración aquí e obteña int positivo. Necesito asine so-Called. A sinatura refírese só á estética do primeira liña do programa. Entón, o que debe obter positivo int retorno? Así, un int. Quero dicir, idealmente, sería volver algo así como int positivo, pero que non existe. Non vimos que, entre os nosos datos tipo, polo que temos que xestione o feito de que temos moi poucos tipos de datos para traballar. Pero podemos voltar un int e só confiar que será positivo. Vai ser chamado obter int positivo. E agora, como sobre os seus argumentos? Leva calquera entrada? Será que precisa de calquera entrada? Por iso, non precisa saber nada de antemán. Obter corda non, int non. Printf fai - necesita ter algún entrada pasou para el - eo nome de impresión precisaba de algunha entrada, pero se int positivo non. Entón eu vou explicitamente dicir o baleiro compilador. Baleiro é a ausencia de calquera outra cousa. Entón baleiro non significa nada está a suceder dentro destes parénteses, o punto e coma. E agora, no fondo do meu arquivo - e de novo, estou só sendo amable de anal aquí poñendo principal na parte superior, o que é unha boa práctica, xa que deste xeito, sempre que vostede ou alguén abre o ficheiro, o función é logo alí. Pode mergullo a partir dunha praza. Entón agora eu vou duplicar isto, estar baleiro int positivo, pero eu non son vai bater un punto e coma agora. Vou abrir chaves, e agora eu teño tomar prestado algunhas ideas de luns. Entón, como recorda, fixemos algo como facer o seguinte mentres algo que era certo. E o que foi que eu fixen? Eu fixen algo parecido dar me un enteiro positivo, pouco máis dun prompt. Podería usar todas as palabras que quero. E entón eu usei o que? Int n é igual a ser int, sen argumentos para iso. E notar a diferenza. Cando chamar a unha función, cando usa unha función, non poñer en baleiro. Só fai iso cando declarar un función, ensinando o compilador que debe esperar. Entón non necesita pór anular alí mesmo. E agora, o que era a miña condición? Ben, n non coincide co positivo, pero iso é só pseudo-código. Entón, como podo expresar iso de forma máis limpa? Así, a menos que o igual a cero. Entón, de novo, teña en conta que podes facer inferior ou igual a. Aínda que sexa dous separados símbolos, pode facelo en o teclado como tal. Pero aínda hai un erro que Fixen asneira última vez tamén. Teño que declarar - exactamente. Teño que declarar n fóra do loop. Entón eu teño que poñer n aquí enriba, e eu non quero volver a declaralo lo aquí para que eu non obter unha nova variable. Eu só quero asignar un valor aquí. E agora eu non estou ben feito aquí. Déixeme chegar á fronte de min e finxir que son feito. Chegar a ser positiva, e agora hai un novo erro. Control atinxe final función non baleiro. Entón nova mensaxe de erro, pero se tipo de desmembrar cada unha das palabras, probablemente apunta para o que está mal. Controlar. Control significa só que a orde de operacións nun programa. O ordenador está no control e algo deu mal. Polo tanto, chega ao final do unha función non baleiro. Que función é aparentemente referencia? Que función é non baleiro? Polo tanto, obter int positivo, e un pouco confuso en que o ben, é unha especie de baleiro. Ten unha especificación de baleiro para a súa argumentos, pero a súa saída vai ser do tipo n. Así, a palabra da esquerda é o así chamado tipo de retorno. A palabra no interior aquí é O cero ou máis argumentos que a función recibe. Entón o que eu teño que facer? Neste punto, o meu código, liña 21, onde ventá piscando agora é que eu ten un int positivo dentro da variable chamada n. Como fago para devolve-lo ao principal? Literalmente. Voltar n comas. Polo tanto, así como Colton volveu unha peza de papel con unha resposta para me soltando aquel anaco de papel na little black caixa sobre a mesa, para facelo en código, literalmente, só tes que escribir, o regreso n, e é como se fose Colton entregando-me algo físico. Neste caso, o que está a ocorrer é obter int positivo vai devolver o que é probablemente positivo enteiro para quen? Onde é que ese valor acabar? Iso acaba nesta variable, n, e entón imos seguir coa liña de nove. Así, noutras palabras, a fin de operacións, este programa comeza execución, eo compilador percibe, Oh, quere a biblioteca? Deixe-me ir coller o que está dentro diso. Oh, quere a biblioteca IO defecto? Deixe-me ir coller o que está dentro diso. O que fai o compilador dicir para si mesmo cando chega a catro liñas? Oh, vostede prometeu para aplicar o función chamada queda positivo, pero imos voltar a iso máis tarde, algo nese sentido. Int void main significa só aquí as entrañas do meu programa. Liña sete é só unha chaveta. Liña de oito está dicindo á esquerda, dar me 32 bits para un enteiro, chamalo de n. No lado dereito, é dicindo se int positivo. Agora imos facer unha pausa nesa historia, porque agora Non manter en movemento o meu cursor abaixo. O meu cursor agora se pon aquí porque agora comezar int positivo executa. Int n é declarada. Faga o seguinte. Printf me dá un enteiro positivo. Obter un int do usuario, almacena-lo en n, e quizais facelo de novo e de novo. Este ciclo significa que este código pode realizar arriba e abaixo como este novo e de novo, pero cando o usuario finalmente coopera e me dá un positivo int, eu bati en liña de 21, momento no que o número é entregado de volta, e que unha debo destacar agora? Nine. Control, por así dicir, regresa para aliñar nove. Esa é a liña que está ao mando. Entón, iso é o que está pasando esta vez baixo o capó, pero cando usamos funcións como printf ou ata obter corda que alguén escribiu para ti, o control estaba sendo entregado a outra persoa da liña de código por liña por liña. É só que non podía velo e nós realmente non podería representa-lo neste programa, porque está nalgún outro ficheiro no disco duro sen o coñecemento de nós. Entón, imos realmente compilar e realizar iso agora. Fai positiva. Compilar, iso é progreso. . / Positivo. Dáme un enteiro positivo. Imos ser difícil. Negativo 1. Cero. Imos darlle 50. Grazas por 50, e así por control xa retornou. Calquera dúbida, entón, sobre iso? Si? [Inaudível]. Indicar novo. Oh, boa pregunta. Así, pode notar un paralelo aquí que Eu son o tipo de corte de un canto. Na liña 12, eu digo que si int positivo retorna un int, pero por ese mesmo lóxica, agora lóxico que en liña seis, eu estou dicindo que os principais retorno un int, pero o que temos nunca tiña en calquera dos nosos programas? Nós nunca tivemos mención de esta palabra clave retorno. Así, verifícase que en C, polo menos a versión que estamos usando feito en 1999, técnicamente, este é pasa automaticamente para ti. Cada vez que aplicar un programa e que implementar unha función chamada de inicio, que a función volverá cero estándar, se non dicir o contrario, e cero é só unha convención. O mundo volve cero, así, indicando que está todo ben, efectivamente nos deixando con catro millóns posibles cousas que poden dar mal para que se volvemos un, que pode significar un código que significa que este algo deu errado. Poderiamos volver dous, o que significa esa outra cousa deu mal. Poderiamos volver catro millóns, o que significa esa outra cousa deu mal. E se agora pensar sobre o seu propio PC ou Mac, ten que lembrar que ás veces recibe mensaxes de erro enigmáticas do programa que está a utilizando e, ás veces, ten un humano descrición agradable, pero hai miúdo un código ou un número na pantalla? Se iso non veñen á mente, só manter un ollo para fóra para el. Isto é xeralmente o que estes códigos está referindo. Están incluídos no Microsoft Word e outros programas, de xeito que, se presentar unha informe de erro coa empresa, pode dicirlles, oh, eu teño o número do erro 45. E algún desenvolvedor de volta na empresa pode ver que na súa código e dicir, oh, iso é porque eu fixen ese erro e é por iso que o usuario teño esa mensaxe. Pero, francamente, é un pouco distracción e un pouco entediante para Conclúese que, polo menos, no noso primeiros programas, polo que temos se omiti-lo. Pero todo este tempo, cada un de seu funcións principal segredo tiña esa liña engadida automaticamente a vostede polo compilador, só por convención aforrar tempo. [Inaudível]. Non precisa incluíla no inicio. Iso é bo. Ten que inclui-lo se fose implementación dunha función como esta. En caso contrario, a función plana fóra non ía funcionar. Pero no inicio, non é necesario. Nunha semana ou dúas, imos comezar a recibir en que o costume, xa que pretende iniciar significando erros. Pregunta moi boa. Pausa verbal tan rápido para mencionar que este venres, que non terá xantar per se, pero imos ter unha cea con algúns dos alumnos e funcionarios. Se desexa unirse a nós, Sinto-se libre para ir a cs50.net/rsvp. 06:00 deste venres. O espazo é, como sempre, limitado, pero imos seguir facelos nun case semanalmente o espazo se esgota esta semana. Así, o suspense que paramos en Luns era que as cordas realmente ser indexado en, que significa só que pode comezar no primeiro carácter, o segundo personaxe, o terceiro personaxe e así por diante, porque pode efectivamente pensar nunha cadea, como Ola, como neste caso, de cinco letras dentro de caixas. E pode obter en cada un destes caixas co que fixemos sintaxe presentar o luns? Estes corchetes no seu teclado. Isto significa só ir ata o lugar cero. Comezamos a partir de cero, entón o soporte de cero significa h, soporte dun significa e, e así por diante. E así o tempo cando nós estivemos utilizando cordas e escribir "Ola" e "mundo" e outras cousas en pantalla, el foi gardado en caixas como esta. E dar un palpite. Que cada caixa de representar fisicamente dentro do seu ordenador? [Inaudível]. Sentímolo? Caracteres. Así, un personaxe, por suposto, no caso de cordas, e un personaxe é só oito bits ou un byte. Entón probablemente ten polo menos vagamente familiarizado co feito de que o seu ordenador ten memoria. Ten dous tipos de memoria, polo menos. Un deles é o disco duro onde gardar cousas de forma permanente, e iso é tipicamente grande, polo que pode que películas música e así por diante. Así que ten outro tipo de memoria chamada RAM, R-A-M, Random Access Memoria, e este é o tipo de memoria que se usa cando o computador é funciona, pero se perder o poder ou a súa batería morre, todo o que está almacenado na RAM desaparece se perder o poder completamente, porque non é persistente. Vostede normalmente ten, a día de hoxe, un concerto del, dous concertos, talvez máis. E a cabeza de RAM é que é moi moito máis rápido que os discos duros ou incluso discos de estado sólido a día de hoxe, pero é xeralmente máis caro por iso ten menos. Entón, a conversa de hoxe realmente se refire para a memoria RAM, que tipo de memoria que só existe mentres hai poder sendo alimentada no seu computador. Entón, cando escribir H-E-L-L-O, intro teclado, o H vai nunha byte de memoria RAM, o E está indo outro byte de memoria RAM, como é resto da palabra. Entón, lembro que fomos capaces para facer última vez foi esta. Déixeme ir adiante e abrir o ficheiro que chamamos string.c, e recordar que parecía un pouco algo así. Permítanme, en realidade, desfacer e cambiar é o que parecía, lonxitude da corda de s. Entón mire para o programa aquí. Nós temos a biblioteca CS50 así que podemos utilizar si cadea. Nós temos io.h estándar polo que podemos usar printf. Por que nós incluímos string.h? Iso era novo o luns. Entón, nós queriamos lonxitude da corda. Str Comp. As persoas decidiron hai uns anos, imos ser só sucinta. En vez de chamalo "lonxitude da corda" imos chamalo de "str Comp" e deixar o figura mundial que fóra, e por iso é que temos acceso con string.h. Este é familiar. Este é familiar. Este é familiar. Isto é algo novo. Na liña 22 - e imos volver para iso, pero agora sei - e só sei que este teña le a documentación ou se xa sabía C - obter corda, por veces, pode romper. O usuario é realmente contraditorio ou cooperante e el ou ela só non escribir nada no teclado ou tipo tanto no teclado el domina a memoria do ordenador, en teoría, obter corda podería volver algo distinto dun secuencia de caracteres. Podería voltar un valor especial chamado NULL en todas as tapas, N-L-L-L, e esta é só un chamado valor centinela. É un valor especial que significa algo de malo aconteceu neste caso. É a ausencia dunha secuencia. Entón nulo Estou comprobando simplemente para que, En resumo, str Leng e outras funcións que veñen con C, se esperan unha corda, pero paso-los a ausencia dunha cadea, se pasar eles NULL, o ordenador ou o programa só vai fallar completamente. Vai frear. Que vai vomitar algunha mensaxe de erro. Cousas malas van ocorrer. Así, aínda que este aínda é non ben definido - iso vai facer máis sentido nunha semana ou dous - na liña 22, este é só un exemplo de auto comprobación de erros defensivos só no caso de que un tempo fóra de un millón de algo sae mal, a menos o meu programa non ha falla. Entón, se s non é igual a algo malo, Eu teño ese loop for, e iso foi onde tivemos que outro nova peza de sintaxe. Eu teño un loop de iteración cero ata a lonxitude do s. E entón aquí, eu era unha impresión de fóra s soporte de i, pero por que eu uso% c todo súpeto, no canto de% s ata que s é unha cadea? É un personaxe, non é? S é unha cadea, pero s soporte de algo, s soporte i, onde i é cero ou un ou dous, iso é un individuo carácter na cadea, e así por que, printf ten que ser informada de que é na verdade un personaxe que esperar. E entón lembro, o que o fixo programa realmente fai? Impreso-lo en columnas. Si, exactamente. E só imprimiu a palabra que eu escribir unha columna, un carácter por liña. Entón imos ver iso de novo. Entón faga cadea. Compilado Aceptar. . / Cadea. Déixeme escribir H-E-L-L-O, Intro e en realidade eu entendo, un por liña. Entón deixe-me facer unha optimización aquí. Se pensar sobre iso, especialmente se xa programou antes, hai sen dúbida, unha ineficiencia na liña 24. Noutras palabras, non é necesariamente o mellor deseño. Simple, polo menos unha vez lembre que str Comp é, pero é facendo parvada potencialmente. O que pode ser iso? [Inaudível]. Exactamente. É comprobando a lonxitude do s en cada momento, aínda que H-E-L-L-O sempre vai ser de cinco caracteres. Cada vez que a través desta malla, a cinco non está a cambiar. Podería estar incrementando i, pero o que é a lonxitude do s en cada iteración deste loop? E cinco, e cinco, que é cinco, e aínda estou preguntando iso, con todo pregunta de novo e de novo e de novo. Agora, francamente, o ordenador é tan maldita rápido, ninguén vai notar unha diferenza de, neste caso, pero estes tipos de decisións de deseño pobre pode comezar a sumar o propio compilador non tentar corrixir isto para vostede que que normalmente non faría, polo polo menos no interior do aparello. Entón eu vou facelo. Eu estou indo a engadir unha coma despois miña primeira variable, i. Vou darme outro variable, chamando-n, só por convención para números, e entón eu estou vai asignar n o valor de cadea longo do s. E entón eu vou cambiar miña condición de ser o que? Vou cambiar a miña condición para cando sexa menor que n. Entón, agora, as veces son eu comprobar a lonxitude do s? Unha vez, pero é OK para comprobar i contra n unha e outra vez, xa que agora os Os valores non están realmente cambiando. Agora, polo de agora, só sei que cando chamar a unha función, hai un pouco de encima, non o suficiente para desanima-lo realmente sempre de utilizar as funcións, pero seguramente cando hai unha liña de código así - e as liñas se ve máis interesante antes de tempo - onde hai unha oportunidade para pensar, se eu Introduce este código, cantas veces vai executar? Vai comezar a ver ao longo do tempo a desempeño dos seus programas poden de feito cambiar. De feito, un dos problemas define temos fixo o ano pasado, implica implantación, como ten que lembrar de semana cero, un corrector ortográfico, pero unha corrector ortográfico que está deseñado para soportar un dicionario de 150 mil máis palabras que dan a vostedes. Vostede tería que escribir un código que carga esas palabras na memoria RAM, así en caixas como vimos na pantalla dun momento atrás, e logo, tan rápido como pode, ten que ser capaz de responder a unha cuestión da forma, é esta palabra incorrecto? É esta palabra incorrecta? É esta palabra incorrecta? E, en algo parecido a isto que temos feito o ano pasado se converteu, aínda que nunha base opt-in opcional, un competición do tipo, en que o alumnos que usan o menos RAM e menos tempo, menos ciclos de CPU, acaban burbulla para o inicio dun pequeno tarxeta do líder ou a clasificación que puxo en páxina de inicio do curso, como xa feito nos últimos anos. Así, unha vez máis, totalmente opcional, pero esta fala ás oportunidades de deseño que están á cabeza cando comezamos construción na parte superior dalgunhas destas bloques de construción básicos. Entón deixe-me volver a este diagrama para só un momento e revelar algo algo máis. Este feito é unha cadea, e tivemos vantaxe de algunhas bibliotecas io.h estándar que ten - Printf. Printf, entre outras cousas. cs50.h, que se int e obter cadea e así por diante, string.h, que tivo str Comp. Pero resulta que hai aínda outro. Francamente, hai moitas e moitas cabeceira arquivos que declarar funcións para as bibliotecas, pero iso é ctype.h realmente vai ser un pouco vantaxoso, porque eu vou para ir adiante e aplicar un outro programa aquí. Déixeme ir adiante e abrir man de algo Escribín antes chamada capitalize.c, e imos dar un ollo en como funciona isto. Lembre que está a usar, nesta versión del, tres arquivos familiares. Teña en conta que, na liña 18, eu son obter unha liña de texto. Observe na liña 21, estou afirmando que o seguinte código vai capitalizar s, o que o usuario inseriu , E como eu estou facendo isto? Ben, eu estou tomando - lección aprendida a última vez - Estou declarando i e n e iteración sobre os caracteres na cadea. E entón o que é ese bloque de código na liña 24 a 27 facer en termos laicos? Minúsculas carta de volta. Exactamente. Se s soporte i - por iso, se o i-th carácter de s, que é dalgún carácter na cadea, é maior que o igual a un e minúsculas - recordar que o dúo comercial significan e - e mesmo personaxe, s soporte i, é inferior ou igual a Z. minúsculas, isto significa que se un A ou B ou C ou punto, punto, punto ou z, o que significa é minúscula. O que quero facer nese caso? Ben, eu podo facelo un pouco enigmaticamente, pero imos provocar este apart. Vou chamar ao printf, imprime% c porque quero reimprimir este personaxe na pantalla. Estou pasando entón a ter soporte s i, o i-th personaxe s, e despois por estou facendo este pequeno truco aquí, minúsculas Un capital de menos? Que dará me, dun modo xeral? [Inaudível]. Exactamente. Realmente non me lembro - que foi de 65 para o capital A. Realmente non lembre que é un minúsculo, pero non importa. O ordenador sabe. Así dicindo, minúsculas salvo maiúscula, é estraño ser restando un char doutro, pero cales son chars debaixo do capo? Son só números. Entón o que estes números son, deixar que o equipo recorda que en vez de o que me humana. Entón minúsculas unha capital menos un é me vai dar a diferenza. El pasa a ser de 32, e que sería o caso de minúsculas b e de capital B e así por diante. El permanece consistente, por sorte. Entón, eu estou dicindo esencialmente, tomar o letra minúscula, restar off que diferenza de nivel, e que efectivamente cambios s soporte de i minúsculas, claro, maiúscula, sen que eu realmente ter que pensar sobre ou lembre, o que eran os números falamos cando os oito voluntarios xurdiu no escenario? Agora, mentres tanto, no máis, se non é unha letra minúscula, conforme determinado pola liña 24, só imprimir lo. Eu só quero tocar a caracteres que eran de feito orixinalmente minúsculas. Entón, imos ver iso. Fai capitalizar. Compilado, Aceptar. . / Capitalizar. E déixeme escribir H-E-L-L-O en letras minúsculas, Intro. E entender que se converter en letras maiúsculas. Déixeme facer iso de novo con unha palabra diferente. Que tal D-A-V-I-D co primeiro D capitalizados como un nome tipicamente é? Intro. Teña en conta que é correcta. El só emite o primeiro inalterada D vía que calquera outra construción. Polo tanto, teña en mente, entón, un algunhas cousas aquí. Un, se quere revisar dous condicións dunha soa vez, pode e xuntos, como prevíamos. Pode comparar personaxes dese xeito e tratar eficazmente personaxes como números, pero, francamente, iso é tan maldita críptica eu nunca vou recordar Como chegar a este a partir de cero sen razoar con el por un bo un pouco de tempo. Non sería bo se alguén aí, escribiu unha función chamada inferior ao que podería responder por min certa ou falsa, este personaxe é minúscula? Ben, por sorte, quen escribiu ctype.h fixo exactamente iso. Déixeme ir ata aquí e engadir ctype para c tipo, e agora déixeme ir ata aquí e reescribir esta liña como segue. Entón, se se chama é menor, eu afirmo, s soporte de i, entón eu vou borrar estas dúas liñas completamente. Entón agora a alguén, eu estou esperando, escribiu unha función chamada é menor, e é Acontece que fixeron e declararon lo dentro ctype.h. E agora vou saír da liña 27 só, eu vou deixar liña 31 só, pero entender o que eu teño reforzouse o meu código. É agora máis limpo. É menos difícil ollar a través porque agora a función, ademais, é tan marabillosas nomeado só fai o que di. Entón agora eu estou indo a gardar esta. Vou diminuír o zoom. E así como en risco podería ter Booleanos, valores booleanos certo ou falsa, iso é o que se efectivamente reducir retorno. Déixeme recompilar. Déixeme re-run. E agora imos tratar de novo, H-E-L-L-S, Intro. Iso é moi bo. E probe de novo, comproba se I non romper algo. Isto é capitalizado tamén. Pero iso non é bo o suficiente, xa que o outra cousa que eu nunca vou Teña en conta que se non traballar con el de verdade coidadosamente sobre, digamos, o papel é esta liña maldita. Non sería bo se houbese unha función chamada a superior? Ben, pasa por aí está en ctype.h ben. Eu estou indo a ir adiante e escribir - deixe-me traer a liña de volta. Pola contra aquí, deixe-me ir adiante e digo, substituír o% c da resultado de chamar esta función para superior da i-th carácter de s. E agora entende que está quedando algo equilibrado. Eu teño que manter o control de cantas parénteses eu abría e pechaba. Entón, agora é aínda máis limpo. Agora, este programa está quedando mellor e mellor deseñado, sen dúbida, porque é moito máis lexible, pero non é ningunha imos corrixir. Fai capitalizar. . / Capitalizar. H-E-L-L-S. Imos executa-lo de novo, D-V-A-I-D. OK, entón aínda estamos en boa forma. Pero agora a superior. Propoño que hai unha Limpe poderíamos facelo sería moi bo, que podería realmente usar se este código e realmente nos dan cinco de cinco para o proxecto, por exemplo. O que sería bo para se librar? Ben, mira como maldito longo deste bloque de código é só para facer algo simple. Agora, como un aparte, como pode ter ver na sección de super ese pasado fin de semana, non rigorosamente o claves cando só ten unha liña de código, aínda que propuxemos mantelos de xeito que fai moito máis claro, como en forma de U de cero bloques, o que está dentro do sector. Pero non sería bo se a superior, cando dada a súa entrada, transformouse o en maiúsculas, se non é, e cal sería ser marabilloso, en caso contrario, se xa é maiúscula? Só pasalo a través e deixalo só. Entón quizais sexa iso. Podería probar e só espero que el, pero déixeme introducir unha outra cousa. No canto de empregar esta built-in da terminal fiestra aquí en baixo, recorda que esta icona cadrado negro dálle unha grande fiestra de terminal que podo encher pantalla, se eu queira? Entón non é que son unha especie de estraño nomeado, pero non hai esas cousas chamadas Man pages, páxinas de manual, o home para breve, e podo acceder a estes por escribindo man - o que me gustaría escribir? Home superior. E agora entender que existe unha funcionando no interior do ordenador, en Neste caso, o aparello, que é só o sistema operativo Linux, que vai para me dar un conxunto un tanto enigmática de saída, pero vai atopar ao longo do tempo que el sempre está formatado practicamente o aínda así que comezar a se acostumar con iso. Teña en conta na parte superior para arriba, e é aparentemente o mesmo documentación para diminuír. Quen escribiu que estaba cortando algúns ángulos e poñer todo nunha páxina. Propósito destas "cousas en vida é a de converter un carta a maiúsculas ou minúsculas. Teña en conta que na sinopse, a páxina man está me ensinando que ficheiro eu teño para incluír a usar esta cousa. Está me dando as sinaturas para estes funcións, ambos, incluso aínda que agora só se preocupan un. Aquí é agora unha descrición. Para superior convértese letra c en maiúsculas, se é posible. Aínda non é instrutivo, pero déixeme agora ollar por baixo do valor de cambio, a cousa que se entrega de volta. Así, o valor que é de retorno do carta ou c converter o conversión non se pode. Que é c? O carácter orixinal. O personaxe orixinal e sabemos polo que, de novo, indo ata a sinopse, e quen escribiu isto función só decidiu que a entrada cara á parte superior e inferior é só arbitrariamente será chamado c. Eles poderían ter chamado máis nada eles queren, pero eles mantiveron simple como c. Entón, eu consultei a páxina do manual. Esta frase me garantiu que, se non é unha letra minúscula, é me vai dar de volta c, o que é perfecta, o que significa que pode se librar de miña condición de persoa. Entón deixe-me volver a gedit, e agora déixeme facelo. Vou copiar a miña instrución printf. Eu estou indo a ir adiante e á dereita dentro o loop de impresión para fóra, e obter Libren-se agora toda esta construción se. Non era unha mala idea, e foi moi moi correcto e coherente con todo o que teño cravado, Pero non é necesario. Así que entender algunha biblioteca función de que hai alguén escribiu, ou quizais escribiu noutro lugar o ficheiro, pode usalo e realmente comezar a usar o código. E cando digo cousas como bo estilo, o feito de que a persoa chamada funcionar a superior, ou anteriormente se inferior é incrible útil porque son moi descriptivo. Non quere chamar as funcións x e y e z, os cales teñen moito, moito menor significado. Calquera dúbida sobre esta serie de melloras? Entón, só tes que dicir que un dos delivery é mesmo como o seu propio problema set - quizais un conxunto de problemas, pero seguramente I definir dous e para adiante, mesmo cando se está correcto non necesariamente significa que son perfectos só ou aínda particularmente ben deseñado. Ese é o outro eixe para comezar a pensar. Polo tanto, esta foi unha secuencia dentro da súa memoria do ordenador, pero se ten un grupo enteiro de personaxes como H-E-L-L-O dentro de RAM, e supoña que no seu programa de chamar obter cadea varias veces de tal forma que chamar obter secuencia dunha vez, entón chamar obter corda de novo. Ben, o que vai ocorrer ao longo do tempo? Noutras palabras, se ten unha liña de código, aínda que fóra de contexto, como cadea s queda - imos facelo. String nome coincide obter cadea. Entón supoño que esta liña de código se destina pedir ao usuario para o seu nome. Esta seguinte liña de código é usado para solicitar o usuario para a súa escola, e esta liña seguinte, e así por diante. Supoña que sigo a preguntar o usuario a outro e outra e outra cadea. Eles van estar na memoria á vez. Un non vai espancar o outro. A escola non é substituír o outro. Pero onde eles fan todo acabar na memoria? Ben, se comezar a debuxar na pantalla, que podemos utilizar esta cousa aquí como un cadro-negro, se ese negro rectángulo representa o meu ordenador de memoria, vou comezar a arbitrariamente dividíndoo en cadrados pequenos, cada un dos cales representa un byte de memoria. Francamente, se ten un gigabyte de memoria RAM nos días de hoxe, ten mil millóns de bytes de memoria no seu ordenador, de xeito mil millóns destas prazas. Entón, só tes que dicir que, este non é realmente a escala. Pero poderiamos estar tirando todos estes claramente non escala cadrados, e este representa colectivamente memoria do meu ordenador. Agora imos facer punto, punto, punto. Polo tanto, noutras palabras, cando eu agora levar o usuario coa corda get me dar unha cadea, o que pasa? Se o usuario escribe en "Ola", que remata Se en H-E-L-L-S. Pero supoña que o entón o usuario tipo de - en realidade, eu non debería ter feito Hola, porque estamos pedindo los polos seus nomes. Entón, imos voltar se podo facelo. Entón, se eu escribir D-A-V-I-D para o meu nome, pero recorda que a segunda liña de código foi conseguir a cadea de novo para obter a súa escola. Onde é que a palabra que o usuario tipos en indo a ir xunto? Ben, quizais vai entrar H-A-N-V-A-R-D. Así, aínda que eu teño deseñado como dúas liñas, este é só unha morea de bytes na súa RAM do ordenador. Hai un problema, porque agora se eu son usar RAM neste moi razoable pero unha especie de forma inxenua, o que pode aparentemente non distinguir? Onde empeza un e onde remata un, non? Son o tipo de borrar xuntos. Así, verifícase que o ordenador non fai iso. Déixeme realmente rolar de volta o tempo a poucos personaxes, e ao contrario de Harvard vai inmediatamente despois do nome do usuario, o usuario realmente queda, detrás das escenas, un personaxe especial inserido pola ordenador para el ou ela. / 0, tamén coñecido como o personaxe nul annoyingly chamado N-K-L, nin N-L-L-L, pero escribilo como / 0. É que todos os bits cero é un marcador de entre a primeira palabra que o usuario ingresaran eo segundo. Entón Harvard realmente agora remata como esta secuencia de caracteres e un máis / 0. Así, noutras palabras, facendo que estes valores sentinela, de oito a cero contigua anacos, agora pode comezar a diferenciar un personaxe doutro. Entón, todo este tempo que estaba "Ola" é en realidade, "Ola" coa / 0, e con todo, pode moi ben ser un pouco máis memoria RAM no interior do ordenador. Deixe-me facer outra cousa agora. Acontece que todas esas prazas temos que chegou a deseñar, son, si, cordas, pero máis xeralmente, estas cousas son matrices. Unha matriz é só unha peza de memoria que está de volta a facer a volta atrás, e normalmente usa unha matriz por medio desta notación corchete. Entón, imos ver estes un pouco ao longo do tempo, pero déixeme ir adiante e abrir, imos chamalo as idades. E teña en conta o que podemos facer con estes mesmos trucos, algo pouco máis de sintaxe aquí. Así, na liña 17 deste programa - De feito, deixe-me executar o programa primeiro para que poidamos ver o que esa cousa fai. Deixe-me chamar para facer as idades compilar este programa. As idades. /. Cantas persoas están na sala? Chamalo de tres. Idade da primeira persoa? 18, 19 e 20. E agora un pouco ridículo, eu só fixeron un programa que idades os tres persoas. Polo tanto, hai claramente unha oportunidade por algunha aritmética diversión aquí. Afortunadamente, a matemática é correcta. 18 foi a 19, 19 foron a 20 e así por diante. Pero o que realmente significaba ser ilustrativo aquí é o xeito no que estamos almacenando idades destas tres persoas. Déixeme achegar o que está pasando aquí. Entón, primeiro, estas primeiras liñas deben estar recibindo moi familiar. Estou só alertando o usuario á número de persoas na sala. Entón eu estou usando obter int e facer mentres a facelo de novo e de novo e de novo. Vimos que o patrón anterior, pero liña 27 é novo e moi útil, e se fará cada vez máis útil. Teña en conta que o que é diferente en liña 27 é que me parece que é declarar un int chamados idades, pero esperar. Non son só as idades int. Hai estes corchetes, dentro da cal é n. Así, o soporte n neste contexto, non dentro dunha instrución printf aquí, pero nesa soa liña 27, esta liña está dicindo, me n ints dar, cada un dos cales é do tipo int. Polo tanto, este é un balde, por así dicir, de, neste caso, tres enteiros de volta ao volta para atrás para que eu efectivamente ten tres variables. A alternativa, ser suposto, sería esta. Se eu quixese o primeiro alumno idade, eu podería facelo. Se eu quixese a segunda alumno idade que eu podería facelo. Se eu quixese a terceira alumno idade, eu podería facelo. E Deus me libre que necesitamos de todo o mundo idade nesta sala - Quero dicir, este é un anaco de un monte de copia, colar de novo e de novo e de novo. E unha vez eu compilar este programa, se outro alumno camiña sobre a daquela porta, agora a miña identidade de variables é correcto. Entón, o que é agradable sobre unha matriz é como Así que comezar a sentir-se copiando e pegando, as probabilidades son que se non é a mellor visión. Unha matriz é dinámica potencialmente. Non sei con antelación cantas persoas van estar na sala, pero eu sei que eu teño n delas, e eu vou descubrir n cando chegar a hora. Esta liña de código significa que agora me dea un anaco de memoria que se parece con isto onde o número de caixas na pantalla é enteiramente dependente do que n o usuario inseriu dentro Entón, agora o resto do programa realmente moi semellante ao que só fixen cos personaxes. Repare que eu teño un loop comezando na liña 30. Entón, logo despois que eu incorporarse o array, I iteración de y é igual a cero en ata n. Eu só teño este printf instrutivo mensaxe dicindo, dáme a idade de persoa #% i, entón o número un, número dous, número tres. E por que eu fixen iso? Francamente, os humanos prefiren contar dun en ata mentres científicos da computación, zerar enriba. científicos da computación non vai utilizar este tipo de programa, polo que estamos vai só comezar a contar nun como persoas normais. E agora, en liña 33, teña en conta a lixeiramente diferente peza de sintaxe. O i-th idade en que a variable do tipo matriz é indo a obter un int. E agora, por fin, este é só aritmética aquí. Decidín nun circuíto separado para reclamar algún tempo pasa, e agora neste circuíto separado, estas liñas de executar. Un ano a partir de agora, a persoa i será i anos de idade, pero teña en conta que este non é o variable i. Isto agora é% i para int. E noten como o primeiro espazo reservado, I plugin i + 1, entón contamos como unha persoa normal. E, a continuación, para o valor da súa idade, para i anos de idade, eu tomo as idades soporte i - e por que eu estou facendo un máis aquí? Eles só envellecido. É a miña elección estúpida de programas. Eles só envelleceu un ano. Podería escribir calquera número que En realidade, eu quero alí. Entón, cal é, en realidade, todos a relevancia aquí? Ben, deixe-me realmente rolar cara atrás aquí e pintar un cadro do que está por vir. O que imos facer o noso próximo Problema Set Two é inmiscirse-se no mundo da criptografía. Polo tanto, esta é unha cadea de carácteres, co fin de secuencia de varios caracteres, eo que que iso di? Non é a versión en liña das diapositivas. Entón, eu afirmo que isto equivale a iso, unha propaganda estúpida de moitos anos hai que poida realmente lembrar unha das súas orixes. Polo tanto, este é un exemplo de cifrado ou cifrado. Acontece que, se quere en realidade, enviar información ou partes información con alguén de forma segura, como unha mensaxe como esta, pode embaralhar as cartas. Pero, normalmente, as palabras son non revoltos aleatoriamente. Están permutados, de algunha maneira ou modificados de algunha maneira para que - oops. Isto é un spoiler divertido para a próxima vez. Así, pode localizar nun mapa o que é, ao parecer, A para B. Teña en conta que aliñan capitalización-wise. Ao parecer, r torna-se e. Ao parecer F-H-E-R convértese en S-L-R-E. Así verifícase que hai un mapa, e en Neste caso, hai un moi estúpido cartografía se alguén descubrir-lo? Isto é algo chamado Rot 13, Rotar 13. É o máis estúpido de cifrado mecanismos, xa que literalmente engade 13 cada unha das letras, estúpido no sentido de que se só ter un pouco de tempo libre nas súas mans e un lapis, ou simplemente pensa que a través da súa cabeza, pode probar todo incrementos posibles - un, dous, tres, punto, punto, punto, de 25 a só executar o alfabeto enteiro, e Finalmente, vai descubrir que esta é unha mensaxe. Entón, se fixo algo parecido a isto en escola primaria pasando mensaxes para a súa mellor amigo, se a escola primaria profesor simplemente ler a través da mensaxe e ataque de forza bruta a solución, pode ter comezado unha resposta por iso. Agora, por suposto, no mundo real, cifrado é máis sofisticada. Este é un fragmento do texto dun sistema informático que ten nomes de usuario e contrasinais, como case todos do noso facer, e iso é o que o seu contrasinal pode mira como se almacenado no seu disco dirixir, pero de forma cifrada. Este non é só un xiro de letras, A e B e B e C. Trátase moito máis sofisticado, pero usa o que é xeralmente coñecido como clave secreta cifrado. A imaxe di o seguinte historia con algúns iconas. Na parte esquerda, o que temos imos chamar de texto simple. No mundo da criptografía, plain texto é só a mensaxe orixinal escrito en inglés ou francés ou calquera outra lingua calquera. Se quere cifrar tanto, imos pasar a través dun cadeado pictoricamente, así dalgún tipo de algoritmo, algunhas funcións ou programa que alguén escribiu que embaralha as cartas espera complicatedly máis que a suma de 13 para cada un deles. O que saír dese proceso no medio alí chámase cyphertext. Así unha especie de palabra sexy. Significa só que é o cifrado versión do texto. E só se ten o mesmo segredo, 13 ou menos 13, vostede é capaz de descifrar unha mensaxe como esta. Así, o conxunto de problemas Dous, entre as cousas vai facer no Hacker Edition, terá que escribir código para romper esas contrasinais, descubrir o que eran e como eran criptografía, aínda que darlle un pouco de orientación ao longo do camiño. Na Standard Edition, introducimos un par de cifras, o cifrado mecanismos, un chamado César, un chamado Vigenère, que aínda están cifras de rotación, onde se fai un algo, B convértese en algo, pero ten que facelo a través de programación porque hai de feito será un segredo clave implicados, que normalmente é un número ou unha contrasinal que só o remitente eo destinatario destes mensaxes deben entender. Agora, iso ten realmente encarnações no mundo real. Este, por exemplo, é pouco orfo Anel decodificar secreto de Annie, e realmente pode aplicar estas cifras de rotación - Un convértese en algo, B pasa a ser algo - cun par de rodas, unha no lado de fóra, unha no lado de dentro de tal forma que se xirar a roda ou o anel, pode realmente aliñar o cartas con letras distintas, obtención dun código secreto. E así como gancho para hoxe, o que eu penso que eu ía facer é un pouco de retroceso que, se conectar a TV o 24 de decembro, pode asistir a película ad nauseum para 24 horas nunha cola. Pero por hoxe, vou abri-lo aquí e dar só dous minutos de Historia de Nadal pedagoxicamente relevantes cun pouco de suxeito chamado Ralphie. [REPRODUCIÓN] -Que sexa coñecido por toda a xente que Ralph Parker é nomeado membro da Orphan Annie pequeno segredo círculo e ten o dereito de todos os honores e beneficios ocorrendo ao mesmo. -Asinado, Little Orphan Annie. Referendado, Pierre André en pintura. Honores e beneficios xa coa idade de nove anos. [Gritando ON RADIO] Imos, imos pronto con iso. Eu non teño todo o que arredor de jazz contrabandistas e piratas. -Escoita mañá á noite para a concluíndo aventura do negro navío pirata. Agora é o momento de segredo de Annie Mensaxe a vós, membros de The Secret Circle. Lembre, nenos. Só os membros do Círculo Secreto de Annie pode descodificar a mensaxe secreta de Annie. Lembre, Annie está dependendo de ti. Define as súas patas para B2. Aquí está a mensaxe. 12, 11, 2 - -Estou no meu primeiro encontro secreto. -25, 14, 11, 18, 16 - -Pierre estaba en gran voz onte á noite. Podería dicir que a mensaxe de hoxe á noite foi moi importante. -3, 25. Esta é unha mensaxe de Annie se. Lembre, non diga a ninguén. -90 Segundos despois, estou na única sala na casa onde un neno de nove anos podería sentar intimidade e decodificación. Aha, B. Eu fun a outro. E. A primeira palabra é "ser". S. Estaba chegando máis fácil agora. U. 25. Isto é R. -Imos, Ralphie. Teño que ir. -Eu vou estar ben abaixo, Ma Mirabolantes. -T. O. Comprobe se. Asegúrese de que? Cal foi a Little Orphan Annie está intentando dicir? Asegúrese de que? -Ralphie, Randy ten que ir. Quere facer o favor de saír? -Todo ben, nai. Eu estarei fóra. -Eu estaba quedando máis preto agora. A tensión era terrible. Que foi? O destino do planeta pode colgar na balanza. -Ralphie, go gotta de Randy. -Eu vou estar ben para fóra para Crying Out Loud. -Case alí. Meus dedos voaron. A miña mente estaba nunha trampa de aceiro. Todos os poros vibrar. Era case clara. Si, si, si, si, si. -Asegúrese de beber o seu Ovomaltine. Ovomaltine? Un comercial porco? Fillo de puta. [FIN reprodución de vídeo] COLUMNA 1: Este é CS50, e que será Problem Set Two. Vexo vostedes a próxima semana. COLUMNA 2: Na seguinte CS50, isto ocorre. COLUMNA 1: Entón, un tema que non ten mirou ata agora é a de punteiros de función. Agora, un punteiro de función só é a dirección dun público función, pero moi parecido - fillo dun -