[Powered by Google Translate] DAVID J. Malan: Todo ben.
Este é CS50, e este é o fin da segunda semana.
Se esperar a estar con fame volta a esta hora mañá, sabe que nós estamos indo
a convocatoria de mañá como un pequeno grupo, xoves, 1:15 PM.
Hai esa URL aquí se desexa RSVP.
O espazo é limitado, polo tanto, por favor, Perdoando o formulario foi cuberto polo tempo que
cubrir iso.
Outra URL con todo, que pode ser de interese é ese.
>> Así, en só preto de un mes, o curso vai ser facilitado
todo o máis amplamente a través de EDX, a través do cal as persoas na Internet será
capaz de seguir, participar no curso bastante activa, en realidade.
Eles van estar a usar o aparello CS50 e CS50 Discutir e na maioría das
diversas ferramentas de software que xa foron usar este semestre.
E unha das iniciativas que quere asumir como unha experiencia deste ano
é ver o que de contido que se pode traducir en outras linguas faladas e
linguas escritas.
Entón, se pode ter interese en participar neste proxecto, que
imos proporcionar transcricións en inglés e subtítulos para o seu curso
conferencias e shorts e seminarios e seccións e similares -
se falar fluentemente ou escribir con fluidez outra lingua, teriamos
amo para axusta-lo neste proxecto, que toma un ou máis dos
vídeos, traducindo os nunha lingua que coñece moi ben.
Para darlle un sentido de interface, non hai esa interface de usuario baseada na web
que nós imos usar que pode crear, esencialmente, unha interface de usuario como este.
Isto foi me ensinando uns Halloween atrás.
E no lado dereito, en negro ao lado destes selos de tempo,
vai ver as moitas cousas que saíron da miña boca aquel día.
E entón a continuación, será capaz de traducir a outra lingua.
Exactamente o que é o mapeamento entre, neste caso, Inglés
e, digamos, español.
Entón, é realmente unha ferramenta moi agradable.
Pode retroceder e avanzar moi rapidamente con atallos de teclado.
Entón, se quere participar nesta experiencia e ter as súas palabras
visto e lido por potencialmente miles de persoas alí fóra, por favor, me sinto
libre para participar.
>> Agora unha palabra sobre o gatinho de luns, para que non nos enviou un excedente
mensaxe asustado.
Facer entender que, como o horario de oficina suxerir e como seccións suxiren, o
proxecto do curso é moi de alumnos a colaborar e
falando para traballar con conxuntos de problemas e os problemas xuntos.
E realmente a liña se reduce a, unha vez máis, o traballo que, en última análise
deberá presentar debe ser o seu propio.
E por iso é moi sincero - en horario de oficina, é totalmente normal -
É totalmente de esperar, mesmo - para estar falando con algunhas
amigos ao seu lado.
Se el ou ela está loitando con algún tema, e é como, oh, así imos
me dar-lle un reflexo de algunha liña de código que eu escribín.
Isto é bo.
Isto acontece.
E iso é moi favorable, creo que, co proceso de aprendizaxe.
Onde a liña, unha vez máis, queda cruzada é cando a cabeza é inclinado por riba da especie
aquí a un segundo lonxe de máis ou minutos para que realmente a ter só
foi unha oportunidade de desbloqueo para o seu amigo.
E, por suposto, cando as cousas están trocadas por correo electrónico e Dropbox e
semellante, hai tamén o é a liña.
Entón, por todos os medios, sentirse cómodo e sentirse encoraxados a falar con amigos
e compañeiros sobre serie de exercicios e moito máis.
E só entende que o que en última análise, presentar debe ser realmente a
produto da súa creación e non outra persoa.
>> Así, na mesma liña de criaturas peluches, pode
coñezo este cara aquí.
Polo tanto, este é un filme terrible brega de anos.
Alguén aquí viu Spaceballs?
Todo ben.
Así, un bo número aquí.
Entón esta é a nosa maneira marabillosas académica introducir finalmente hoxe
a noción de cifrado.
E así un dos problemas de dominio específico para pset 2, que virá
mañá á noite tarde, e mergullo no mundo da criptografía, o que
é a arte de cifrado ou codificación da información.
E esta última instancia, para o mundo da seguridade.
>> Agora máis seguridade para nós ven en forma de mecanismos moi mundanas.
Todos temos nomes de usuario e contrasinais.
E todos nós temos nomes de usuarios e contrasinais moi malas, máis probable.
Se o teu contrasinal é o mesmo en varios sitios, que probablemente non é
a mellor idea, como discutir en dirección ao fin do semestre.
Se o teu contrasinal está escrito nunha nota - non é broma - no seu
monitor, que tamén non é necesariamente o mellor proxecto, pero bastante común
fenómeno.
E se non está a usar cifrado para cifrar as súas claves, son
particularmente vulnerables.
Entón, se pensas que está a ser super intelixente por unha palabra oculta
documento en algún lugar no seu disco duro que ten todas as súas claves, pero
está nunha carpeta que ninguén vai buscar, iso non é moi
mecanismo seguro.
E entón o que pset 2 ha introducir e esta arte de cifrado e
loitando información para que cousas como claves son
todo o máis seguro.
De xeito motivar este problema moito no mundo real cun moi non do mundo real
escenario, deixe-me presenta-lo a un dos nosos clips favoritos aquí deste
película, Spaceballs.
>> [REPRODUCIÓN]
-Helmet, que demo, o que está a suceder?
O que está facendo a miña filla?
-Permítame presentar o cirurxián plástico brillante moza, o Dr Philip
Schlotkin, o home maior nariz en todo o
universo e Beverly Hills.
-A súa Alteza.
-Nariz traballo?
Non estou entendendo.
Ela xa tiña un traballo nariz.
Foi un agasallo de 16 doce.
-Non, non é o que pensa.
É moi, moito peor.
Se non me dá a combinación do escudo de aire, o Dr Schlotkin vontade
dar a súa filla de volta o seu vello nariz.
-Non!
De onde tirou iso?
-Todo ben.
Eu vou dicir.
-Non, papá, non.
Non debe.
-Está ben, miña querida.
Vou sentir falta do seu nariz novo.
Pero eu non vou dicir-lles a combinación, non importa o que.
-Moi ben.
Dr Schlotkin, faga o seu peor.
-O pracer é meu.
-Non!
Espere, espere.
Eu vou dicir.
-Eu sabía que el ía traballar.
Todo ben, para min.
-A combinación é un.
-One.
-Two.
-Tres
-Tres.
-Catro.
Cinco
-Cinco.
-Así, a combinación é un, dous, tres, catro, cinco.
Esta é a combinación máis estúpida que eu xa oín na miña vida.
Ese é o tipo de cousa que un idiota tería na súa equipaxe.
-Grazas, a súa Alteza.
-O que fixo?
-Eu desliguei a parede.
-Non, non fixo.
Vostede desactivar o filme todo.
-Eu debo ter presionado o botón errado.
-Ben, colocar-lo de volta.
Pon a película de novo.
-Si, señor.
Si, señor.
-Imos, Erna.
Veña, Gretchen.
Está claro que vostede sabe que eu aínda vou ter que cobre-lo por iso.
-Ben, iso funcionou?
Onde está o portón?
-Funcionou, señor.
Temos a combinación.
-Grande.
Agora podemos tomar todas último suspiro de aire fresco do planeta Druidia.
Cal é a combinación?
-Un, dous, tres, catro, cinco.
-Un, dous, tres, catro, cinco?
-Si.
-Isto é incrible.
Eu teño a mesma combinación na miña equipaxe.
Prepare Spaceball 1 a partida inmediata.
-Si, señor.
-E cambiar a combinación na miña equipaxe.
-Ai!
[REPRODUCIÓN FIN]
>> DAVID J. Malan: Un filme sorprendente que ten que ver agora todo.
Así, no contexto aquí é que, con datos inseguras vén unha oportunidade para
criptografía-lo e para embaralhar-lo.
E para que este, por exemplo, é un exemplo dunha mensaxe cifrada.
Isto realmente di algo en inglés.
Pero non é claramente totalmente obvio.
E imos pechar o círculo hoxe a separar o que este segredo
mensaxe aquí é.
Pero no mundo real dos ordenadores, as cousas nin sequera ollar como eles puidesen
ser frases en inglés.
Por exemplo, este é o que se pode atopar nun estándar de Linux ou Mac ou
Unix ordenador nun arquivo que foi unha vez chamado de arquivo de contrasinal.
Hoxe en día, el foi trasladado para outros lugares.
Pero se ollar no lugar seguro nun sistema, vai ver non só o seu
nome de usuario ou a outras persoas sobre o sistema, pero vai ver un
versión cifrada de contrasinal.
De feito, a cripta palabra alí suxire que as seguintes cousas son criptografada.
E esta serie de letras aparentemente aleatorias e personaxes e números e
así por diante pode ser decifrada só por xeralmente sabendo algún segredo -
unha palabra secreta, un número secreto.
E así, de feito, a arte de cifrado, en última análise resúmese a confianza dalgúns
tipo e saber algo que alguén non fai.
Imos explorar iso en detalles un pouco máis hoxe e no pset para vir.
>> E agora unha palabra sobre pasa / fallo.
Así, principalmente, como algúns de vós xa mergullou pset 1, o aparello, e
un mundo moi novo para ti, entender que as frustracións e
dificultades confusión e só técnica son de esperar.
Especialmente co pset primeiro, onde hai tanta cousa nova, só comezando
familiarizado con ls e CD e todos estes comandos arcanos nun novo ambiente.
E iso é separado do material real e propia programación.
Así, entender, tamén, que hai certamente expediente que existen como
a estrutura soporte.
Seccións comezan o vindeiro domingo.
Pero o máis importante, se está sentindo só que este non é o
mundo para ti, entender que realmente é só levar tempo.
E se non fose por esa oportunidade hai anos para me de tomar unha clase
aprobación / reprovação, honesta, eu nunca tería sequera puxo os pés na aula.
E pode cambiar isto ata, digamos, o luns quinta do curso.
Entón, se está no bordo agora, entender que, no canto de cabeza nalgún outro
augas completamente, que seguramente considerar só mudando de aprobación / reprovação.
De novo, non hai realmente esta cultura aquí en Harvard de levar as cousas
pasa / falla unha vez que todos realmente quere alcanzar ou overachieve.
Pero, francamente, esta é unha boa forma de probar algo que quizais non
ser familiar para ti.
E vai acabar facendo, na maioría dos casos, moi finos, quizais
para a súa sorpresa.
E, en termos máis concretos, o que eu creo que pasa / fallo xeralmente fai,
especialmente no que se pode probar con pset 0, se pór
en 10 horas, 15 horas, 25 horas nalgúns pset - e só está batendo
súa cabeza contra a parede,
e está quedando super tarde, á noite,
pero tomou o pset como o 90% do camiño,
vostede sabe que simplemente non pode descubrir unha cousa -
pasa / falla realmente leva a bordo fora dunha clase como este, onde pode clasificar
dicir Feliz todo ben, sei que non é perfecto.
Pero eu traballei para caramba sobre iso.
Estou moi feliz con o lugar onde foi parar.
E que van atender as expectativas de aprobación / reprovação.
Así que manter isto presente.
>> Todo ben.
Entón, aqueles de vostedes que teñen se pretensado para usar a Universidade de Harvard Wi-Fi saber
que hai un SSID CS50, unha conexión Wi-Fi por aí que
podería ter mellor sorte para.
É un pouco irónico que o contrasinal para iso - se quere probar
conexión a este para mellores velocidades e deixe-nos saber se non é mellor -
é un, dous, tres, catro, cinco, todo o camiño ata oito por oito é
máis seguro que cinco.
Entón, se precisa de contrasinal de acceso Wi-Fi, conectar-se sen fíos CS50 aquí.
Un, dous, tres, catro, cinco, seis, sete, oito.
E puxo en CS50 Discutir se aínda ten problemas intermitentes de conectividade,
e imos deixar que os poderes que coñece a este espazo.
>> Todo ben.
Entón, un teaser rápido, especialmente para aqueles de vostedes que son nenos ou nenas de fans
de todas as cousas de Apple.
O que eu retirado uns anos era este ficheiro aquí, ilock.c, só para
tipo de facer máis concreto e máis complexa algúns dos máis básicos C
programas que teño escrito.
Entón eu abri-lo arquivo, ilock.c.
Está dispoñible na páxina de charla para hoxe.
No lado esquerdo, podes ver unha longa lista de funcións.
Así, o suxeito que escribiu este escribiu unha morea de funcións,
máis que de inicio.
El usou unha morea de bibliotecas aquí.
E se comezar a percorrer o que isto realmente é é o propio
En primeiro lugar, eu creo, crack para o iPhone orixinal.
Cando quería facer o Jailbreak do iPhone orixinal, o que significa untether
Os da AT & T e que en realidade instalar un programa especial sobre el e facer as cousas
que Apple non quere que as persoas fan -
Ben, alguén tivo tempo para descubrir exactamente como eles poderían explotar
fallos de software, erros, erros no software de Apple.
E así naceu ilock.c.
Que se compilou en un ordenador e instala-lo en un iPhone que
foi conectado ao ordenador a través de, por exemplo, un cable USB, este lle daría
privilexios administrativos ou de raíz no seu iPhone e deixalo facer moi ben
o que quere.
>> E así houbo este gato fascinante e rato entre Apple e
o resto do mundo, en particular no que, como moitas empresas, tentar bloquear
súas cousas para abaixo así que só pode facer con el o que pretenden.
Pero, grazas a xente como esta é a súa comprensión de baixo nivel
detalles e, neste caso, de programación C e un monte de as construcións familiares
que xa comezou a xogar con, vostede é realmente capaz de alavancar o
hardware dun xeito que pensar mellor e non necesariamente unha entidade corporativa.
Así, por exemplo, eu non teño idea do que todo isto está facendo.
Pero GetVersion soa moi sinxelo.
E parece que esa é unha función que a persoa escribiu.
Tomar algún tipo de número enteiro como argumento, non retorna nada, pero
parece loop cun lazo e un aquí a condición, a condición,
romper, e dalgunha forma relacionado con números de versión.
Se rolar -
aínda que moitas destas palabras clave vai ser novo, e hai unha
serie de funcións no aquí nunca vimos e quizais nunca máis ver
o curso do semestre -
ao final do día, el segue as mesmas regras e lóxica que fomos
xogando con ata agora.
Polo tanto, este é vello de máis para romper o seu iPhone ou 3s 4s ou 5S en breve, estes días,
pero sei que está todo moi derivado deste mundo que temos
mergullou.
>> Entón, imos dar un ollo a un exemplo un pouco máis simple.
Este, só para quentar cunha sintaxe e tamén algúns outros datos
tipo que temos falado, pero realmente non teño visto en C. Polo tanto, este é un
arquivo chamado positive1.c.
E polos comentarios na parte superior, iso só esixe que o usuario proporciona un
número positivo.
Entón, é un exemplo de un loop do-tempo, o que é bo para o usuario interactivo
programas en que precisa dicir ao usuario para facer algo.
E se eles non cooperaren, vostede gritar con eles ou rexeitar a súa entrada.
O caso en cuestión, eu vou facer liñas 19 a 24, sempre que o usuario ten
Non me deu un número positivo.
Agora ese detalle aquí na liña 18, por que eu declarar n riba de toda esa
construción de loop en vez de á beira da liña 22, onde
realmente importa para obter n?
Si?
[Inaudível]
>> DAVID J. Malan: Si, entón esa cuestión do ámbito.
E en termos de secular, o que ámbito se refire?
Si?
[Inaudível]
DAVID J. Malan: Pode falar un pouco máis alto?
COLUMNA 1: Onde podes acceder a unha variable particular.
DAVID J. Malan: Perfect.
Onde podes acceder a unha determinada variable.
E, xeralmente, a regra de ouro ata agora foi a de que o alcance dalgunhas
variable é definida polos aparellos máis recentes rizados que xa viu.
E por iso, neste caso, se eu cometín o erro de declarar n na liña 22,
que a liña ía traballar.
Quere obter un int, e quere poñelas en que n variable na liña 22.
Pero cal liña de código que agora non ten idea do que estou falando?
Así, 25, e verifica-se 24, así como, porque, neste caso, está fóra
das claves.
Entón, un pouco de problema, pero moi doado de resolver, simplemente declarando
a variable fóra da propia función.
>> Agora imos ver máis adiante hoxe, pode ir un paso máis aló.
E pode ata quedar un pouco preguiceiro -
e iso non está a ser recomendado en xeral -
pero pode ata ir con preguiza e poñer unha variable global, por así dicir, non
dentro dunha función, e non dentro dun lazo, pero o arquivo en si, fóra
de todas as funcións que escribiu, como eu fixen aquí en liña 15.
Pero este é xeralmente desaprovado.
Pero esta é unha solución, por veces, a outros problemas, como veremos
finalmente ver.
Entón, por agora, imos deixalo así.
Pero imos ver se podemos reescribir iso só para comezar a expresar-nos un
pouco diferente.
>> Polo tanto, este programa, só para quedar claro, é positive1.
Deixe-me ir á fronte e aquí na miña xanela de terminal facer positive1, Intro.
Compila, todo ben.
Vou correr positive1, prema Intro.
Eu esixo que me dea un número enteiro positivo.
Eu vou dicir -1.
Isto non funcionou.
0, 99, que parece funcionar.
Quizais non a proba máis rigoroso.
Pero polo menos é unha proba de sanidade bo que estamos no camiño correcto.
Entón, agora deixe-me ir adiante e abra a versión dous deste.
E o que é diferente xa?
El aplica a mesma cousa.
Pero o que está pulando fóra tan claramente distinto desta vez?
Si, así que este bool en verde.
Gedit ten destaque na palabra clave deste verde coñecida como bool,
que é un tipo de datos.
El non vén construído en todas as versións de C. Debe incluír un
biblioteca particular.
No noso caso, inclúe a biblioteca para que CS50
ter acceso a bool.
Pero, na liña 18, parece que temos un valor booleano aquí chamado agradecido.
Entón, eu podería ter chamado este nada.
Pero eu liguei para el grata só para transmitir algún tipo de significado semántico.
Polo tanto, inicialmente na liña 18, eu non son aparentemente grata porque o
Valor booleano grata é inicializar como false na liña 18.
E entón parece que eu fixen aquí en liñas de 21 a 23 e que acaba de
tipo de reescrita miña lóxica.
Polo tanto, non funcionalmente diferente.
Pero, na liña 22, agora podo comprobar que o int o usuario teña solicitado é maior que
0, entón eu simplemente cambiar o valor de grata a verdade.
E por que eu faría iso?
Porque, na liña 25, ao parecer, eu estou indo para comprobar unha condición.
Fai iso loop while grata é falsa.
>> Entón eu propoño isto como unha alternativa para unha versión porque é polo menos un
pouco máis intuitivo, quizais.
É un pouco máis fundamentada en inglés.
Entón faga o seguinte mentres non está grata ou agradecido mentres é falso.
E esta vez, tamén, eu aparentemente non lle importa lembrar que o usuario introduciu
no aviso, porque non hai ningunha variable n.
Entón, en realidade, eu -
unha pequena mentira alí.
Funcionalmente, o programa é un pouco diferente, xa que chegar ao fondo da
porque eu non estou lembrando que n é.
Pero eu quería demostrar aquí tamén que aínda que vimos e GetInt
GetString ser utilizado no lado da man dereita de un sinal de igual modo que, ata agora,
lembrar o valor, tecnicamente, iso non é estrictamente necesario.
Se por calquera motivo vostede simplemente non lles importa para salvar o valor, só quere
para comprobar o valor, observe que podemos simplemente escribir isto como GetInt aberto
paren, paren preto.
Esta función devolverá un valor, como temos benvida a dicir.
Vai dar de volta un int.
E se pensas que mentalmente de isto acontecer, cando escribir 99, GetInt
devolve o número 99.
E así, conceptualmente, é coma se o meu código eran, en realidade iso.
Entón, se 99 é de feito maior que 0, entón grata se fai realidade.
Entón entende Ooh liña 25, estamos a facer porque eu son grata agora.
E na liña 26, nós simplemente dicir, grazas pola enteiro positivo, o que quere que
pasou a ser.
>> Agora imos facer azucre sintático lixeiro aquí, por así dicir.
Imos ver se conseguimos limpar esa liña 25 con esa variación terceira e última
en positive3.
Entón, observe a única diferenza agora é que liña de código?
Si, entón 25.
E nós non temos realmente visto este truco aínda.
Pero fixo ver o punto de exclamación o luns, o que denota o que?
Entón, non, negación ou.
Entón, ter un valor booleano e virar o seu valor.
Verdade torna-se falsa.
Falso se fai certo.
Así, gustaríame propoñer, é ata un pouco máis intuitiva dun modo de
escribir o código, porque eu aínda arrincar grata a falso.
Eu segue a facer o seguinte.
Eu define grata a verdade cando chegar a hora.
Pero agora pode realmente só traducir este código verbalmente esquerda a dereita,
mentres non agradecido.
Porque bang, ou punto de exclamación, denota a noción de non, entón mentres
Non agradecido.
>> Entón, de novo, non introduciron novos conceptos en si.
Nós conversas sobre booleanos atrás cando nós tocamos co scratch.
Pero entendo agora podemos só comezar a escribir o noso código
moitas maneiras diferentes.
Así, especialmente no pset1, se é unha especie de loita para descubrir a forma de
escribir un programa, a probabilidade de que está con sorte, porque non vai ser calquera
número de solucións que pode acontecer enriba.
Por exemplo, este é só tres, mesmo para o máis simple dos programas.
Todo ben.
E agora lembrar o luns, que deixou esta nota con valores de retorno.
Así, a primeira vez, escribir un programa que non só principal,
tamén ten a súa propia función personalizada que escribín aquí.
Así, na liña 31 a 34, eu apliquei unha función cubo.
Non é complexo.
É só unha veces veces un, neste caso.
Pero o que é importante sobre o que é que eu estou tendo entrada na forma dun e
Estou volvendo a produción en forma de veces veces un.
>> Entón agora eu teño a capacidade, tanto como eu adoitaba facer printf só para chamar
esta función chamando a función cubo.
E a función cubo leva algún entrada.
E a función cubo retorna algunha saída.
E así por contraste, printf só fixen algo.
El non devolveu algo que importaba - aínda que, como un
de lado, fai voltar un valor.
Normalmente só ignore-lo.
Printf só fixen algo.
El tiña un efecto colateral de impresión á pantalla.
En contraste aquí, temos a función de cubo, que
En realidade, retorna algo.
>> Polo tanto, esta é xeralmente -
para aqueles familiarizado con iso, é unha idea moi sinxelo.
Pero, para os menos familiarizados con esta idea de pasar insumos e obter
saídas de volta, imos tratar só algo simple super.
Alguén está cómodo chegando no escenario brevemente?
Ten que estar cómodo con unha cámara en ti, tamén.
Si
Ok, cal é o seu nome?
Ken: Ken.
DAVID J. Malan: Ken.
Todo ben, Ken.
Imos cara arriba.
Entón Ken vai ser unha función do tipo aquí.
E imos adiante e facelo.
Imos pegar un pouco de fantasía.
Pracer de coñece lo.
Benvido ao centro do escenario.
Todo ben.
Imos bater este botón aquí.
Todo ben.
Entón aquí tes un cadro moderno.
E o que eu son é a función principal, por exemplo.
E eu non teño un iPad na man.
Eu realmente non me lembro como - ben, en realidade, non podo dicir iso.
Eu realmente non teño boa caligrafía.
E así, polo tanto, quero que imprimir algo na pantalla para min.
>> Entón, eu estou sendo o programa principal.
E eu vou ter que dicir isto por escrito na miña cero polo e
a continuación, pasando-lle unha entrada.
Así como boba que este exercicio é, a noción de funcións e chamar a un
función e voltar unha función en realidade se reduce a iso.
Estou principal.
Acabo de escribir printf ("algo") na pantalla.
Estou executar este programa.
E logo que printf é chamado, ten un argumento - ou un parámetro,
ás veces -
entre comiñas dobres.
Aquí é que o argumento.
Estou pasando para Ken.
Agora é unha caixa negra escrito algún número de anos que, ao parecer,
só sabe como imprimir cousas na pantalla.
>> Entón, siga.
Isto non é malo.
Entón, moi bo.
Entón, agora está feito Ken execución.
Será que precisa me dar nada a cambio?
Polo tanto, non que vimos ata agora.
Unha vez máis, printf fai realmente voltar un número.
Pero imos ignorar que, por agora, porque nunca usei.
Entón é iso para Ken.
E agora principal volve executar -
Inicio asume o control do programa de novo, porque esa liña de código,
printf, está feita a execución.
E nós imos sobre o noso xeito de facer o que quere que as outras liñas están alí.
>> Todo ben.
Entón, agora imos tratar un exemplo un pouco diferente.
E este tempo aquí, imos primeiro limpar a pantalla aquí.
E esta vez, imos facer a función de cubagem.
Pero esta vez, espero un valor de saída.
Entón, imos adiante e facelo.
Entón agora eu teño unha liña de código que di que x = cubo (x).
Entón, en realidade imos -
a liña de código, recall, parece con isto.
x = cubo (x).
Entón, como é que isto vai funcionar?
Entón, imos adiante e dar-lle unha pantalla branca de novo.
E eu vou escribir agora baixo o valor de x, que neste momento
tempo pasa a ser, digamos, 2, para mantelo simple.
Entón, eu teño escrito nun anaco de papel o valor 2,
cal é o meu valor x.
Eu entregalo a Ken.
Ken: E eu só escribir a resposta?
DAVID J. Malan: Si, imos só escribir a resposta.
Okay.
E agora ten que volver-me algo.
Entón -
perfecto.
Segue agradable.
>> Entón, agora me dá de volta o valor de 8, neste caso.
E o que fago con el?
Ben, en realidade, imos ver.
Obter este dereito.
O que eu vou facer con el?
Agora eu vou levar ese valor e, de feito, almacena-lo naqueles
mesmos bits na memoria.
Pero aviso, eu son o tipo de loita aquí.
Estou un pouco confuso, porque onde eu realmente escribir o valor de x?
Porque o que eu acaba de facer é fisicamente man Ken un anaco de papel
que tiña o valor 2, que foi x.
E, de feito, iso é precisamente o que pasa.
Así, verifícase que cando chamar a unha función, e pasa un argumento
como "Ola Mundo" ou pasa un argumento como 2, xeralmente, está
pasando unha copia do argumento.
E como eu escribín o número 2 aquí e entregouna a Ken, o que debe
significa que eu aínda teño unha copia do 2 valor en algún lugar.
Porque en realidade, agora que eu comece de novo o valor 8, eu teño volver a
RAM e realmente escribir 8, onde unha vez eu tiven o número 2.
>> Entón lembre-se visualmente esa noción de paso en literalmente
unha copia do valor.
Ken fai a súa cousa, me dá de volta algo - neste caso,
un valor como 8.
E entón eu teño que facer algo con ese valor, se eu
quere mantelo por preto.
Entón, todo isto será moi familiar antes de tempo.
Moitas grazas por esta demo aquí, Ken.
Todo ben.
Moi ben feito.
Entón, imos ver como é que, en última análise relaciónase con algunhas das funcións
chamada que estamos facendo aquí.
Entón deixe-me ir adiante e nos traer de volta ao exemplo cubagem aquí.
E entender que, se queremos realmente comezar a tomar isto aínda máis, imos
ter que estar atentos ao feito de que o número x que está a ser pasado
aquí é diferente do que realmente está a ser pasado para a función.
Entón, de novo, este pasou por copia vai tornar-se bastante
Germano en só un momento.
>> Entón, imos dar un ollo a algo que non funciona moi ben certo aínda.
Eu estou indo a ir adiante e abrir un exemplo de buggy terceiro, que
é fallou por natureza.
E é chamado buggy3, e implementa unha función de cambio.
Polo tanto, temos aquí unha función principal que X e Y arbitrariamente inicializar a
1 e 2, respectivamente.
Nós poderiamos usar GetInt, pero só necesitamos un exercicio sinxelo.
Entón está codificado como 1 e 2.
En liñas 21 e 22, que, ao parecer, imprimir x e y, un por liña.
A continuación, na liña 23, eu afirmo que estou cambiando estes valores, punto, punto, punto.
Eu aparentemente chamar unha función na liña 24 chamado de intercambio
que leva dous argumentos.
É totalmente lexítimo para as funcións de tomar dous argumentos.
Vimos printf facelo xa.
Así, ao parecer, ten de permuta x e y.
E, como o propio nome suxire, eu espero que vai
intercambiar estes dous valores.
Entón eu reclamar na liña 25, trocados.
E I reimprimir x e y con base no presuposto de que
eles de traxe foron trocados.
Pero se realmente executar este programa -
deixe-me abrir unha xanela de terminal.
Deixe-me facer buggy3.
Como o nome suxire, este non vai acabar ben.
Porque cando prema Intro, observe que x é 1.
y é 2.
E aínda, ao final do programa, eles aínda son, en realidade, a mesma cousa.
>> Así, con base na demostración só agora con Ken, o que está realmente a suceder?
Ben, imos mergullar nesta función de intercambio.
É super curto.
É só unhas liñas de código longo.
Pero cal é o problema fundamental, baseado na historia sinxela contada
aquí con Ken?
Por que o intercambio de partido?
[Inaudível]
Exactamente.
Entón, nós estamos almacenando unha copia, e non a propia variable.
Noutras palabras, cambio aparentemente ten dous argumentos, un int.
E é arbitrariamente chamada a e b.
E aquí enriba, eu pase en X e Y, que son, respectivamente, 1 e 2.
Pero eu non estou literalmente pasando x.
Eu non estou literalmente pasando y.
Estou pasando unha copia de X e unha copia do y.
É como se case como se copiado e pegado en cambiar os valores que
queres que realmente manipular.
Entón, se ese é o caso, cando o programa, iniciar a execución
liña 35, despois 36 -
cando chegar á liña 37, neste punto da historia, o que é o valor dunha?
Neste punto da historia, liña 37, que é o valor dun, neste punto?
Por iso, debe ser só unha.
Non?
Como x foi pasado como o primeiro argumento.
E esa función só arbitrariamente está chamando o seu primeiro argumento, a.
Do mesmo xeito é y, o segundo argumento.
E só arbitrariamente chamar a b segundo argumento.
>> Agora esa dicotomía é, en realidade, moi sinxelo explicou.
Pense sobre iso.
Ningún de nós coñeceu a persoa que escribiu printf.
Así, por suposto, el ou ela non ten idea do que as nosas variables 30 anos máis tarde van
a ser chamado.
Entón, ten que haber unha distinción entre o que chama de variables en
funcións que está escribindo e que vostedes chaman de variables en funcións que está a
chamada ou usar.
Polo tanto, noutras palabras, eu escribín os meus variables como X e Y.
Pero, se alguén tiña escrito a función de intercambio, el ou ela certamente
non sei o que os meus variables van ser chamados.
Entón entender que é por iso que ten esa dualidade de nomes.
Tecnicamente, eu podería facelo por coincidencia.
Pero aínda ser pasado como copias.
Sería só pura coincidencia esteticamente se esa persoa que escribiu
cambio usara os mesmos nomes.
>> Todo ben.
Polo tanto, neste punto da historia, liña 37, un é un.
b é 2.
E agora debo proceder para trocalos.
Ben, primeiro de todo, deixe-me realmente facelo moito máis simple.
Eu non sei o que estas tres liñas de código foron facendo.
Deixe-me facelo.
b recibe un.
obtén un b.
Feito.
Por que iso é roto, loxicamente?
É o tipo de cousa intuitiva, non?
Así, torna-se un b.
E faise un b.
Pero o problema é que, así como a liña 37 é executada, o que é o
valor de a e b?
O mesmo, 1.
Porque xa derrotado, por así dicir, vostede cambiou b para igualar un.
Polo tanto, unha vez liña 37 é executado, iso é óptimo.
Vostede agora ten dúas copias do número 1 dentro desta función.
Entón cando di na liña 38, un queda b, así, vostede é do tipo de rosca.
Porque está só a asignación de 1 a 1.
Vostede medio que perdín o valor que se preocupaba.
>> Así, na versión orixinal do presente, observe o que eu fixen.
Eu en vez tivo unha terceira liña de código que era así.
Eu declaro dunha variable temporal - tmp é un nome moi común
para unha variable temporal.
É un int porque ten que coincidir co que quero facer unha copia.
Eu gardar unha copia dun dentro tmp. Polo tanto, unha vez liña 37 foi executado,
o valor de a é -
sanidade rápido check -
1.
O valor de b é 2.
E o valor do tmp tamén é 1.
Entón agora eu executar a liña 38.
Así, unha vez liña 38 é executado, unha toma o valor de b.
B foi 2.
Así, é agora un 2.
Entón, neste punto da historia, un é de 2, B e 2,
tmp e 1.
Entón, agora, loxicamente, podemos só valor tmp plop de en b.
E estamos a facer.
>> Entón nós decidimos este problema.
Desafortunadamente, cando executar este programa baixo esta forma, que en realidade non cambiar
os valores.
Pero, para ser claro, por que?
Resolve o problema lóxico dun momento atrás.
Pero, de novo, se eu executar este programa, X e Y permanecen inalteradas ata finais de
execución do programa.
[Inaudível]
DAVID J. Malan: Entón non retornaron nada.
Entón, iso é verdade.
Pero acontece que hai un pouco de un problema aquí, porque, ata agora, o
único que teño sido capaz de volver é unha cousa.
E esta é unha restrición de C. Só podes voltar un valor realmente,
caso en que, eu son o tipo de preso aquí
porque eu podería voltar o novo valor de x ou que eu podería volver a
novo valor de y.
Pero quero os dous de volta.
Entón, retornando non é a solución simple aquí.
Pero o problema fundamental é por que?
O que realmente trocados?
a e b.
Pero a e b son copias de x e y, o que significa que só fixo todo isto
traballar - só pasou uns tres minutos falando sobre o intercambio
función e todas estas tres variables.
E iso é óptimo, perfectamente correcto en illamento.
Pero e ámbito de b é só nestas liñas aquí.
Entón, como un loop, se declara un enteiro i na
loop - Do mesmo xeito, se está dentro de declarar a e b dunha función que
escribiu, son só válido dentro desa función.
O que significa que, unha vez que swap está feito execución e nós imos de liña de 24 a
liña 25, x e y non foron alteradas de forma algunha.
Vostede desperdiçar só unha morea de tempo a cambio de copias de variables.
>> Así, verifícase que a solución para iso é, en realidade, non obvia.
Non é ben abondo para voltar valores porque podemos
voltar só un valor.
E eu realmente quero cambiar x e y ao mesmo tempo.
Entón, imos voltar a iso.
Pero, por agora, entender que a cuestión fundamental deriva do feito de
que a e b son copias.
E eles están no seu propio ámbito.
Ben, imos tentar resolver iso de algunha maneira.
Deixe-me realmente rolar de volta aquí e abrir-se, por exemplo, unha cuarta variante
diso, buggy4.
E o que sobre iso?
Este é un problema semellante, pero máis sinxelo de ollar antes de tomar unha facada
resolvelo.
Este programa é chamado de incremento.
E aparentemente inicia un enteiro x 1 en liña 18.
Eu, entón, dicir que x é 1.
Eu, entón, afirman incrementando, punto, punto, punto.
Eu, entón, chamar incremento.
Pero, entón, en liñas 22 e 23, eu afirmo que foi incrementado.
Eu reivindico x é agora o que quere que sexa, 2 presuntamente.
>> Pero este programa é buggy.
Cal é o problema?
Si?
[Inaudível]
DAVID J. Malan: Exactamente.
Entón x foi declarada, obviamente, na liña 18.
Que está dentro de chaves principais.
Polo tanto, a resposta simple é que, así, x existe aquí.
Non existe na liña 32.
Polo tanto, este programa realmente non vai nin compilar.
O compilador, cando tentar compilar este código, vai berrar comigo
sobre algúns identificador non declarado ou algo nese sentido.
En realidade, imos tratar.
Esta é facer buggy4.
Non é.
Use X identificador non declarado na liña 32.
E, de feito, imos ser máis explícito aquí hoxe para que esta sexa útil
horario de oficina e na casa.
Teña en conta que é un pouco enigmática escritura.
Pero o feito de que Clang ten chamado, dicindo
buggy4.c: 32:5, é realmente útil.
Isto significa que o erro está na liña 32 na posición de cinco caracteres.
Entón, un, dous, tres, catro, cinco.
Isto é, de feito, onde está o problema.
E tamén para manter presente á hora de oficina e na casa, teño sorte aquí.
Eu teño un erro.
Vai ser relativamente doado de corrixir.
Pero se recibir unha pantalla chea de mensaxes de erro esmagadora, unha vez máis,
entender que o máis inferior pode ser só sintomático da
os de nivel superior.
Entón, sempre perseguir os seus erros dende arriba para abaixo.
Porque non pode ser só un efecto en cadea que está suxerindo que
ten problemas de xeito máis que realmente fai.
>> Entón, como poderiamos resolver iso o meu obxectivo é incrementar x?
¿Que é iso?
Okay.
Así, podemos facer x global.
Imos incorporarse a ligazón que eu avisei sobre a anterior.
Pero que demo, só necesitamos unha solución rápida.
Entón imos só dicir int x aquí.
Isto fai x global.
Entón, agora principal ten acceso a el.
E incremento ten acceso a el.
E entón deixe-me ir adiante e compile iso agora.
Fai buggy4, Intro.
Parece compilar.
Imos correr buggy4, e parece realmente funciona.
Agora, esta é unha desas cousas -
faga o que eu digo, non o que fago, como eu acaba de facer aquí.
Porque, en xeral, os nosos programas van ser moito máis interesante e
moito máis que iso.
E se a súa solución para os problemas da vida é só ah, poñer todo o
variables na parte superior do seu arquivo, moi rapidamente facer programas de obter
terriblemente difícil de xestionar.
Está máis difícil de pensar en novos nomes de variables.
Está máis difícil de entender o que está facendo o que variable.
>> E así, en xeral, isto non é unha boa solución.
Entón, imos facelo mellor.
Nós non queremos usar unha variable global aquí.
Eu quero incrementar x.
Entón, eu podería, por suposto -
ao final do día, é unha especie de unha historia boba, porque acabamos de facelo.
Pero se eu non sabía sobre ese operador, ou eu non tiña permiso para
muda-lo principal en si, que outra forma eu podería aplicar Ken aquí, este
tempo de cubo, pero non para incrementar?
¿Como cambiar a cousa aquí?
Si
[Inaudível]
DAVID J. Malan: Ok, moi bo.
Entón, por que non eu pasar x?
E entón, en vez de devolve-lo, por que non eu só fago retorno x + 1?
Agora, algunhas cousas teñen que cambiar aquí.
Eu estou no camiño correcto.
O que máis me teño para axustar?
Alguén.
Si?
[Inaudível]
DAVID J. Malan: Eu teño cambiar o tipo de retorno de incremento
porque non está baleiro.
Baleiro non significa nada está devolto.
Pero, claro, agora é.
Entón, iso precisa cambiar int para ser coherente co que
En realidade, estou volvendo.
>> Agora outra cousa aínda é buggy aquí.
Si?
[Inaudível]
DAVID J. Malan: Entón eu teño incrementar x?
[Inaudível]
DAVID J. Malan: Ah, entón eu teño pasar x.
Entón eu teño que facer iso aquí.
Así, o prototipo, eu teño que cambiar isto aquí.
Polo tanto, este ten que facer un int.
Isto ten que facer -
hmm.
En realidade, teño un erro aquí.
Imos solucionar isto primeiro.
O que isto realmente debe ser?
Entón, ten que ser unha cousa int.
Podería ser x.
Pero, francamente, se comezar a chamar toda a súa x variables, que vai comezar
menos e menos claro cal é cal.
Entón imos escoller arbitrariamente unha convención de nomenclatura diferente para o meu
funcións auxiliares, as funcións que estou escribindo.
Imos chamar-lle un.
Ou poderiamos chamalo - imos chamalo even_number ser aínda máis explícito.
Entón eu teño que devolver calquera que sexa o número engade 1.
E agora eu teño que cambiar unha cousa aquí e un
outra cousa aquí.
O que eu teño que cambiar en liña 21 en primeiro lugar?
Eu teño que asignar a x.
Entón eu non podo só chamar x incremento.
Cómpre lembrar a resposta, cambiando o valor de x en
á esquerda.
E aínda que x é agora á esquerda e á dereita, que é totalmente bo porque
o lado dereito é executado primeiro, entón, é se xogou na esquerda
cousa man, x, neste caso.
E entón, finalmente, este é un reparación doado agora.
Este debe só combinar o que hai alí embaixo.
Número int.
>> Todo ben.
Entón, unha morea de cambios para unha función moi estúpido.
Pero representante das cousas que imos cada vez máis quere facer.
Entón faga buggy4.
Eu estraguei todo en algún lugar.
Oh, meu Deus.
Cinco erros en, tipo, un programa de seis liña.
Entón, o que hai de malo en liña 18, o personaxe de 5?
Todo ben.
Entón eu teño que declarar este int.
Todo ben.
Entón imos ver, unha morea de outros erros.
Oh meu deus.
19, 18, 21.
Pero, de novo, imos limpar a pantalla -
L control aquí - e re-run Clang.
Entón, cinco problemas que en realidade é só unha.
Entón, agora imos realizar buggy4, Intro.
Ufa.
X foi incrementado correctamente.
>> Todo ben.
Calquera dúbida sobre como incrementar números?
Si?
Speaker 2: Por que pode simplemente cambiar o número x na variable
nomear e vai saber o que quere dicir?
DAVID J. Malan: Boa pregunta.
Como é que podo simplemente cambiar o número x eo programa vai saber
inmediatamente?
Entón, de novo, pensar nel como esa abstracción.
Entón, se eu son de inicio e Ken é incremental, francamente, eu non me importa
o que Ken chama o seu iPad.
Eu non ligo para o que el chama de nada que teña que ver coa súa implementación
esta funcionalidade.
Polo tanto, este é un detalle de implementación que, de inicio, non
ten que se preocupar.
E así simplemente cambiar consistente dentro da función, número aquí
eo número aquí, é todo o que preciso tanto tempo como eu recompilar.
É unha especie de sabor, se pensar - que moitos de nós, aqueles de vostedes con condutor
licenzas que xa percorridos, ou se mesmo conducido nun coche -
a maioría de nós non ten idea de como un coche funciona baixo o capo.
E, literalmente, se abrir o capó, a maioría de nós - eu incluído -
non están indo para realmente saber o que estamos mirando.
Tipo de como pode se sentir con cousas como esta agora.
Pero nós realmente non se preocupe como o coche funciona.
Nós non temos que coidar o que todos os bastóns e pistóns e cables dentro
o coche está realmente facendo.
>> Polo tanto, algo así como o que vostedes chaman o pistón non importa
aquí neste caso.
Mesma idea.
Si?
[Inaudível]
DAVID J. Malan: Se houbese máis usos do momento XA variable atrás,
ti, programador, tería que cambiar todos os lugares.
Ou pode literalmente facer menú Arquivo e, a continuación, atopar / substituír,
algo así.
Pero vai ter que facer estas modificacións mesmo.
Ten que ser consistente.
[Inaudível]
DAVID J. Malan: Unha orde particular, como aquí?
Se este era int outro número?
Si
Así orde importa cando está chamando a función.
Entón, se eu estivese chamando incremento aquí con algo coma algo
hai un mapeamento directo.
A primeira variable, o que se chama, faise unha copia do primeiro
argumento aquí.
Sentímolo, iso non debe ser un paréntese.
O segundo argumento liñas anteriores co segundo.
>> Así, a orde, si, importa.
Todo ben.
Sentímolo eu levei un longo camiño para chegar alí.
Outras preguntas?
Todo ben.
Entón imos ver se non podemos pintar unha imaxe do que está realmente a suceder
aquí debaixo do capó, por así dicir.
Polo tanto, este é un rectángulo que pode representar a memoria do seu ordenador.
Así, mesmo se non ten idea de como funciona a memoria ou como funciona a memoria RAM, polo menos
asumir que ten acios de que estes días.
Tes megabytes del.
Tes gigabytes de lo.
E sabemos de cero semana un byte é o que?
8 bits.
Certo, entón oito ceros e uns.
Entón, se o seu ordenador ten un giga de RAM, dous Gb de RAM nestes días, ten un
millóns ou 2 millóns de bytes de memoria, ou preto de 8 millóns ou 16000000000
bits, dentro do seu ordenador.
Agora, ao contrario do exemplo Willy pouco Woolly, non é partículas magnéticas
tipicamente máis.
Cada vez máis, en portátiles, polo menos, é drives de estado sólido, os SSDs, que
só non teñen partes móbiles.
É todo electrónico.
É todo de electricidade baseada.
Entón, creo que, no entanto, este rectángulo como só representa un ou dous
gigabytes de memoria que ten.
>> Polo tanto, é unha peza da memoria.
Agora, o mundo da informática ten a sorte de anacos particionadas fóra de
memoria para facer cousas distintas.
Así, por exemplo, esta é a memoria RAM do ordenador - como suxerido pola
rectángulo alí - Acontece que, por convención, na parte superior da súa memoria RAM, para
para falar, é xeralmente o que se denomina un segmento de texto.
Estes son os ceros e uns que compilados.
Entón, cando nós miramos debaixo do capo que a.out é, todo
os ceros e uns -
cando executar un programa, estes ceros e uns son cargados a partir do seu disco duro
unidade en algo chamado RAM.
E na RAM, son colocadas na parte superior.
Agora, con todo, ten outras cousas.
Datos inicializados, datos non inicializados.
Eses dous fragmentos de memoria refírense a variables globais, que
non adoita usar.
Pero, ás veces, se fai iso, eles acaban alí tamén.
Despois, hai algunhas outras cousas.
Variables de ambiente, que non vai pasar moito tempo.
Pero, entón, dúas cousas importantes que volverá ao longo deste
pila semestre, e heap.
>> Así, a maioría da memoria do seu ordenador está reservado ao executar un programa para
algo chamado de pila e algo chamado de pila.
E nós non imos falar sobre a pila de hoxe, pero imos
falar sobre a pila.
E a pila é destinado a conxurar a vista de como comedor
bandexas de comida Mather casa, ou onde queira que estea, onde o
comedor equipo limpa-los todos os días.
Eles empilhá-los do chan cara arriba.
E do mesmo xeito na memoria, non é esa idea de poñer algo nun
empilhar, poñer algo nunha pila, poñer algo nunha pila.
E o que queremos dicir con iso?
Ben, imos zoom e só a metade inferior da imaxe, do seu ordenador
RAM, a propoñer o seguinte.
Acontece que cando executar un programa como a.out ou Ola, sexa cal sexa
do programa que escribiu,
de novo, os ceros e uns son cargados a partir do disco duro - o que é
almacenamento a longo prazo, permanece alí mesmo cando puxar a ficha -
cargado na memoria RAM.
RAM é máis rápida que os discos duros.
É menor que os discos duros.
Pero é que os programas en directo, mentres está executando-os.
>> Entón premer dúas veces un programa en un Mac ou PC - é cargado de
disco duro para a memoria RAM.
Así como é cargado na memoria RAM, os ceros e uns ir na parte superior forma, o
chamado segmento de texto.
Pero entón, logo que o programa realmente comeza a funcionar, o principal
función é chamada.
E principal, como vimos, moitas veces ten variables locais.
E ints e cordas e carácter e semellantes.
Polo tanto, se o seu programa que escribiu ou o programa que ten
premendo dúas veces usou algunhas variables dentro do principal, eles acaban no
fondo da súa pila de memoria, por así dicir.
Agora, máis concretamente, o que iso realmente significa?
Isto só significa que se fósemos a contar as cousas -
se estivésemos indo ao número de bytes de memoria RAM no seu ordenador, observe que
este pode ser o número cero byte.
Este pode ser o número de bytes de un, dous, tres, catro, cinco, seis, todos
o camiño ata gusta -
2000000000 sería todo o camiño ata alí enriba.
Polo tanto, noutras palabras, cando falamos de memoria RAM ou en termos de bytes,
Significa só que alguén decidiu que cada número de
os anacos de memoria.
>> Así, cando precisa de 32 bits para un enteiro, ou precisa de 8 bits para un char, cando
eles acaban na memoria?
Ben conceptualmente, eles só acaban no fin desta
cousa chamada a pila.
Pero o que é interesante agora é cando chama unha función principal.
Supoña que unha función chamada foo, só o nome dunha arbitraria.
O que pasa é principal na parte inferior desta pila de memoria.
Foo agora é poñer enriba do principal na memoria.
Así, todas as variables locais que foo teña acabar tipo de conceptualmente arriba
aqueles en principal.
Se foo chama outra función chamada bar, estas variables acaban aquí.
Se a barra de chama outra cousa, aquí, aquí, aquí.
Entón, o que é interesante sobre a execución dun programa que, como chamar funcións,
e como esas funcións chamar funcións, e como esas funcións chamar funcións,
construír esta pila de funcións na memoria.
E só unha vez a función devolve comezar a que a memoria de volta.
Polo tanto, unha das formas máis fáciles de quedar sen memoria nun programa de ordenador é
escribir funcións que nunca retornan.
>> Así, por exemplo, imos demostrar tanto cunha
programa intencionalmente buggy.
Deixe-me ir adiante e facer # include, int main (void).
E eu vou facer mentres (2> 1), o que probablemente non ha nunca
cambiar en nós.
E deixe-me ir adiante agora e facer printf.
En realidade, iso vai ser menos interesante visualmente.
Imos facelo.
Para int (i = 0; i> 0).
Imos facer este erro, i + +.
E non imos printf aquí.
Imos practicar o que eu estaba predicando.
Imos ter un método aquí.
Refrán baleiro, e imos dicir int i.
E entón eu vou dicir, printf -
oh, imos facelo máis interesante.
Non imos realmente imprimir nada.
Imos facelo.
Coro (i).
>> Todo ben.
Polo tanto, este é buggy por que?
Eu estou facendo iso como eu ir, porque o programa non fai nada
de interese.
Pero ese non é o obxectivo.
O obxectivo é escribir un programa que ten como principal función fai o que, ao parecer?
Identificar.
E, en realidade, nós non precisamos do loop.
Imos mesmo simplificar este só para non perder de vista realmente a
erro fundamental.
Chamadas principais coro a cantar algunha coro.
Entón eu fixen algo estúpido, e eu tiña coro chamada coro porque eu asumín
alguén estaba indo a implementar lo quizais.
E agora iso non vai compilar aínda.
Eu teño que facer o que?
Eu teño do prototipo, lembre-se.
Entón, eu preciso ter-se aquí coro void (int i);.
>> Entón, agora, se eu baixar aquí -
En realidade, imos usar a xanela máis grande.
Imos adiante e facer coro.
Utilización de declarante Non está identificado i.
Ah, iso foi estúpido.
Nós non precisamos do argumento.
Imos facelo.
O Wish nós comezara dese xeito.
Sería un programa moito máis doado escribir.
Entón alí.
Agora imos para a miña xanela de terminal, re-run Clang.
E aquí imos nós.
Iso foi moi rápido.
O que realmente aconteceu, mentres?
Ben, agora eu vou engadir a liña de impresión, para que poidamos ver.
Entón deixe-me dicir printf, imos dicir, eu estou aquí.
Ok, non variables, imos deixalo así.
Deixe-me volver a correr facer.
Deixe-me re-run coro.
E imos.
Continúe indo.
Como un aparte, por que aínda non caeu aínda?
O fallo de segmentación ocorreu super rápido antes.
[Inaudível]
DAVID J. Malan: Exactamente.
Entón, hai que tempo para imprimir.
El só ten máis traballo por parte do ordenador.
E aí está.
Fallo de segmento.
>> Entón, observe o quão rápido os programas executados.
Se vostede non está imprimindo nada, super rápido.
Pero aínda teño esa fallo de segmento, porque o que estaba a suceder?
Ben, se pensar sobre como a memoria do seu ordenador e colocar para fóra, esta
pasa a ser principal.
Pero aquí -
imos chamar este coro, e imos chamar este refrán.
E agora, se eu fai a miña estética certo, iso só vai dicir coro,
coro, coro, coro, coro, coro, coro, relativa nauseum.
E, finalmente, o que vai ocorrer?
O panorama é literalmente iso, o que pasa só conceptualmente?
As derrapagens pila a pila.
Ou peor, só superado todo, incluíndo o segmento de texto, que é
os ceros e uns que representan o seu programa.
En suma, este é só super, super-malo.
Non?
O seu programa entrou nunha espiral fóra de control.
Está a usar a memoria moito máis do que quería todo por mor dun estúpido
erro, neste caso.
Ou, neste caso, unha función moi deliberadamente feito ligando-se.
Agora, iso non é de todo malo.
Funcións que chaman-se, en realidade, ten un gran poder
cando usalo correctamente.
Eu non teño usado correctamente aquí.
>> Entón iso non é de todo malo.
Pero o feito de que eu nunca realmente deixar de chamar a min mesmo é fundamental
debilidade aquí deste programa.
Entón onde estamos indo con todo isto?
Ben, o que está realmente a suceder?
Cando eu chamo a función de incremento, como estabamos facendo nestes exemplos,
Eu teño un valor como unha que eu pasar dentro
Eu pasar unha copia do número un.
Entón sucede o seguinte.
Entón imos para o exemplo de incremento.
E este cara por aquí.
Entón aquí é o que está realmente a suceder.
Cando liguei incremento, e eu pasar x, pictoricamente o que é
pasando aquí é esta -
se eu tivera o valor dun almacenados aquí, e eu realmente chamar incremento, que
agora é chamado coro -
Si, iso é me botando fóra aquí.
Entón, imos chamar este incremento.
E nós non sabemos o que esta función próximo vai ser.
Entón o que está realmente a suceder aquí en algún lugar no principal, eu teño un anaco de
memoria que almacena o número 1.
Cando eu chamo incremento, está a usar outro anaco de memoria, pero agora eu
ten a copia de 1.
Cando incrementar ese valor, este torna-se 2 - horrible escrito no
pantalla aquí.
Pero entón, o que pasa logo retorna incremento?
Esta memoria só queda trasladado ao seu sistema operativo, o que significa que todos os
que fixo non é nada útil.
O que foi orixinalmente contido no principal aínda é realmente alí.
>> Entón onde estamos indo con iso?
Ben, acontece que na memoria que ten esta de volta para atrás secuencia de
máis que pode pór cousas dentro
E ocorre que xa vimos algo que implica a colocación de
as cousas de volta para atrás, cara atrás, cara atrás.
¿Que é unha cadea, en base a unha semana e agora de dúas semanas?
Entón, é só unha colección de personaxes.
Entón non é que así como pode poñer números na memoria, do mesmo xeito que pode
poñer personaxes na memoria.
E cando comezamos a poñer personaxes na memoria de volta para atrás para volver ao
cara atrás, verifícase que o uso máis simple das cousas como un loop ou
un loop while, podemos iterar -
de esquerda a dereita sobre os carácteres dunha cadea -
e comezar Masaxes-os en personaxes completamente diferentes.
Un pode facer B. B pode facer C. Así que, finalmente, podemos tomar unha
Frase en inglés que realmente ten sentido e converter cada un dos
letras unha a unha, camiñando a través da memoria do noso ordenador para a esquerda
dereito á verdade cifrar.
>> Polo tanto, imos ter a nosa pausa de cinco minutos aquí, e cando volvemos, imos
iniciar este proceso de codificación de información.
>> Todo ben.
Entón, antes de mergullo en algúns cifrado e esas cousas chamadas de matrices, deixe-me
pausa para todas as preguntas, porque eu sinto como se eu realmente tipo de confusa algúns dos
estes temas.
Entón imos corrixir agora, se pudermos.
Entón, nós só conversas sobre valores de retorno.
Nós conversas sobre argumentos.
E falamos sobre esta noción, que nós imos voltar a nas próximas semanas
vir, ver a memoria como unha morea deles apilados
bandexas, por así dicir.
Desde abaixo, de tal forma que cada bandexa que será colocado na pila representa
unha función que está a ser chamado.
Algunha pregunta?
Así como sobre - déixeme tentar facer unha pregunta.
Eu manteño romper iso, pero agora é - vós xa todos vimos a cara do neno.
Entón, nós imos voltar a iso.
>> Entón deixe-me facer unha pregunta aquí.
Deixe-me simplificar iso volve ao que era antes de algúns dos nosos máis cedo Q & A.
E o feito de que o incremento ten paréntese aberto, número int, pechada
parénteses.
O que o número int representa?
[Inaudível]
DAVID J. Malan: Un argumento.
Ok, pero o que é un argumento?
[Inaudível]
DAVID J. Malan: Sentímolo, pero o que é iso?
Speaker 3: Algo que pasa dentro
DAVID J. Malan: Okay.
Entón, algo que pasa dentro
E, máis xeralmente, é só a entrada.
Se está escribindo unha función e finalidade desa función na vida é facer
algo un pouco diferente cada vez que usalo, entón a única forma de
que isto ocorre realmente parece ser o de proporcionar-lo con entrada de forma que
pode facer algo diferente que a entrada de cada vez.
>> Entón, ten que especificar dúas cousas cando leva unha función entradas.
Debe especificar o nome que quere dar para que a entrada, só para
súa propia conveniencia para que poida consultala-lo na función que
se está escribindo, como eu fixen aquí en liña 32.
Pero tamén precisa especificar o tipo porque C é unha linguaxe de programación
que só esixe
que se quere unha variable, ten que dicir ao ordenador o
tipo de datos que é,
en gran parte, para que saiba cantos bits para
reservar para esta variable.
Porque pode ser seis -
Sentímolo, iso non vai ser seis.
Pode ser 16.
Pode ser 8.
Pode ser de 32, ata 64.
Pero o ordenador precisa saber.
Agora, a int no lado esquerdo representa o que, por outra banda?
[Inaudível]
DAVID J. Malan: ¿Que é iso?
[Inaudível]
DAVID J. Malan: O tipo de función e, máis especificamente, o
tipo da súa saída.
Dereito.
Así, mentres que o único entre parénteses representa a súa entrada, se o houbera, o
cousa á esquerda representa a súa saída.
E, neste caso, o incremento aparentemente retorna un int.
E así int é o tipo de retorno desta función.
>> O que significa volver?
Literalmente, usa a palabra chave return.
E entón, se o que está volvendo para a dereita da palabra clave é unha
enteiro, entón iso é realmente consistente co que prometeron.
Non podería facer algo así -
Ola mundo, -
porque esa é unha cadea.
Obviamente, non é un número enteiro.
Así, en breve, a carga é realmente en nós, o programador, para ser específico como
ao que estamos volvendo e, a continuación, realmente ir sobre a devolver.
E despois de facer un pouco máis claro o contexto -
alí está el de novo.
O contexto -
gran sorpresa en só un momento.
O contexto aquí agora é que a memoria do ordenador e, de novo, unha
Gigabyte, dous gigabytes, o que sexa.
Quizais sexa máis.
Quizais sexa menos.
Pero o ordenador velo como tendo distintas seccións.
Algo vai alí en baixo.
Outra cousa vai alí enriba.
Cousas distintas vai no medio.
E hoxe, só comezar a contar esta historia.
>> Pero imos volver a ese tempo rematou.
Polo momento, a única lembranza que realmente importa é o segmento de texto
pois que só representa os ceros e uns
Clang que emite.
Entón, cando executar un comando no teclado como a.out, ou dobre
facer clic nun icono en Mac OS ou Windows, o programa está cargado dende o disco duro
dirixir na RAM.
E se está estatelou na parte superior da RAM do seu ordenador, por así dicir.
Agora, con todo, como o programa comeza a ser executado e principal é chamado no
programa que escribiu ou o programa Microsoft ou Apple escribiu, calquera dos seus
variables locais acaban alí no fondo da memoria do seu ordenador.
Pero se principal chámase outra función que si ten variables ou
argumentos, eles acaban por riba.
E se esa función chámase algo, eles acaban por riba dela,
enriba del, por riba del.
E só unha vez unha función de execución é feita é que a pila de taboleiros, así
para falar, comeza a estar máis e máis.
E iso é o que entón, en poucas palabras, explica por que, cando chamar cubo -
ou chamar incremento -
está pasando nunha copia do valor.
E o que iso significa pictoricamente é que está literalmente escrito o
número 1 na outra banda da memoria, cambiando de que 1 a 2, no caso de
incremento -
ou dun 8, no caso do cubo -
e, a continuación, que a memoria tirar fóra, logo que o incremento ou o cubo
función devolve.
>> Pregunta.
[Inaudível]
DAVID J. Malan: Onde - variables globais son almacenados en que é
actualmente chamado os datos inicializados ou datos non inicializados.
A diferenza é, se ten unha variable global, e lle atribúe
inmediatamente un valor co signo igual, el acaba na cima alí.
E se acaba de dicir int x coma e sen valor, acaba un pouco
inferior en RAM simplemente por convención.
Outras cuestións.
Todo ben.
>> Polo tanto, esta imaxe vai volver como temos máis poderoso co que podemos facer
co ordenador.
Pero, por agora, imos ter unha breve introdución á criptografía, un tipo específico de
cifrado que non resolve todos os problemas do mundo, pero non resolve
algúns deles.
Neste caso aquí, temos unha cousa chamada criptografía de clave secreta.
E cifrado de clave secreta, como o nome suxire, deriva a súa seguridade
a partir dun segredo.
Así, por exemplo, se está de volta na escola e está pasando unha
carta de amor pouco segredo para o neno ou a nena que está esmagando - se
quería pasar isto a través da audiencia, probablemente non ía escribir
tal nota en inglés ou calquera que sexa a súa lingua nativa e, en vez diso,
Pode criptografía-lo.
Ou pode só enviar-lles unha mensaxe de texto nestes días.
Pero realmente pode pasar-lles unha nota ao longo da clase.
E facelo de forma segura, de tal forma que os seus amigos e do profesor
non sei o que está escribindo, pode chegar a unha moi sinxelo
algoritmo -
mozo que pode ser -
só para embaralhar as palabras.
Entón, en vez de escribir un, podes escribir B. En vez de B, podes escribir
C. No canto de C, pode escribir D, e así por diante.
Ou pode vir con unha tradución máis sofisticado de cartas
de letras diferentes.
Pero o problema é o neno ou nena a quen está enviando esta nota que
saber algo.
Que é o que, obviamente?
Como, o que é o seu segredo.
Como, que é o que o mapeamento entre as e BS e Cs e Ds?
É só a adición de un, por así dicir, para cada unha das cartas para ir
A cara B, de B a C?
O que é máis complexa do que a?
Así, vostede ea súa paixón é preciso ter esa información en segredo.
Pero hai un tipo de catch-22 aquí.
Se esta é a primeira vez que está enviando esta carta de amor a través do
clase, como é que o neno ou a nena vai saber o que o segredo é?
Así clave secreta de cifrado non resolve todos os problemas do mundo.
E non hai, en realidade, unha relación que imos volver a dirección
final do semestre.
>> Do mesmo xeito, non teñen ningún de nós probablemente xa enviou un -
Do mesmo xeito, non a maioría de nós coñece a alguén que traballa, por exemplo, a
Amazon.com.
E, con todo, moitos de nós probablemente xa comprou cousas na Amazon.com.
E nós fomos ensino a supoñer que estes e-commerce
transaccións son seguras.
Non?
A URL probablemente di https.
Hai quizais un pouco parvo icona de cadeado en algún lugar.
Hai algún tipo de criptografía de protexer a súa información de tarxeta de crédito
entre vostede e Amazon.com.
E, con todo, a criptografía implica coñecer algún segredo, e aínda así eu non
Coñece alguén en Amazon, e eu certamente non dispostos calquera tipo de
segredo con alguén na Amazonia, como é o meu ordenador ou o meu navegador facendo iso?
Ben, acontece que hai outros tipos de criptografía de un total que resolven
este problema.
Pero por hoxe, imos nos centrarse na simple, onde pode organizar en
avanzar para saber algún segredo, como máis dun ou algún cartografía entre as e Bs
>> E o proceso de cifrado implica xeralmente a este.
Ten algún texto simple, representado aquí na esquerda.
Executa-lo a través de algún tipo de algoritmo ou procedemento
para cifrar.
Quizais sexa só un se fai B, B se fai C. E entón acabar con
texto cifrado.
Mentres tanto, unha vez que a súa paixón recibe a nota secreta, el ou ela ten para despois
decifra-lo por xeralmente revertendo ese algoritmo para obter
apoiar o texto simple.
Agora hai encarnações físicas deste.
Por exemplo, isto é un anel descodificador pouco segredo.
E este é un anel no sentido de que non hai dous mostradores aquí.
Na periferia fóra desta cousa, hai letras de A a Z,
aínda están en orde aleatoria.
E no interior, hai realmente algúns números, tales que, con esta
anel, pode converter o tipo de fóra, pero non dentro da, a fin de aliñar
números con letras.
E no clip que está a piques de ver - algúns dos cales pode ver 24/7
en torno á tempada de Nadal dun filme chamado Unha Historia de Nadal.
Vai ver que Ralphie pouco estaba tan ansioso para descubrir o que pequeno orfo
Mensaxe secreta de Annie foi a el que fora comunicado, creo que, no
forma de mensaxes numéricos nunha caixa de serie.
E tiña que acumular todas as tarxetas pequenos que viñeron
na caixa de cereal.
Tiña que envialos dentro
Tiña que volver o anel decodificar secreto, de modo que pode finalmente descubrir
o que é o mapeamento entre letras e números,
ou cartas e cartas.
Entón, eu darlle este pequeno clip da Historia de Nadal para motivar pset 2 e
nosa discusión, nun momento, de matrices.
Polo tanto, temos aquí Ralphie.
>> [REPRODUCIÓN]
-Ser-lo coñecer a toda a xente que Ralph Parker é nomeado
membro da Orphan Annie Pouco Secret Circle e ten dereito a todos
os honores e beneficios que se producen ao mesmo.
-Asinado, Little Orphan Annie.
Referendado, Pierre André!
En pintura!
Honores e beneficios, xa á idade de nove.
Imos, imos adiante.
Eu non teño de jazz que preto de contrabandistas e piratas.
Escoita-noite de mañá para a aventura de conclusión do The Black
Barco de pirata.
Agora é hora de mensaxe secreta de Annie por vostedes, membros
do Círculo Secreto.
Lembre, os nenos, só membros do segredo Circle Annie pode descodificar
Mensaxe secreta de Annie.
Lembre, Annie está dependendo de ti.
Define as súas patas para B2.
Aquí é a mensaxe.
12, 11 -
-Eu estou na miña primeira reunión secreta.
-14, 11, 18, 16 -
-Pierre estaba noite gran voz.
Eu podería dicir que a mensaxe desta noite era realmente importante.
-3, 25.
Esta é unha mensaxe de Annie se.
Lembre, non diga a ninguén.
-90 Segundos despois, eu estou na sala só na casa onde un neno de nove anos
podería sentar privacidade e desencriptación.
Aha, B. Eu fun para o outro.
E. A primeira palabra é ser.
S. Estaba vindo máis fácil agora.
U.
-Oh, imos alí, Ralphie.
Eu teño que ir.
-Eu vou estar ben para abaixo, ma.
-Gee Whiz.
-T, O. Asegúrese se.
Asegúrese de que?
Cal foi Little Orphan Annie está intentando dicir?
Asegúrese de que?
-Ralphie!
Randy ten que ir.
Quere facer o favor de saír?
-Todo ben, ma.
Eu estarei fóra.
-Eu estaba quedando máis preto agora.
A tensión era terrible.
O que foi?
O destino do planeta pode estar en equilibrio.
-Ralphie!
Randy ten que ir.
-Eu vou estar ben para fóra, polo amor de Deus.
-A nosa, case alí.
Meus dedos voaron.
Miña mente era unha trampa de aceiro.
Todos os poros vibrar.
Era case claro.
Si, si, si, si.
-Asegúrese de beber o seu Ovomaltine.
Ovomaltine?
Un comercial miserable?
Fillo de puta.
[REPRODUCIÓN FIN]
>> DAVID J. Malan: Polo tanto, temos de cifrado.
Así como un ordenador pode ir sobre a implementación ou
representando cousas como esta?
Ben, necesitamos unha forma de nos expresar un pouco máis flexible do que
nosas variables, ata agora, teñen permitido.
Tivemos ints.
Tivemos caracteres.
Tivemos coches alegóricos e dobres e algúns outros.
Pero esas son pezas individuais de memoria que realmente non nos permiten
expresar cousas como palabras e frases e oracións.
En realidade, nós temos chamado cordas tales cousas.
Pero prometeu que iso é realmente só unha simplificación na CS50
biblioteca que estamos pretendendo pelar.
>> E así imos comezar a facelo aquí.
Deixe-me ir adiante e abrir un ficheiro -
todos estes arquivos están dispoñibles on-line como de costume -
array.c chamado para resolver un problema relacionado con cordas, pero que traza un
foto aquí de como podemos utilizar unha cousa chamada matriz.
Unha matriz é un tipo de datos.
É un tipo de variable, de tipo, que ten varios tipos de datos máis pequenos
dentro dela de costas cara atrás, cara atrás.
Así, por exemplo, se quere escribir un pequeno programa que lle dá o seu
cuestionario media para un curso como 50, que ten dúas probas, podería moi facilmente
escribir este programa - baseado mesmo en algúns dos materiais da semana pasada -
usando GetInt e un par de variables.
Int quiz1, int quiz2, e é moi sinxelo.
É quizais 10, 20 liñas de código, max, para aplicar un programa que pide ao
usuario para dúas puntuacións do cuestionario e calcúlase a súa media, engadindo-
en conxunto, dividíndose en dous, e logo a impresión dos resultados.
Nós probablemente podería facelo moi rapidamente agora, despois de
un determinado número de minutos.
>> Pero o problema é que supoño que 50 tiña tres ou catro probas.
Supoña que vostede quería usar o mesmo programa para unha clase que tivo
probas semanalmente.
Debería unha clase que ten probas semanalmente.
Se non hai como 16 ou máis semanas, nun semestre, agora ten 16 variables -
int quiz1, int quiz2, int quiz3, int quiz4.
Así que comezar a ver esa redundancia, está copiando e colando
de código, debe comezar a facer desexa que houbese un xeito mellor.
E, por sorte, porque de matrices, non existe.
Entón, imos facelo.
En primeiro lugar, deixe-me presentar unha cousa moi simple que non usei ata agora,
pero vai ver que, en ocasións, en código.
Isto é o que é xeralmente chamado de unha constante.
Entón, é unha constante no sentido de que este valor nunca cambia.
A convención humana ao crear unha constante é usar todo o capital
letras, só para que realmente destaca no seu código.
E a palabra clave que usa en C # é definir.
Entón, se di # define, entón, un espazo, entón a palabra que quere empregar para
nome da constante, e, a continuación, o valor da constante.
Entón aviso, iso é distinto de asignar algo a unha variable.
Non hai signo igual.
Non hai ningún punto e coma.
Isto é o que é xeralmente coñecido como un pre-procesador de directiva, pero sobre
que noutro momento.
>> De momento, iso crea un valor inmutable chamado cuestionarios cuxo real
valor numérico é 2.
Entón, en calquera lugar que ve probas, cuestionarios, probas ao longo deste arquivo, que é
só o número 2.
Agora, se eu ollar para inicio Agora, imos ver como funciona isto.
Na primeira, el parece un pouco enigmática.
Pero é todo a partir dunha semana.
Peza ao usuario notas.
Como podemos facer iso?
Ben, en liña 22 -
Esta é realmente a parte suculenta -
Eu declaro unha boia, pero non só un único flotador.
Estou declarando, en vez diso, unha matriz de valores de punto flotante.
Esta variable vai ser chamado de notas, como implicado aquí.
Pero a única peza de nova sintaxe, entón son estes corchetes, o feito
que eu dixen notas float e, a continuación, soporte aberto e, a continuación, un número.
Aviso previo, se este é unha constante, é dicir, tal como fixemos iso.
Isto significa ordenador hey, dáme dous coches alegóricos, e imos chamar colectivamente
los graos.
Isto está en contraste con un proceso moito máis tediosas como este.
Classe1 flotar, flotar grade2, e así por diante.
Así, unha matriz que nos permite implementar esta idea, pero moito menos messily, en
de xeito que podemos escribir unha liña de código, en vez de, digamos, 16 a un 16
semestre semana.
Entón, eu non quería ríxido código 2 porque se pensar sobre iso agora
loxicamente - supoño que o próximo ano CS50 cambios 3 quizzes vez.
E eu tiña o número 2 aquí.
Eu tiven o número 2 aquí.
Tórnase moi tedioso e moi fácil de romper e cambiar accidentalmente
un valor para 3 e perder algún outro valor de 2.
Entón, eu estou indo a lugar abstracto iso adiante e utilizar esa constante que, como o seu
nome suxire, nunca cambia.
E agora, non importa se temos diferentes cuestionarios este ano ou o próximo, eu
só temos que cambiar isto nun só lugar, aquí enriba.
>> Entón, iso é todo o que é constante.
Mentres tanto, o novo recurso conceptual que dunha matriz.
Así, os corchetes me dar esta flota moitos e me deixa colectivamente
chamalos de notas aquí.
Entón agora imos ver o que eu vou facer.
Aquí, na liña 24 é o inicio dun lazo.
Isto é realmente nada extravagante.
É só usar cuestionarios en vez de un número codificado.
Pero non hai nada intelectualmente diferente alí desde a semana pasada.
Este é só printf.
Entón printf ("quiz número% d de% d"), porque eu só quero imprimir me dar cuestionario
un número de dous e, a continuación, dous a dous.
Polo tanto, esta é puramente unha cousa estética.
Pero a parte interesante é agora na liña 27.
Co fin de cubrir un dos dous marcadores de posición cun punto flotante
valor, que novamente usar corchetes.
Neste caso, eu estou usando i porque este loop comezou con i igualando
que o valor que, ao parecer?
0.
>> Así, na primeira iteração do loop, é coma se eu
escribiu isto no código.
Pero na segunda iteração do loop, é coma se eu
escribiu isto no meu código.
Pero o feito de que eu estou usando unha variable é perfecto, porque, como o nome
suxire, está variando o seu valor cada iteração.
Entón, eu estou cubrindo esta matriz un punto de cada vez.
O que esta matriz parece?
Ben, a razón Eu tirei este rectángulo super sinxelo na pantalla aquí
antes era por este motivo.
Unha matriz é só unha peza de memoria seguido por outro anaco de memoria,
seguido por outro bloque de memoria, e así por diante.
Entón, se a miña matriz é de tamaño 2, neste caso aquí, todo o que eu estaría facendo por
escribindo na puntuación meus quiz, como aquí.
Eu teño 100 en un regalo.
E entón eu teño un 99 en un regalo.
Entón, esa memoria non pode ser usado incluso porque eu só preguntei o
ordenador para unha matriz de tamaño 2.
Estas prazas aínda están alí.
Non?
Aínda ten dous gigabytes de memoria RAM, aínda se está só
pedindo dous coches alegóricos.
Así, a idea detrás de matrices é que o ordenador só ten un anaco da memoria
e despois reparte pequenos anacos de costas cara atrás, cara atrás.
E para que é todo unha matriz é.
É unha peza contiguo de memoria, dentro do cal pode pór as cousas.
>> Agora isto acontecer para despois facer só algúns aritmética chat.
Se rolar por aquí, este é o lugar onde eu entón iterar sobre o array.
Eu veño co sumatorio de todos os valores na matriz.
E entón eu uso a función round aquí para realmente facer o
Resumindo dividido por probas.
Pero deixe-me acenar a miña man no que, como especie de aritmética suficiente por agora.
Pero todo o que está facendo para min, en última análise é o cálculo dunha media.
Entón, primeira proba máis segundo cuestionario, dividido por 2, e logo imprimir
como un int.
>> Pero imos transición agora un exemplo diferente, chamado string1,
que pinta un cadro similar, pero usando cordas.
Deixe-me ir adiante e simplificar este só por un momento.
E perdoa o retroceso para agora.
Obsérvese na liña 19 deste exemplo, eu recibín unha cadea de usuario.
Pero teña en conta o que eu estou facendo o próximo liñas de 22 en diante.
En realidade, estou repetindo a partir de i-se - e este é un novo truco -
strlen lonxitude da corda,.
Esta é unha función que vén co C que se pasar unha corda, el di
cantos personaxes están en que secuencia.
Isto é todo.
O feito de que é strlen en vez de lonxitude da corda é só porque é
máis sucinta.
30 anos, as persoas gustaban de escribir cousas da forma máis sucinta posible.
Entón, nós temos mantido esta convención aquí.
i + + significa só incrementar i en cada iteração.
E agora entender iso, o que é realmente interesante.
Así, na liña 24, digo ordenador, dáme un personaxe, oito
bits, e chamalo c.
Pero o que é iso no lado dereito dicindo?
En inglés, o que iso supón?
[Inaudível]
DAVID J. Malan: Exactamente.
Dáme o primeiro carácter da matriz.
Ou, máis xeralmente, dáme o carácter i-th na matriz.
E entender que é importante agora que, como científicos da computación, estamos, en realidade,
contador de 0.
Non ten criterio agora para comezar a facer iso.
Agora tes que comportarse de acordo coas expectativas do equipo e
contar a partir de cero, porque [0] vai ser o primeiro
carácter nunha cadea.
[1] vai ser o segundo.
[2] vai ser o terceiro, e así por diante.
Polo tanto, este programa, se recompila-lo - é dicir, de novo, string1.
>> Entón faga string1.
E agora eu corro string1 na miña xanela de terminal.
El está esperando por entrada, entón eu vou escribir, por exemplo, David.
Intro.
E agora ela imprime DAVID todo en liñas diferentes, porque
entender o que estou facendo.
Estou imprimindo un carácter de cada vez.
Agora, non vou entrar en detalles hoxe sobre iso.
Pero eu apaguei hai pouco esta verificación aquí.
Acontece que o usuario está comportándose mal, contraditorio, ou só
confuso, realmente pode deixar de dar unha secuencia de tempo.
Se bater na tecla equivocada no teclado, pode dar
ningunha secuencia en todo.
Ou se é malicioso, podes probar pegar no valor dun gigabyte dun
Ensaio para cubrir esa secuencia.
E se o ordenador ficar sen memoria, verifícase que imos
para volver este valor especial chamado null.
Entón, por agora, só sei que hai ese valor especial chamado nula de que
nos permitirá comprobar cando estamos fóra de memoria, entre outras cousas.
>> Pero se eu abrir agora string2, notar unha diferenza aquí.
Teña en conta unha diferenza aquí con string2.
Con string2, este loop é un pouco diferente.
Deixe-me borrar os nulos, para que poidamos falar sobre iso outra hora.
Pero o que é diferente sobre o lazo se esta vez?
E podo volver para o exemplo anterior.
Entón esta é a versión dous.
Esta é unha versión.
Un, dous, un, dous.
Así, a chamada strlen é onde?
É a primeira parte do loop.
Todos os pensamentos acerca de porque eu estou facendo isto?
Si
[Inaudível]
DAVID J. Malan: Entón non chamar a función en cada momento.
Exactamente.
Lembre-se de lazos que son super sinxelo, xa que tipo de
comprender que esta é a inicialización, o
condición, e da actualización.
O problema é que a condición ocorre en cada
iteração do loop.
E así, neste exemplo aquí, o que é malo sobre o feito
que esta é a miña condición?
Está chamando strlen novo e de novo e de novo.
Pero unha vez que eu escriba en David, a lonxitude da corda que é cinco.
E iso non vai cambiar en cada iteração do loop, porque o
cadea é aínda D-A-V-I-D. Polo tanto, esta é unha información que vai facer un
idea cada vez máis importante coñecida como unha decisión de proxecto, onde - só non
facer o ordenador facer un traballo innecesario.
>> Agora, como unha previa pset 2, pset 2 na edición estándar é
vai desafia-lo para realmente implementar un número de cifras, algúns
número de algoritmos de cifrado, de modo que pode cifrar e descifrar
mensaxes secretas, así como o Ralphie un alí decodificar.
Na edición de hacker de pset 2, imos ir un pouco máis lonxe.
Nós imos entregar-lle un ficheiro dun sistema informático que contén un real
chea de nomes de usuario e contrasinais cifradas reais, eo desafío
para a edición de hacker vai ser para romper os contrasinais e figura
o que o cifrado ou o segredo foi usado para realmente
xerar as claves.
E nós imos facelo empregando un novo recurso aquí C que eu vou dar
só unha demo de, coñecido como liña de comando argumentos.
>> Entón non é que, como algúns de vostedes poden ver na sección ou nos libros de texto,
Inicio nin sempre ten que ser nula entre parénteses.
Acontece que principal tamén pode ser escrito así, con dous argumentos,
argc e argv, onde argc é o número de palabras que escribas logo
o nome do programa na liña de comandos.
E argv son as palabras reais.
E, como os corchetes alí suxerir, argv é, aparentemente, un array.
Vai ser unha secuencia, tras unha serie despois dunha serie na memoria.
Entón, o que nós imos ser capaces de facer, comezando con pset 2, é
algo así.
Se eu fai argv1, que é un exemplo que vai voltar a luns, e realizar
ela, entenderá que non parece facer nada aínda.
El só imprime o seu propio nome.
Pero se eu dixer adeus clase, aviso que este programa aparentemente itera
sobre cada unha das palabras que foron escritas no prompt.
E os medios polos que imos ter acceso a palabras que o usuario ten
ingresaran no prompt é cambiando principal, a partir deste fin de semana, a partir de int
main (void) para int main (argc, argv).
E así vai nacer argumentos de liña de comandos.
E unha vez que realmente sofisticado con iso, vai ser capaz de escribir
programas realmente trippy, como este aquí, que vai enriba e alén
algunhas das características que temos feito ata agora, pero todos moi poderoso.
>> Entón, imos deixar isto con iso na pantalla.
E nós imos velo o luns.