[MÚSICA DE XOGO] DAVID J. Malan: Todo ben. Este é CS50, e este é o final da semana 2. Entón, hoxe, nós imos para continuar a nosa mirada o xeito no que representamos as cousas debaixo do hood-- afastándose de números como enteiros e valores de punto flotante e centrados en cordas e programas, finalmente, máis interesantes. Pero nós tamén imos dar un ollo a un par de problems-- específica de dominio a primeira das cales vai ser inclúen criptografía, o arte de codificación da información, en que ve enriba aquí é un retrato da Radio Orphan Annie anel decodificar secreto do pasado. Este é, en realidade forma moi primitiva e forma para nenos de cryptopgraphy en que este anel ten dous disks-- un dentro e outro fóra. E virando un deses, pode esencialmente aliñar letras como A a Z con outras letras B como a través da A. Por outras palabras, pode literalmente virar o alfabeto, benvida, así, cun cartografía a partir de cartas para cartas de xeito que, se quería enviar unha mensaxe secreta para alguén como Annie, podería escribir abaixo a mensaxe e, a continuación, xire as letras, en que, se quere dicir dicir "A", ten no canto dicir "B", Quere dicir "B", ti, en vez dicir "C" - ou algo un pouco máis intelixente que que-- e despois, en definitiva, mentres Annie ten ese decodificador anel, pode decodificar a mensaxe. Agora, ten que se lembrar, de feito, que este foi usado nunha película moi famoso que xoga ad nauseum durante a época de Nadal. Imos dar un ollo aquí. RALPHIE PARKER: "Sexa coñecido por todos, en resumo que Ralph Parker é nomeado un membro da Little Orphan Annie Segredo Círculo e ten dereito a todos os honores e beneficios que se producen ao mesmo ". RALPHIE PARKER (narrando): Asinado Little Orphan Annie. Referendado, Pierre André! Na pintura. Honores e beneficios, xa coa idade de nove anos. [MÚSICA DE XOGO] [RADIO Chatter] RALPHIE PARKER: Imos alí. Seguiremos con el. Eu non teño todo ese jazz sobre contrabandistas e piratas. RADIO locutor: Escoite mañá noite para a aventura final do barco pirata Negro. Agora é o momento de Annie Mensaxe secreta para os membros da do Círculo Secreto. Teña en conta que dos miúdo, só membros de segredo Circle de Annie pode descodificar a mensaxe secreta de Annie. Lembre, Annie está dependendo de ti. Define os seus pinos para B-2. Aquí está o message-- 12, 11, 2-- RALPHIE PARKER (narrando): I estou no meu primeiro encontro secreto. RADIO locutor: --25, 14, 11, 18, 16-- RALPHIE PARKER (narrando): Oh, Pierre estaba en gran noite de voz. Podería dicir que esta noite mensaxe era realmente importante. RADIO locutor: --3, 25. Esta é unha mensaxe de Annie a si mesma. Teña en conta que, non conte a ninguén. [Ofegante] RALPHIE PARKER (narrando): Noventa segundos despois, eu son no único cuarto no casa onde un neno de nove anos podería sentar privacidade e decodificar. Ah. "B." [Risas] RALPHIE PARKER (narrando): Eu fun a outro. "E." A primeira palabra é "ser". Si! Estaba chegando máis fácil agora. "U." [Risas] Randy PARKER: Ah, imos alí, Ralphie. Eu teño que ir! RALPHIE PARKER: Vou baixar, Ma. Gee Whiz. "T." "O." "Comprobe se con "." Asegúrese de "o que? Cal foi Little Orphan Annie intentando dicir? "Asegúrese de" o que? NAI: Ralphie, Randy ten que ir. Será que podería saír? RALPHIE PARKER: Todo ben, nai! Vou saír ben! RALPHIE PARKER (narrando): Eu estaba quedando máis preto agora. A tensión era terrible. Que foi? O destino do planeta poden estar en xogo. NAI: Ralphie, Randy ten que ir! RALPHIE PARKER: Eu estarei ben fóra, polo amor de Deus! RALPHIE PARKER (Narrando): Case alí! Os meus dedos voaron! A miña mente estaba nunha trampa de aceiro. Cada poro tensou. Era case suposto! Si! Si! Si! Si! RALPHIE PARKER: "Comprobe se para beber o seu Ovomaltine. " Ovomaltine? Un comercial miserable? [MÚSICA DE XOGO] RALPHIE PARKER: Fillo de puta. [Risas] DAVID J. Malan: Para que, entón, é un reflexo do que o cifrado pode ser a un isto-- beber do pasado. Así, un anuncio rápido. Se está libre esta Venres ás 13:15 e faría quere unirse a nós para CS50 xantar, ir a este URL aquí. Primeiro en chegar, primeiro a servir como de costume. Pero co tempo, imos estar seguro de que máis quen quere participar Pode programar-wise. Así cordas. Temos Zamyla-- quen xa reuniu máis probable Na Serie 1-- cuxa nome está escrito así. E supoña que escribiu o nome nun programa de ordenador que é usando algo coma getString. A fin de recuperar esas teclas, como nós imos sobre o que representa unha corda, unha palabra, un parágrafo ou varias letras como estes aquí? Falamos última vez sobre enteiros e problemas que xorden con integer overflow e valores de punto flotante e os problemas que xurdir dentro de precisión. Con cordas, nós, polo menos, ter un pouco máis de flexibilidade porque strings-- só no real mundo-- poden ter unha lonxitude moi arbitraria. Moi curto, moi longo. Pero, aínda así, imos descubrir que ordenadores poden, por veces, sen memoria e nin sequera almacenar unha cadea grande abondo. Pero, por agora, imos comezar a ver unha secuencia como algo nesas caixas Aquí. Así, seis destas caixas, cada un dos cales representa un carácter ou "char". Entón, lembrar que "char" - c-h-a-r-- é un dos tipos de datos embutidos en C. E o que é bo é que pode usar que tipo de como un bloque de construción, unha peza de puzzle, se quere, para formar un maior tipo de datos que imos seguir para chamar unha "cadea". Agora, o que é útil pensar sobre cousas como cordas, deste xeito? Ben, acontece que pudermos realmente aproveitar esta estrutura para acceder, en realidade, caracteres individuais dunha forma moi sinxela. Eu estou indo a ir adiante e crear un ficheiro chamado "stringzero.c" pero pode chamalo de todo o que desexa. E na páxina web do curso é Neste exemplo xa antes, así que non escriba todo. E eu estou indo para adiante e primeiro facer void main int. E en poucos días, imos comezar a desmembrar o baleiro é aquí, por iso que é int xunto principal, e así por diante. Pero, por agora, imos seguir para copiar e pegar isto. Vou declarar unha cadea chamada s. E eu vou volver GetString calquera que sexan o usuario escribe. Este vai ser un simple programa, ningunha instrución, Eu só vou cegamente esperar que o usuario saiba o que facer para mantelo simple. E agora eu vou ter un loop for. E dentro do meu loop Estou terá int i recibe cero. E i é, de novo, só unha convención, un índice de variable de conta, pero eu podería chamar iso o que eu queira. Vou facer i é menos than-- ben O nome de Zamyla é de seis letras. Entón eu vou para o disco código que non para agora. E entón i ++. E agora dentro destes crespos claves eu vou facer printf, e quero imprimir un carácter de cada vez. Entón eu vou usar% c para quizais por primeira vez. E entón eu quero imprimir cada personaxe na súa propia liña. Entón eu vou poñer unha pouco barra invertida n alí. Pechar cotización. E agora quero facer algo aquí. Quero imprimir o letra específica na secuencia, s, como eu estou interactuar de cero en ata seis. Noutras palabras, quero imprimir o carácter i'ésima de s. Agora, como podo facer iso? Ben así como as caixas en esta representación aquí, tipo, evocar a noción de boxeo letras, pode facer do mesmo xeito que sintaticamente en C simplemente especificando, Quero imprimir s de i'ésima personaxe. Usando os corchetes no teclado do seu ordenador que nun teclado americano son xeralmente por riba da súa tecla de retorno. Entón iso non é certo Con todo, como ten que notar. Pero eu estou indo para o tipo de cegamente avanzar aquí. E eu vou facer facer secuencia 0. Pero antes de facelo, imos ver se nós non pode anticipar algúns erros comúns. Será que isto vai compilar? Non, eu estou perdendo unha morea de cousas. Bibliotecas oín. Así que ficheiros de cabeceira pode Quero engadir aquí? Si. Audiencia: Debe E / S estándar [inaudível] DAVID J. Malan: Excelente. Entón eu teño de E / estándar. Para que propósito que quero estándar I / O? Para printf. Polo tanto, incluír stdio.h. E tamén propoñer que inclúen a biblioteca CS50 por cal razón? Para ter cadeas. Entón, imos ver o que Biblioteca de CS50 está facendo para crear esa noción dunha cadea. Pero, polo de agora, pode só pensar niso como un tipo de datos real. Entón, que parece estar un pouco limpo. E agora eu estou indo para adiante e de feito fan secuencia 0. Compilado. Entón, iso é bo. Entón ./string0 déixeme achegar para que poidamos ver máis de preto o que está pasando. Intro. Z-A-H-Y-L-A entran. E nós temos impreso ao nome de Zamyla. Entón, iso é moi bo. Entón agora imos seguir adiante e executar este programa de novo, e escriba o nome completo de Daven. Sorpresa, sorpresa. Intro. Hmm. Non imprimiu Daven de nome completo correctamente. Agora iso debería ser evidente en retrospectiva por mor do que, tipo, deseño decisión estúpida? Si, eu codificado o seis dentro do meu loop for. Agora eu fixen iso só porque Eu sabía o nome de Zamyla ía ser seis letras. Pero, certamente, isto non é unha solución xeral. Entón non é que podemos de forma dinámica calcular a lonxitude dunha corda chamando unha función chamada strlen. De novo, deliberadamente sucintamente chamado só para facelo máis cómodo para escribir. Pero iso é sinónimo de obter a lonxitude dunha corda. Vou volver para o meu terminal fiestra e re-executar o compilador. Pero está berrando comigo. Implicitamente declarando función de biblioteca strlen con tipo unsigned int const-- Estou perdido. Completamente. Entón, especialmente como o seu ollos comezan a revirarem con mensaxes de erro como este, o foco honesta sobre as primeiras palabras. Sabemos que o problema está no liña 8, segundo se indica aquí. E é en corda-0.c. Implicitamente declarando función da biblioteca strlen. Así que é xeralmente vai haber un estándar de mensaxes de erro. Implicitamente declarando algo. Entón, en definitiva, que teño eu parecía ter feito con relación á liña 8, aquí. O que podería ser a solución ser aínda Se nunca usou strlen si mesmo? Audiencia: Parte dunha biblioteca diferente? DAVID J. Malan: Parte dunha biblioteca diferente. Por iso, é declarado, por así dicir. El é mencionado nalgún arquivo agás stdio.h e CS50.h. Agora, onde é definida? Para ser honesto, ten que só sei que esta enriba da súa cabeza, ou Google iso e descubrir. Ou saben diso, abrín na CS50 Aparello utilizado o programa da terminal, que é só o gran, versión para a pantalla completa de o que está na parte inferior da xanela do Gedit. E verifícase que hai unha comando similar sucinto, chamado home de manual, onde se insire o nome dunha función e prema Intro, vai volver moi documentación arcano. É só un texto que, xeralmente, parece un pouco algo como isto. É un pouco esmagadora a primeira vista. Pero, sinceramente, eu vou deixei meus ollos vidrosos e só concentrarse na parte Eu me preocupo co momento. Cal é este. Que parece estruturalmente como algo que eu estou familiarizado. De feito, a páxina de home, así para falar, vai dicir na cabeceira do ficheiro que a función como strlen é definido. Entón, eu vou volver agora para gedit. E eu estou indo a ir adiante e engadir aquí # include e salva o arquivo. Eu estou indo a limpar a pantalla con Control L Se está a se pregunta. E eu vou facer re-executa string.0, compila neste momento. ./string.0 Zamyla. Isto parecía funcionar Déixeme ir adiante e executa-o de novo con Davenport. Intro. E que, ademais, parecía funcionar. Así, podemos facer un pouco mellor do que iso, con todo, podemos comezar a aparcar as cousas -se un pouco. E eu vou, en realidade, introducir outra cousa agora. Eu estou indo a ir adiante e gardar esta nun ficheiro diferente. E eu vou chamar este string1.c ficheiro só para ser consistente co código vai ser capaz de atopar en liña. E imos centrar en exactamente o mesmo código. Acontece que eu teño foi unha especie de toma como certo o feito de que o meu portátil, e, á súa vez, o aparello CS50 ten unha morea de memoria, unha morea de RAM, unha gran cantidade de bytes de espazo no que eu poida almacenar cadeas. Pero a realidade se eu escriba longo suficientes, e suficiente as teclas escritas, Podería, en teoría tipo en máis caracteres do que o meu ordenador fisicamente ten memoria para. E iso é problemático. Moi parecido un int só pode Cantidade de tan elevada, en teoría, só se pode empinar tantos personaxes na memoria RAM do seu ordenador ou aleatoria Access Memory. Entón, eu tiña mellor anticipar este problema, aínda aínda que poida ser un raro caso esquina, por así dicir. Non pasa que, moitas veces, pode ocorrer. E se isto acontecer e non anticipar e programa para que, meu programa podería facer quen sabe o que. Conxelar, frear, reiniciar, o que sexa. Algo espera podería acontecer. Entón o que eu vou facer agora, a partir deste momento, en realidade, é antes de eu nunca cegamente usar unha variable como s que foi concedido o valor de retorno de algunha outra función como getString, Vou ter a certeza que o seu valor é válido. Entón eu sei que só por ler Documentación do CS50 para getString, que en definitiva, imos apuntala-lo en, que getString retorna un símbolo especial chamado NULL, N-L-L-L en todos CAPS, se algo sae mal. Entón, normalmente, el retorna un cadea. Pero se non, se volve N-K-L-eu-- imos finalmente ver o que realmente means-- iso só significa algo malo aconteceu. Agora, isto significa, así como en perigo, Podo comprobar unha condición aquí en C, Se s non é igual a NULL. Entón, se non vin isto antes, isto significa só non é igual. Entón, é o contrario do iguais iguais, que, recordan, é diferente da única é igual, o que é atribución. Entón, se s non coincide NULL, só entón Quero realizar estas liñas de código. Así, noutras palabras, Antes de me afondar en cegamente e comezar a iteración sobre s, e tratándose o como se fose unha secuencia de personaxes, eu vou para a primeira verificación, agarde un minuto, é definitivamente non igual a este valor especial, NULL? Porque se é, cousas malas poden ocorrer. E de momento, asumir as cousas que os malos pasando significa que o seu programa traba, e non pode necesariamente recuperar. Entón, francamente, parece máis feo. é medio confuso agora a ollar. Pero esta se fai máis familiarizado antes de tempo. Pero eu vou propoñer agora outra mellora. Esta é unha mellora para corrección. O meu programa agora é máis correcta, pois No caso raro que a memoria non é suficiente existe, eu vou tratar con isto, e eu simplemente non facer nada. Eu, polo menos, non vai fallar. Pero imos facer unha versión final aquí. E un ficheiro chamado string2.c. Vou pegar este mesmo código só por un momento, e eu estou indo a destacar esta liña, 11, aquí, só por un momento. Agora, a realidade é que os compiladores intelixentes como Clang podería fixar iso para nós nos bastidores sen o noso nunca saber. Pero imos pensar sobre iso fundamentalmente como un proxecto problemático. Esta liña de código, por suposto, dicindo: arrincar algúns variable i a 0. Isto é moi sinxelo. E o que unha vez máis é esta declaración, aquí, i ++, facendo? Xa vimos isto antes, pero nós realmente non falar sobre iso. Audiencia: incrementando i. DAVID J. Malan: incrementando i. Así, cada iteración través este circuíto, cada ciclo, está incrementando i por un. Por iso, se fai maior e máis grande, e maior a que o loop remata. Como isto remata? Así, hai este medio condición que usan antes. Xa viu e en instrucións paso a paso no conxunto de P. Pero o que é esta palabra? Faga o seguinte loop para mentres i é menor que o que? Audiencia: A lonxitude da corda. David J. Malan: O lonxitude da corda. Por iso tradúcese moi limpa a inglés nese sentido. Agora o problema é que cada vez que eu iteración través deste ciclo, en teoría, Eu estou facendo esta pregunta. É i menor que a lonxitude da cadea de s? É i menor que a lonxitude da cadea de s? Agora é i cambiando cada iteración? É. Debido á ++. Así, cada iteración i está quedando maior. Pero é s quedando maior, ou menor, ou cambiar en todo? N º Así, en termos de deseño, un dos eixos ao longo do cal tratamos avaliar o código na clase, isto parece medio idiota. Como está literalmente en cada iteración deste lazo pedindo a mesma maldita pregunta de novo, e de novo, e de novo, e, literalmente, iso non vai cambiar. Polo menos, se eu non estou tocando s e tentar cambiar o contido de s. Para que eu poida facer un pouco mellor do que iso. E o que eu vou facer non é declarar só unha variable i, pero unha segunda variable Vou arbitrariamente, pero convencionalmente, chamalo de n. Asignar n igual ao lonxitude da corda de s. E entón para acá, vou facer un pouco de optimización intelixente, de xeito falar, que, ao final do día non máis correcta ou non menos correcta é que antes. Pero é un proxecto mellor. O feito de que está a usar menos tempo, menos ciclos de CPU, de xeito para falar, para responder a mesma pregunta, pero só unha vez. Calquera dúbida sobre que xeral principio de mellora, dicir, a eficiencia dun programa? Si? Audiencia: Por que usar o [inaudível]? DAVID J. Malan: Boa pregunta. Entón, por que poñer o ++ a finais de i en vez de no inicio do i? Neste caso, ten ningún impacto funcional. E, en xeral, tenden a usar o operador postfix de xeito que é un pouco máis claro como para cando a operación está pasando. Para quen non coñece, existe outra declaracións en que podería facer ++ i. Estes son funcionalmente equivalente, neste caso porque non hai nada máis en torno a ese incremento. Pero pode vir ata con casos e liñas de código en que isto fai a diferenza. Entón, xeralmente, non temos incluso falar sobre iso. Porque, francamente, fai o seu código máis sexy, e unha especie de vigaristas, e menos caracteres. Pero a realidade é que é moito máis difícil, Creo que, mesmo para me involucrar miña mente en torno a, ás veces, a orde das operacións. Así como un aparte, se realmente non me gusta diso, aínda que este é o tipo de sexy buscar, tamén se pode facer i + = 1, que é a versión máis feo do mesma idea para postfix incrementação. Digo isto e vostede debe facer o desfrute del, pero vai ver como código algo bonito en pouco tempo. [Risas] DAVID J. Malan: Dereito? Si. Pregunta no medio. Audiencia: Debe dicir int n? DAVID J. Malan: Fai Non ten que dicir int n. Entón, por que xa dixemos int, non precisa dicir iso de novo. O problema é que n ten que ser o mesmo tipo de datos, como eu. Entón, iso é só unha conveniencia aquí. Si. Audiencia: Pode pasar por riba da soporte de impresión de caracteres s i de novo? DAVID J. Malan: Absolutamente. Entón,% c, lembrar da última tempo, é só un espazo reservado. Significa poñer un char aquí. n invertida, por suposto, só medio poñer un salto de liña aquí. Entón, iso só deixa, agora, este anaco de nova sintaxe. E este é, literalmente dicindo, grab a secuencia de chamadas s e ir buscar a súa carácter i'ésima, por así dicir. E eu sigo dicindo carácter i'ésima porque en cada iteración deste circuíto é coma se estamos imprimindo , En primeiro lugar s soporte 0, como programador podería dicir. Entón é franxa 1, logo s soporte 2, a continuación, 3, 4, axiña. Pero está claro que é unha variable, entón eu só expresar la con i. Clave, con todo, é entender, especialmente se non se aclimatando a este mundo de programación, onde todos nós parecen contar desde cero, ten que comeza a contar desde cero agora. Porque cordas, primeiro carácter, o z en Zamyla é para mellor ou para peor vai vivir no número de localización cero. Todo ben, entón deixe-me traer nos de volta aquí para Zamyla e ver o que realmente está a suceder por baixo do capó. Polo tanto, non hai esa noción de type casting. Pode que, en realidade, xogado con iso xa, quizais para o hacker edición do P definido. Pero type casting só se refire ao habilidade en C e outras linguaxes para converter un tipo de datos a outro. Agora como podemos ver iso moi directa? Entón iso, lembre, é o comezo do alfabeto inglés. E o contexto, lembrar, desde como hai unha semana é ASCII. A American Standard Code for Information Interchange. Que só é un longo camiño de dicir un mapeo dende cartas de números, e de números para letras. Entón, de A a M aquí, dot dot punto, aliñado con, recall, o número decimal 65 enriba. E nós non falamos sobre iso explicitamente, pero certamente hai semellante números ás letras minúsculas. E, de feito, existen. O mundo decidiu fai uns anos atrás que un pouco, minúsculas a, será 97. E pouco b vai igual a 98, e así por diante. E para calquera outra tecla no teclado, hai Vai ser un patrón semellante de bits. Ou equivalentemente, un número decimal. Entón, a cuestión en apreciado, entón, é como podemos realmente ver esta debaixo do capó? Entón, eu estou indo a ir a gedit novo. E no canto de Tipo este a partir de cero, Eu estou indo a ir adiante e basta abrir man de algo desde o código de hoxe chamado ASCII cero. E cero ASCII parécese iso. Entón, imos implicar nosas mentes en torno a este. Entón, primeiro, eu comentei o código, que é bo. Por literalmente me dicindo o que esperar, presentar un mapeamento para maiúsculas. Agora eu non sei ben o que eu quere dicir con iso, entón imos deducir. En inglés, quizais Inglés algo techie, o que fai a liña 18 aparecen estar facendo por nós? Só a liña 18. Que a indución? Que vai comezar? Audiencia: Un loop. DAVID J. Malan: Un loop. E cantas veces é que vai facer unha iteración? Audiencia: [interpoñendo VOCES] seis veces. DAVID J. Malan: non seis veces. Audiencia: 26 veces. David J. Malan: 26 veces. Si, desculpe. 26 veces. Por que? Ben, é un pouco raro, pero Comece a contar desde 65 anos. O que é raro, pero non é malo. Non é malo por dicir. E eu estou facendo iso só porque, para este exemplo, Eu son o tipo de anticipación que o capital A foi de 65. Agora, iso non é o máis elegante forma de facelo, a especie de código ríxido valores esotéricos que ninguén sempre espera para recordar. Pero, por agora, entender que eu son facendo iso a través de 65 máis 26. Porque, ao parecer, eu non quero nin para facer aritmética na miña cabeza. Entón eu vou deixar o compilador facelo. Pero, entón, en cada ciclo, cada iteración do circuíto, estou incrementando i. Entón, agora que parece un pouco enigmática. Pero hai que ter o básico de construción bloques que entender isto. % C é só un espazo reservado para un char. % I é un espazo reservado para un int. E verifícase que, ao utilizar este nova sintaxe, este parénteses, entón falar, polo tanto, un tipo de datos dentro dun parénteses Eu podo facer o compilador tratando i non é un número enteiro, pero como un char. Así, me amosando o carácter equivalente a ese número. Agora aquí abaixo, este código é practicamente idéntico. Eu só quería facer Super explícito o feito de que estou empezando a 97, o que é minúsculo a. Na anterior por máis 26 letras. E eu estou doing-- novo, lanzando i, por así dicir. Ou type casting i, por así dicir. A partir dun int a un char. Así, o resultado final vai ser, francamente, información que xa sabemos. Vou facer ASCII-0 non dot-- punto c. Teña en conta, probablemente o fixo erro que eu só fixen accidentalmente. Fai ASCII-0. Agora eu vou facer ./ascii-0. Vou aumentar o zoom, e, por desgraza, vai rolar para fóra da pantalla. Pero vemos un gráfico completo onde a mapas a 97, b mapas para 98, e desprazarse cara arriba aínda máis Un, por suposto, mapea a 65. Entón, iso é só para dicir que o que teño cravado, hai esa equivalencia, é de feito, o caso na realidade. Así, unha modificación rápida da presente. Déixeme abrir ASCII-1.c. E entender iso intelixente, tipo de, a clarificación deste. Esta é ASCII-1.c, e entender esa cousa tola. E iso realmente chega ao corazón de que os ordenadores están a facer. Aínda que nós seres humanos puidésemos non contan en termos de letters-- Non comezar a pensar, Todo ben, entón un b, e usalas para contar obxectos físicos. Pode certamente dicir que quero arrincar algúns variable chamada C-- pero eu podería chama este calquera coisa-- entón c é inicializar ao capital A. Porque ao final do día, o ordenador non importa o que está almacenando, el só lle importa como quere presentar esta información. Como queira que o equipo interpretar ese patrón de bits? Entón iso non é algo que me , En xeral, recomendo facer. É realmente só un exemplo para saber que pode absolutamente arrincar un enteiro para un char. Debido ao baixo capo dun char, por suposto, é só un número de 0 a 255. Así, pode certamente poñelas dentro dun int. E o que iso tamén demostra é que nos pode converter dun tipo a outro, aquí, en definitiva, a impresión do mesmo. E, de feito, iso vou corrixir online-- era para dicir iso, unha vez máis, aquí. Déixeme limpar iso en liña, e nós imos ver en un paso a paso en liña, se é necesario, o que se pretende non. Está ben. Así último exemplo, agora inclúen A e B e, a continuación, imos levar as cousas por riba de un entalhe. Así, con un e B e c está na capitalización e a equivalencia destes, imos bótalle un ollo neste exemplo aquí. Outro exemplo de código. Imos abrir un que é xa realizados, para que Non precisa escriba-lo todo a partir de cero. E teña en conta, en anticipación Utilizamos cabeceira múltiple arquivos, entre os que se noso novo amigo, string.h. Agora iso parece, a primeira vista, algo enigmática. Pero imos ver se non podemos razoar a través do que está pasando aquí. Primeiro eu teño unha cadea de usuario, e engada esa cadea nunha variable chamados s. Copiar de antes. Na liña 22, son aparentemente facendo o que Eu fixen hai pouco, estou interactuar sobre os personaxes de s. E os novos trucos aquí está a usar lonxitude da corda, a optimización menor de almacenar a lonxitude da corda en n, No canto de chamar strlen novo, e de novo, e de novo. E só comprobando que i é menor que n. Agora, aquí, as cousas están algo interesante. Pero é só unha aplicación desta mesma idea nova. O que fai en inglés s soporte i representa? Audiencia: Contando cada carácter [inaudível]. DAVID J. Malan: Contando cada personaxe. E aínda máis sucinta, s soporte i representan o que? Vostede diría. Non colocar-lo no lugar aquí. Audiencia: Bem-- DAVID J. Malan: Entón, se a palabra é-- se a corda é Zamyla, que starts-- Audiencia: --você xestionar os caracteres separately-- DAVID J. Malan: Good. Exactamente. A notación corchete permite para acceder cada personaxe individual, entón s soporte 0 será o primeiro carácter en cadea. s soporte 1 será o segundo, e así por diante. Entón, a pregunta que eu estou pedindo, aquí, nesta condición é o que? O personaxe i'ésima de s maior o igual a un minúsculas? E o que iso significa, aquí, coas dobres e comercial? Audiencia (en conxunto): E. DAVID J. Malan: E. É só o equivalente a iso. E non é unha palabra clave en C, ten que uso, irritante, comercial e comercial. E iso, por outra banda, está a pedir é s de i'ésima carácter inferiores ou iguais para minúsculas z? E unha vez máis, aquí é onde comprender o subxacente implantación dun ordenador ten sentido. Teña en conta que, a pesar de eu ter o dot dot dot alí, Parece que da a Z en minúsculas son todos os valores de 97 contiguas superior enriba. E mesmo para maiúsculas desde 65. Así, o takeaway, entón, é que, en inglés, como describiría que liña 24 está facendo? Si? Audiencia: O día 24 é a verificación para ver se cada personaxe é unha minúscula. DAVID J. Malan: É comprobar se cada personaxe é unha letra minúscula. Así, mesmo de forma máis sucinta, é o carácter i'ésima de s minúsculas? Isto é todo o que somos expresar aquí, loxicamente, algo enigmático, pero en definitiva, moi directa. É S de i'ésima letra minúscula? Se é así, e aquí é onde as cousas estar un pouco mente dobra só por un momento, se é así, vaia adiante e imprimir un carácter. Polo tanto, este é só un espazo reservado, pero o personaxe? Por que estou facendo s soporte de i menos esa expresión aquí? Ben entender o estándar aquí. Os números reais non importa tanto. Pero teña en conta que 97 é como lonxe de 65? Audiencia: 32. DAVID J. Malan: 32. A que distancia está de 98 desde 66? Audiencia: 32. DAVID J. Malan: Pouco c de gran C? 32. Polo tanto, hai 32 saltos de unha carta a outro. Entón, sinceramente, eu, podería simplificar este aquel. Pero entón eu estou codificación algo difícil esta comprensión baixo nivel que non sempre é lector vai entender. Entón eu vou xeneralizar-lo como eu coñecer as letras minúsculas son maiores. Sei que as maiúsculas son valores menores, irónicamente. Pero esta é efectivamente equivalentes aos dicindo restar 32 de s soporte de i. Así, no ámbito destes letras, se a carta pasa a ser, unha minúscula un, e eu restar 32, que o efecto que isto ten, matematicamente, en minúsculas de a? Audiencia: Capitalizes-- David J. Malan: Capitalizes el. E, de feito, é por iso que o noso programa chámase capitalizar cero. Este programa quere capitalizar unha carta, tras comprobar que é en realidade, unha letra minúscula. Se non, na liña 30, o que debo facer se non é unha letra minúscula que eu son mirando nunha determinada iteración do bucle. Basta imprimir lo. Polo tanto, non cambiar cousas iso non é mesmo minúsculas. Restrinxir-se a un pouco a través pouco z. Agora iso é moi misterioso. Con todo, ao final do día, esta É así que, unha vez, tivo que aplicar cousas. Se eu, no canto aberto capitalizar un, oh grazas a Deus. Hai unha función chamados a superior que pode facer todo o que acabamos de facer a un nivel mínimo. Agora, para superior é interesante porque é declarado nun ficheiro, e só sabería diso comprobando a documentación, ou a ser dito, por exemplo, na aula, onde existe, nun ctype.h ficheiro chamado. Polo tanto, este é un novo amigo noso. E máis fai exactamente o que o seu nome indica. Pode pasar, como argumento, entre estes parénteses, algún personaxe. Vou pasar o carácter i'ésima de s usando a nosa nova notación fantasía inclúen corchetes. E dar un palpite, que é o regreso valor superior a aparentemente vai ser? A letra maiúscula. A letra maiúscula. Entón, se eu pasar en minúsculas a, espero que, por definición para superior, vai voltar un maiúscula A. Se non, se non é unha letra minúscula en primeiro lugar, eu só imprimir lo. E, de feito, teña en conta a segundo amigo aquí. Non só a parte superior existe, pero é máis baixa, o cal en realidade, responde a esta pregunta para min. Agora quen escribiu isto, 10s de anos, xa sabe o que? Aplicado a superior e é descargar usando un código coma este. Pero, de novo, consistente con esa idea de abstraerse, tipo, nivel máis baixo detalles de implementación. E de pé sobre os ombreiros de persoas que viñeron antes de nós, a través de funcións como a parte superior e inferior é, que marabillosas suficiente son ben chamado para dicir o que eles fan, é un paradigma marabilloso para adoptar. Agora resulta que se eu ler a páxina man para, digamos, a parte superior, Eu aprendo algo máis. Así, o home toupper. É un pouco esmagadora. Pero aviso, aquí está que a mención de o ficheiro de cabeceira que eu debería usar. Como un aparte, porque esta é enganosa, a función usa enteiros en vez de caracteres por razóns de verificación de erros. Pero imos talvez veña de volta para que, no futuro. Pero teña en conta, aquí, aos convertidos superiores letra c en maiúsculas, se é posible. Entón, iso é moi sinxelo. E agora imos ser un pouco máis específico. Imos ollar para a parte do páxina do manual sobre valor de retorno. O valor de retorno é que da carta convertido. Ou c, a conversión non foi posible, en que c é a entrada orixinal. Que sei que a partir de aquí, a partir de argumento para a superior. Entón, cal é o takeaway iso? O valor de retorno é que da carta convertido, ou c, a letra orixinal, se a conversión non foi posible. Que mellora podo, polo tanto, facer o proxecto do meu código? Si? Audiencia: Pode eliminar o resto. DAVID J. Malan: eu poida retire a instrución else, e non só a instrución else. Audiencia: Pode eliminar [inaudível]. DAVID J. Malan: eu poida eliminar todo o garfo na estrada, o caso máis completo. Entón, en realidade, deixe-me abrir a versión final deste, capitalizar-2 e entender o no; si vai, sexy, o código está comezando agora, en que eu reducido dalgúns sete ou máis liñas para só catro, a función que eu pretendía simplemente chamando a superior, pasando s soporte de i, e impresión para fóra, co espazo reservado% c, que o carácter particular. Agora, sen dúbida, non é un erro, ou, polo menos, o risco de un erro, neste programa. Entón, só para volver para unha viaxe máis cedo, o que debo facer, probablemente, tamén en este programa para facelo máis robusto, de xeito que non hai ningunha maneira que pode falla, mesmo en casos raros? Audiencia: Asegúrese de que non é NULL. DAVID J. Malan: Asegúrese de que non é NULL. Entón, realmente, para facer este super bo, eu debería facer algo como: Se s non é nulo, entón dalle realizar estas liñas de código, que Podo entón guión así, e logo, poñer na miña clave de peche. Tan bo subordinación xunto das dúas ideas. Si? Audiencia: Podería usar un loop Do While, en vez diso? DAVID J. Malan: Could Fago un loop Do While? Audiencia: --você quere asegurarse de que realmente [inaudível]. DAVID J. Malan: Could usa un do tempo? Resposta curta, non. Porque está a piques de introducir outro caso canto. Se a cadea é de lonxitude cero. Se, por exemplo, só bater Intro, sen nunca escribindo Zamyla. Vou entrega-lo de volta un real corda, como imos finalmente ver, que ten cero caracteres. Aínda é unha cadea, é só super curto. Pero se usa un do tempo, vai cegamente tentar facer algo con relación a esa secuencia, e nada vai estar alí. Audiencia: Ben, se fixo facer [inaudível] mentres s-- DAVID J. Malan: Ah, eu vexo, manter recibindo unha cadea de usuario. Resposta tan curta, ten podería, e manter importunando lles darlle unha cadea que se curta o suficiente para caber na memoria. Absolutamente. Eu só non quixo. No caso de que non me dan a secuencia I quere, eu vou desistir, eu vou desistir. Pero, absolutamente, para ese efecto, pode absolutamente facelo. Así, os ficheiros de cabeceira da biblioteca que agora estamos familiarizados con son estes, aquí. Defecto I / O, CS50.h, string.h, ctype.h, e hai, de feito, outros. Algúns de vós xa descubriron a biblioteca de matemáticas en math.h. Pero deixe-me presentar-lle, agora, a esta característica que o persoal CS50, Davin, e Rob, e Gabe especial teñen xuntos. Que en breve conexión en web do curso. Chámase CS50 referencia. Que só para darlle un rápido me gusta diso, funciona como segue. Déixeme ir reference.cs50.net. Vai ver na man esquerda o outro unha lista esmagadora de funcións que veñen con c. Pero se eu me importa, para o momento, sobre algo como strlen, I pode escriba-lo alí. El filtra a lista só o que me interesa. Vou prema nel. E agora sobre a esquerda, vai ver o que esperamos é un máis sinxelo, humano explicación agradable de como Esta función funciona. Devolve a lonxitude dunha corda. Aquí está un resumo, aquí está como usalo en termos de ficheiro de cabeceira, e en termos do que a función Parece que en termos de seus argumentos. E entón, aquí, os retorno a lonxitude dunha cadea. Pero para aqueles de vostedes máis cómodo, realmente pode facer clic máis cómodo, e os contidos desta páxina, agora, vai cambiar ser os valores por defecto do que comeza a usar a páxina home. Noutras palabras, CS50 referencia é unha simplificación de páxinas de manual polo equipo, para os alumnos. En particular, os menos cómodo e no medio, de xeito que Non ten que tentar envolve súa mente en torno, a verdade, algunha sintaxe críptica e documentación nalgún momento. Polo tanto, manter isto presente os días que virán. Entón, aquí, unha vez máis, é un Zamyla. Imos agora facer unha pregunta que é un pouco máis accesible humano. Grazas a Chang, que foi imprimir máis elefantes sen deixar durante os últimos días. Temos unha oportunidade de dar polo menos un deles de distancia. Se puidésemos obter só un voluntario que se aproximase a deseñar na pantalla. E aquí? Imos cara arriba. Cal é o seu nome? ALEX: Alex. DAVID J. Malan: Alex. Todo correcto. Alex, imos cara arriba. Estamos a piques de ver a súa escrita na pantalla aquí. Todo ben, pracer de coñece-lo. ALEX: Nice coñece-lo. DAVID J. Malan: Todo ben. Así, o exercicio super sinxelo. Bar non é alta para obter un elefante hoxe. Está facendo o papel getString. E eu vou só dicirlle a secuencia de caracteres que chegou. E supoñamos que, getString, foron chamados. E o ser humano, como eu, ten escriba Zamyla, Z-A-H-Y-L-A. Só tes que ir adiante e escribir Zamyla no pantalla como se conseguise e almacenados en algún lugar na memoria. Deixando espazo para o que vai ser varias outro palavras-- todo ben, continúe. [Risas] Entón Zamyla, excelente. Entón, supoña que, getString, son chamados de novo. E, polo tanto, eu lle proporcionar, no teclado, con outro nome, Belinda. Todo correcto. E agora o getString próxima vez é chamado, eu escribir algo como Gabe, L-A-B-E. Realmente está tomando ao corazón de memoria de acceso aleatorio. Que está atraendo todo de forma totalmente aleatoria. Está ben. [Risas] ALEX: Sentímolo miña letra é malo. DAVID J. Malan: Non, iso é OK. E como sobre Rob, R-O-B. Está ben. Boa. Entón, eu non esperaba que sería tipo de poñer as cousas deste xeito. Pero podemos facer este traballo. Entón como é que vai facer sobre postura estes caracteres en memoria? Noutras palabras, se pensamos esta pantalla negra rectangular como representando un RAM, ou memoria do ordenador. E lembrar que a RAM é só unha morea de bytes, e bytes son unha morea de bits. E bits son de algunha maneira aplicado, xeralmente con algún tipo de electricidade en hardware. Entón, iso é unha especie de estratificación xa falamos sobre e agora pode tomar para concedida. Como é que vai facer sobre decidir onde escribir Rob contra Gabe contra Belinda contra Zamyla? ALEX: Eu só fixen iso no ordenar que me dixo. DAVID J. Malan: E iso é verdade. Pero o que rexe onde se pon O nome de Belinda eo nome de Gabe? ALEX: Nada? DAVID J. Malan: [Risas] Así que funciona, iso é bo. Así, os ordenadores son pouco máis ordenada que iso. E así cando implement-- estar alí por só un moment-- cando nós realmente aplicar algo como getString nun ordenador, Zamyla pode ser instalado para fóra practicamente como fixo na pantalla, non. E o que é fundamental para entender aquí, o Alex fixo, é que hai unha especie de delimitación entre cada unha destas palabras, non? Non escribiu Z-A-H-Y-L-A-B-E-L-I-N-D-A-L-A-B-- noutras palabras, hai algún tipo de delimitación que parece ser, dalgunha forma, paso chou entre estas varias palabras. Pero iso é bo, porque nós, humanos, podemos agora ver que estes son catro cordas diferentes. Non é só unha secuencia de moitos personaxes. Así, un ordenador, entón, mentres tanto, pode ter unha cadea como Zamyla, que cada unha desas cartas dentro dun byte de memoria. Pero ese número é moito maior, claro, que seis caracteres. Hai unha morea de RAM. E así, a partir de agora, este reixa de caixas vai para representar o que Alex só fixen aquí en pantalla. E agora, Alex, podemos ofrecer-lle un azul ou un elefante laranxa de Chang. ALEX: Vou levar un elefante azul. DAVID J. Malan: Un elefante azul. Así, unha gran salva de palmas, se puidésemos, por Alex aquí. [Aplausos] ALEX: Grazas. DAVID J. Malan: Grazas. Entón, o que é estaladiça, moi aínda que o estándar medio que cambiou co paso do tempo, aquí na tarxeta, había un delimitación entre as distintas cadeas que Alex ten para nós. Agora, os ordenadores, a verdade, podería facer o mesmo. Poderían tipo de chape cordas en calquera lugar na RAM. Ata aquí, aquí, aquí en baixo, aquí abaixo. Poderían facer exactamente isto. Pero, por suposto, iso é probablemente non o mellor planificación. Correcto? Se eu ficaba pregunta para Alex obter nomes, probablemente tiña poñer un pouco máis aquí, quizais ata aquí, aquí, aquí, finalmente, aquí. Pero cun pouco máis de planificación, por suposto, poderiamos poñer as cousas de forma máis limpa. E, de feito, é o que un ordenador fai. Pero o problema é que se a seguinte secuencia de chegar despois Zamyla é algo como a Belinda, propoñer onde podemos escribir a letra b con relación a esta rede? Para onde ía? Para a dereita da un, baixo a z, a continuación a un? Cales serían os seus primeiros instintos ser? Audiencia: Abaixo a z. DAVID J. Malan: Entón, baixo a z. E iso é moi simple, non? É unha especie de puro, que é o que facemos nun teclado cando teclear Intro, ou unha mensaxe ao facer unha lista con viñetas das cousas. Pero a realidade é que os ordenadores proba ser máis eficiente, e empinar seguro tanto datos na memoria RAM como sexa posible, para que non perda ningún bytes. Para que non perda calquera inmoble pantalla. E o problema, con todo, é que se, literalmente, poñer a letra b tras un, como é que imos sabe onde o nome Zamyla remata eo nome da Belinda comeza? Entón, vostedes humanos só proposto, así, prema a tecla Intro, esencialmente. Pon-o a continuación. Ou incluso como Alex fixo, pode comezar a escribir o seguinte nome baixo do anterior, e baixo que un, e logo abaixo desa. Isto é un sinal visual. Os ordenadores teñen outra suxestión visual, pero é un pouco máis sucinto. É ese personaxe mal-cheiroso. 0 barra invertida, o que é posible reminiscencia barra invertida n, e así por diante, agora. As secuencias de escape especiais. Barra invertida 0 é o camiño da representando oito bits cero nunha fileira. 0000 0000. O xeito como expresar que non é alcanzou o número cero no teclado, Porque, de feito, que é un carbón ASCII. Parece un número, pero é, en realidade, un número decimal que representa a circular glifo, a fonte circular. Mentres tanto, a barra invertida cero significa literalmente poñer oito bytes cero aquí para min. Polo tanto, este é un tanto arbitraria. Poderiamos usar calquera defecto de bits, pero o mundo decidiu algúns anos atrás, que, para representar o extremo dunha corda na memoria, só tes que poñer unha morea de ceros. Como podemos detectar iso. Agora, o que significa que ningunha carta do alfabeto poden ser representados por ceros. Pero todo ben, xa vimos que estamos usando 65 en en 97 enriba. Non chegar a sitio ningún Preto de todos os ceros. Entón Belinda na memoria dun ordenador está realmente indo a ir máis alá. Eu deseñei el en amarelo só para chamar a atención a el. E noten, tamén, este é totalmente arbitraria. Eu deseñei-a como unha reixa. Como, RAM é só un obxecto físico. Non ten necesariamente liñas e columnas, de per si. El só ten unha morea de bytes aplicado en hardware de algunha maneira. Pero se despois Belinda I ingresaran no nome de Gabe, vai acabar aquí na memoria, e se eu escriba o nome de Daven, por exemplo, que vai acabar por aquí. E podo seguir escribir aínda máis nomes. Desafortunadamente, se eu tentar escribir unha super longo nome, Podería, finalmente, quedar sen memoria. Neste caso, é getString devolverá NULL, como dixemos. Pero, por sorte, polo menos neste visuais aquí, non podemos tan lonxe. Agora, o que é bo é que esta idea xeral de tratar as cousas como en caixas é representativo dunha característica de C e unha morea de linguas, coñecida como unha matriz. Un array é outro tipo de datos. É unha estrutura de datos, se quere. Estrutura, no sentido de que, realmente, tipo de, parecendo unha caixa, polo menos no ollo da súa mente. Unha matriz é un contiguo secuencia de tipos de datos idénticos, volta atrás a volta atrás. Así, unha corda, noutro palabras, é unha matriz de caracteres. Unha matriz de caracteres. Pero acontece que pode ter matrices de acios de cousas. De feito, podemos poñer aínda os números nunha matriz. Así, a forma na que imos comezar declarar eses datos estrutura coñecida como unha matriz Tamén vai usar corchetes. Pero estes corchetes van teñen un significado diferente neste contexto. E imos ver como segue. Supoña que abrín -se aquí un novo ficheiro. E eu salve como ages.c. E eu vou gardar iso na miña carpeta aquí. E agora eu estou indo para adiante e comezar a escribir algo como incluír CS50.h inclúen stdio.h, int void main. E entón, aquí dentro, quero a primeira ten un int chamado idade. E eu vou usar isto para obter un int do usuario para a súa idade. Pero este programa destinado a ser usado por varias persoas, por calquera contexto. Teño unha fila de persoas. Todos eles teñen que escribir a súa idade para quizais algúns, eu non sei, competición ou evento que chegaron a. Polo tanto, a seguinte persoa, eu teño outra variable. Porque se eu só fago idade queda getInt, iso é vai espancar, ou substituír a idade da persoa anterior. Entón, iso non é bo. Entón, o meu primeiro instinto se pode, oh, todo ben, se eu queira obter varias persoas da ages-- imos chamar este idade1, int age2 recibe int, int idade3 recibe getInt. E agora eu vou usar algún código pseudocódigo aquí. Fai algo con eses números. Imos deixar para outro día o que estamos facendo alí, porque nós só coidado co momento uns idade1, idade2, idade3. Desafortunadamente, xa que eu compilar este programa e poñelas diante de usuarios reais, cal é a mala concepción fundamentalmente decisión que parece ter feito? Si? Audiencia: [inaudível] DAVID J. Malan: Si, Eu nin sequera tente para descubrir como moitas idades realmente se preocupan? Se eu tivera menos de tres persoas aquí, e, polo tanto, menos de tres séculos, Eu aínda estou esperando cegamente tres. Deus me libre catro persoas aparecen. O meu programa só non vai mesmo apoia-los. E así, este, longa historia En resumo, non é un bo hábito. Correcto? Estaba esencialmente copiar e pegando o código e só axustes os nomes das variables. E, meu Deus, se tivese, non tres as idades, pero 10, ou 100, ou 6500 alumnos de graduación, por exemplo. Isto non vai ser especialmente código elegante, é sostible. Terá que reescribir o programa de cada vez o número de persoas cambia. Entón, por sorte, no noso actual arquivo ages.c para hoxe, temos unha solución máis intelixente. En primeiro lugar, eu vou pedir o construír usan algunhas veces, facede isto mentres loop, a fin de obter o número de persoas na sala. Eu estou indo só para molestar ao usuario, unha vez máis e outra vez, ata que el ou ela me dá un valor de n é un enteiro positivo. Podería usar, última tempo de obter int positivo. Pero non hai que sexa real, entón eu fun adiante e está implementada esta idea. Agora aquí, este é o novo truco. Na liña 27, como os comentarios na liña 26 indica, declarar unha matriz en que para almacenar a idade de todos. Entón, se quere obter, e non un int, non dúas interrupcións, pero todo un conxunto de enteiros. Especificamente n enteiros, eran n pode ser tres, pode ser 100, pode ser 1000. A sintaxe, moi simplemente, é a por exemplo, o tipo de datos que quere? O que quere chamar que pedazo de memoria? O que quere chamar a reixa que se parece iso pictoricamente? E entre parénteses aquí, di como gran quere a matriz para ser. E así, máis cedo, cando dixo que o sintaxe é un pouco diferente aquí, aínda estamos usando corchetes, pero cando estou declarando unha matriz, o número dentro do corchetes medios Cal é o tamaño que quere que o conxunto estar. Por outra banda, cando estabamos usando s soporte de i hai pouco, s, unha cadea, é de feito unha matriz de caracteres, pero cando non está declarando unha variable, como aquí con esta palabra clave, está simplemente recibindo un índice específico, un específico elemento desa matriz. Xa que coñecemos, o resto iso é simple. Se o novo Vou primeiro para imprimir cal é a idade da persoa número i. Onde eu acabo de dicir número un persoa, persoa número dous, número tres persoa. E eu só estou facendo aritmética, de xeito que, como persoas normais, contamos desde un a este programa, e non a partir de cero. Entón eu chamo getInt, pero eu gardar a resposta en idades adaptador. Cal é o i-ésimo idade na matriz. Así, mentres última vez que estaban tratando esas caixas como caracteres para o nome de Zamyla, e outros. Agora, estas caixas representan 32 bits, ou catro bytes no que podemos almacenar un int, int, int. Todos os cales, de novo, son o mesmo tipo de datos. Agora fago algo parvo, como o tempo pasa, só para xustificar a escribir este programa. E entón aquí en baixo, volvo a iteración sobre a matriz dicindo aquí a un ano, persoa número un testamento ser algo anos de idade. E para descubrir o que math-- É dicir, isto non é moi complicado arithmetic-- Acaba de engadir un para a súa idade. Só demostrar, unha vez máis, este. Así como podo índice nunha secuencia, s, para que eu poida índice nunha matriz de idades, así hai. Entón, onde é que isto vai ser nos levando? Entón, imos ver, en definitiva, unha Algunhas cousas nos días que virán. Un deles, de todo este tempo, cando escribir os seus propios programas, como Mario, ganancioso, de crédito. Foi a escribir o nome o programa e prema Intro. E a continuación, obter a entrada do usuario. Con getString, getInt, getLongLong, ou similares. Pero resulta que os soportes C algo chamado de liña de comandos argumentos, que vai deixarnos realmente chegar ao escoitar as palabras que escribe, na liña piscando, despois do nome do seu programa. Así, os días que virán, ten pode escribir algo como César, ou ./caesar número 13, a partir de aí. A ver como funciona isto. Porque, de feito, en conxunto de problemas dous, estamos vai presenta-lo para peixe reminiscencia Ralphie de desafiar antes da cartografía. A arte de codificación de información. Isto, de feito, é moi recorda o que Ralphie fixo. Este é un exemplo dunha codificación chamado algoritmo rot13, R-S-T 13. Que significa simplemente virar o letras do alfabeto 13 lugares. E se fai iso, vai ver agora o que é, quizais, unha frase familiar. Pero o xeito no que imos utilizar isto, en última instancia, é unha forma máis xeral. En I definir dous, na edición estándar, vai aplicar un par de cifras, un chamado César, un chamado Vigenère. Ambos son rotacional cifras, en que dalgún xeito transformar unha letra en letra diferente. E César é super sinxelo. Podes engadir un, engade 13, ou algún número ata 26. Vigenère fai iso en unha base por carta. Entón Vigenère, como podes ver na especificación, é máis seguro. Con todo, ao final do día, o que estará aplicando e P axustar dous, é a clave que use tanto para cifrado e descifrado. Refírese ao proceso de converter texto, algunha mensaxe orixinal, en texto cifra, que é algo encriptado. E despois decodifica-los de novo. Na edición de hacker Mentres tanto, estará encargado de algo semellante en espírito, onde nós imos dar-lle un ficheiro, a partir dun Linux típico, é Mac, Unix ou ordenador chamado Etsy contrasinal, o cal contén un conxunto banda de nomes de usuarios e contrasinais. E os contrasinais teñen todo foron cifrados, ou hash, por así dicir, máis propiamente como podes ver na spec. E a edición hacker vai desafiar vós, sendo unha entrada como esta, e romper o contrasinal. Ou sexa, descubrir o que o contrasinal do ser humano, en realidade, era. Porque, de feito, os contrasinais son xeralmente non son almacenados en claro, e, xeralmente, os contrasinais debe ser difícil de adiviñar. Isto non é frecuentemente o caso. E o que eu penso que ía facer é Conclúo con un par de minutos ollar para un particular mala elección de contrasinais desde unha película que ten que se lembrar con cariño. E se non, ten que alugar. [REPRODUCIÓN] -Helmet, Vostede diaño, o que está pasando? O que está facendo a miña filla? -permitir-Me envíe a brillante cirurxián plástico novo, Doutor Phillip Schlotkin. O maior nariz do home no traballo universo e Beverly Hills. -O Seu Alteza. Traballo -Nose? Eu non entendín. Ela xa tiña unha plástica no nariz. Era o seu doce 16 agasallos. Non, non é o que pensa. É moi, moito peor. Se non me der o combinación co escudo de aire, médico Schlotkin vai dar o seu filla de volta o seu antigo nariz. - [Suspiros] Nooooooooooooo. Onde conseguiu iso? -Certo. Eu vou che dicir, eu vou dicir. Non, papá, non. Non debe. -Vostede Dereito meu caro. Vou sentir falta da súa nova nariz. Pero eu non vou dicir-lles o combinación non importa o que. -Moi Ben. Doutor Schlotkin, faga o peor. O pracer é meu. Non! Espere, espere. Eu vou che dicir. Eu vou che dicir. Sabía que ía traballar. Todo ben, deixa para min. -The Combinación é un deles. -One. -One. -Dous. -Dous. -Dous. -Tres. -Tres. -Tres. -Quatro. -Quatro. -Quatro. -Cinco. -Cinco. -Cinco. Entón A combinación é un, dous, tres, catro, cinco. Esta é a combinación máis estúpida Eu xa oín na miña vida. Ese é o tipo de cousas que un idiota tería na súa equipaxe. Grazas, a súa Alteza. [Click Remote] -Cal Que fixeches? I Desactivado do muro. Non, non fixo, ten desconectada todo o filme. Debe I apertou o botón errado. Ben, poñelas de novo! Pon a película de volta! Si, señor! Si, señor. -Imos, Arnold. Veña, Gretchen. Claro que vostede sabe que eu vou ten que cobre-lo por iso. Ben? Será que isto funciona? Onde está o rei? -It Traballou, señor, teñen a combinación. -Gran. Agora podemos tomar cada último suspiro de aire fresco do planeta Druidia. Cal é a combinación? Un, dous, tres, catro, cinco. Un, dous, tres, catro, cinco? Si. -É Incrible. Eu teño o mesmo combinación na miña equipaxe. Prepare Spaceball 1 para partida inmediata. Si, señor. -E Cambiar o combinación na miña equipaxe. [Peche do porto SOUND] [Clinker de portas CASCO QUE BATE] -Ahh. [FIN REPRODUCIÓN DE VIDEO] DAVID J. Malan: Isto é todo para CS50, imos velo a próxima semana. Narrador: E agora, Profundo Pensamentos, por Daven Farnham. Daven FARNHAM: Codificación en C é moito máis difícil do que cero. printf, risco era unha mentira. [Risas SoundBite]