Tip:
Highlight text to annotate it
X
>> COLUMNA 1: Hola a todos.
Nós imos comezar.
Creo que a xente aínda están indo á filtrado dentro
Pero, en interese de tempo, para que poidamos obter vostedes aquí a tempo,
imos comezar.
Entón Benvido ao CS50 quiz 0 avaliación.
Para aqueles de vostedes que aínda non entendeu con todo, ten unha pregunta na Mércores.
Woo-hoo.
>> Se aínda non comezou a estudar aínda ou aínda non se deron conta que isto existe aínda,
quizzes pasadas e toda a información sobre seu cuestionario están no cs50.net/quizzes.
Hai algunhas cousas moi boas por alí, quizzes últimos dos últimos 10
anos, así como información sobre este quiz e temas
que será cuberta.
Entón, imos comezar.
>> Entón vostedes deben lembrar, o primeiro día de clase David tiña estas lámpadas por diante.
Entón, basicamente, todo o que pasa baixo o capó dun ordenador é
feito en binario.
Binario significa o que soa como, 0 e 1 do.
Ten dous valores se pode representar.
>> Así como o primeiro día de sección cando David acendeu unha luz
lámpada para representar diante, ou 1, o noso ordenador entende como binario 0 e
1 de, activado ou desactivado.
Nocións básicas de binario.
Cada sitio é representado na base dúas.
Entón engade 2 a 0 ao 1 a 2 por todo o camiño cara arriba.
>> Para calcular o binario é decimal, só tes que seguir esta ecuación
escriba algo.
Se tes un 1 en calquera destes lugares, vostede multiplicala lo por todo o que
basea-lo está, engadir lo para arriba, e comeza a decimal.
Entón é así que conta a 5 en binario.
Así como o que estabamos facendo o último slide, iso é como se fose
representar 1 a 5.
>> Do mesmo xeito, así como pode engadir e restar en decimal ou base 10, ou
realmente algunha base, en pode engadir e restar en binario.
Exactamente o que pode esperar cando engadir os dous para arriba, de ser igual maior
que 1, leva a 1, facelo un 0, e facer a adición desa forma, só
como sería de esperar con regulares decimal ou calquera outra base.
Legal.
>> Entón, como dixen antes, todo o que continúa baixo a capa do noso ordenador
faise en 0 e 1, ou de binario.
Entón, como imos expresar, por exemplo, letras ou números ou caracteres?
E a resposta a iso é ASCII.
>> ASCII é un mapeamento entre os caracteres que normalmente ve na
Idioma inglés como A, B de, Cs, subliñado, trazos, e
algo así.
E mapea que para un valor ASCII.
Un valor ASCII é só un número que pode ser entendido polo computador.
E, así como pode facer a adición e subtracción con números, pode facer
los con valores ASCII.
>> Polo tanto, neste exemplo, o que iso vai imprimir?
Si, por iso só un espazo espazo espazo B C D. Onde meu rato ir?
Teña en conta que pode definir un int en 65.
E cando imprime isto usando por cento C, que vai interpretar isto como un
carácter e imprimirá A.
>> Do mesmo xeito, pode declarar el como un char.
E cando imprimir lo usando por cento C, que vai interpretar isto como
por cento D. E, así como pode engadir un número, pode engadir personaxes son
Os valores ASCII, neste caso.
>> Entón, algo punteiro para todos.
5, como unha cadea, non en realidade, ser igual a 5.
Entón, como podemos converter o corda 5 ao enteiro 5?
Algunha idea?
É.
>> Entón, se temos 5 como unha cadea, que pode restar 0.
E iso vai dar 5.
E do mesmo xeito, se temos 5 como un integer, engadir que para a secuencia 0.
E iso nos dá a corda 5.
Legal.
>> Agora, lembre-se de volta a ensinar un onde falamos de algoritmos.
Entón, como é que imos realmente quere un ordenador para facer cousas interesantes?
Vostede sabe, só sumar e restar números e imprimir cousas para fóra non é
que emocionante.
Normalmente, queremos que o noso ordenador para realizar algún tipo de algoritmo.
Algo un pouco máis complexa que só aritmética simple.
>> Un algoritmo é só un paso a paso conxunto de instrucións de como realizar
unha determinada tarefa -
así como unha receita.
Debe lembrar do primeiro día de clase onde David tiña nos contar unha sala
de persoas e cantas persoas estaban na sala.
Pode ser usado para a conta unha por unha.
1, 2, 3, 4.
Neste caso, un algoritmo de tempo lineal.
>> Pero David introduciu un algoritmo para contar as persoas na sala
onde todo o mundo se levanta, vostede di que o seu número a outra persoa, engadir que
número superior, e unha persoa se senta.
E vostede repetir iso.
Isto é un tipo de algoritmo.
Podemos analizar como un eficiente algoritmo baséase no que é tempo de execución.
Pero imos falar un pouco máis sobre iso máis tarde.
>> Entón, todos os algoritmos tamén pode ser escritos en pseudocódigo.
Pseudocódigo é só un inglés como sintaxe utilizada para representar
unha linguaxe de programación.
Por exemplo, se quixésemos pedir un usuario adiviñar o meu número favorito, nós
pode ter pseudocódigo como tal.
>> Sexa un usuario adiviñar.
O palpite está correcto, diga-lles están correctos, senón dicirlles
eles non son correctos.
Pseudocódigo e é unha forma de maneira doada representando unha idea ou un algoritmo.
Entón agora podemos querer realmente escribir esta na linguaxe que o ordenador
pode comprender.
Entón, poderíamos escribir noso pseudocódigo e interpretar que o código fonte.
>> Ata agora, o código fonte deben unirse para unha determinada sintaxe
unha linguaxe de programación.
E ata agora, no CS50, temos usado principalmente c.
Polo tanto, este pode ser un código fonte para c.
Máis tarde o curso, noite vén Contactar con outra programación
linguaxes como PHP.
Ou se aínda tomar outras clases, se pode facer Java, Python, ou mesmo OCML.
Pero, na nosa linguaxe de programación C, que é como podemos escribir o código fonte
o algoritmo de pseudocódigo Eu só descrito anteriormente.
>> Entón, como é que o ordenador realmente entender iso?
Como dixo antes, el só realmente entende ceros e uns.
Entón como é que comeza a partir do tipo de letra código de algo que se pode
entendido?
Ben, nós temos algo chamado un compilador.
>> Se se lembrar de volta a maioría do seu Serie de exercicios, que tivo algún tipo de programa
escrito nun arquivo de punto c.
E entón ten que escribir make.
Entón, o que é facer facer?
>> Podes escribir make para compilar o seu programa porque alguén -
quen escribiu o seu conxunto de p; probablemente David -
creou un ficheiro de make.
E que di saber facer para realizar o seu compilador, chamado bumbum, que a vontade
logo compilar o código fonte para obxecto de código, que é ceros e uns
que o ordenador entende.
Pero un pouco máis tarde, iremos máis en profundidade sobre compiladores.
>> Entón lembro pset 0, onde - si, Ten unha pregunta?
>> Audiencia: [inaudível]?
>> COLUMNA 1: Si
Eu creo que realmente debe ser en liña.
É.
>> Audiencia: É como o [inaudível]?
>> COLUMNA 1: Non é.
O son en cs50.net/quizzes.
>> Audiencia: Corte quizzes, barra de 2013, cortar 0, e só facer clic
quizzes 2013 e proba 0, revisar os diapositivas de sección.
>> COLUMNA 1: Si, por iso, se vostedes queren puxa-lo para arriba e mirar para el no seu
propio ordenador, todo ben tamén.
Diga iso de novo.
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, [inaudível] é a variable dummy.
Ah, si?
>> Audiencia: [inaudível]?
>> Speaker 1: Non, folgas non están no exame.
Sentímolo, a súa pregunta foi, foi folgas no exame.
E non é.
Entón pset 0, vostedes deben ter todos aplicado algo usando cero.
E aprendemos algunha programación básica bloques de construción usando cero.
>> Entón, imos dar un ollo a algúns destes bloques de construción
que compoñen un programa.
O primeiro é a expresión booleana.
As expresións booleanas son queridos e 0s ou calquera cousa que ten
dous valores posibles.
Neste caso, verdadeiro ou falso, activado ou desactivado, e si ou non.
Un exemplo de un método simple, moi sinxelo, programa que emprega un valor booleano
expresión aquí.
>> Entón, para expresións booleanas para ser útil, temos operadores booleanos.
Estes son os operadores que poden ser utilizados para comparar os valores determinados.
Entón, temos ou non e igual, menos ou igual a, maior que ou
igual a, e menos de ou superior.
Pero estes operadores non son moi útiles a non ser que poidamos combina-los en
condicións.
>> Entón vostedes deben lembrar de cero e para a súa p define que
tiña condicións.
Son, esencialmente, como garfos a lóxica do seu programa que
executa consoante unha condición for satisfeita.
Polo tanto, unha das condicións que tiñamos usado moitas veces neste curso é o
if, else, as condicións, e outra persoa.
>> Aquí está un exemplo de como que pode usar isto.
Alguén sabe a diferenza entre só usando comandos if todo
o camiño versos if, else, se, e outra cousa combinada?
Si?
>> Audiencia: [inaudível].
>> COLUMNA 1: Exactamente.
Entón, se eu tivese se todo o camiño ata este forma, mesmo se esa condición retorno
realidade, aínda seguirá probando os dous seguintes.
Considerando que, con unha máis-se, unha persoa declaración, o que retorna true,
os outros non son examinados.
Calquera dúbida sobre iso?
Legal.
>> Entón usa un else if-doutra declaración, se sabe que só pode
ser un deses casos.
Entón, nós sabemos que x é menor que 0, é definitivamente non será
maior que 0.
>> Logo, outro bloque de construción que aprendemos son loops.
Temos tres tipos de loops.
Para loops, mentres loops, e facer mentres loops.
E, xeralmente, cando se senta para escribir algo, ten que decidir
cal dos tres quere usar.
Entón, como imos decidir cal deles?
>> Usamos xeralmente un loop for, si sabemos cantas veces queremos facer unha iteración
por algo ou cantas veces queremos realizar unha tarefa.
Usamos loops while se necesitamos algunha condición para ser verdade para manter en funcionamento.
E usamos facer mentres moi semellante ao tempo, pero queremos que o noso código sexa executado en
polo menos unha vez.
>> Polo tanto, agora, o que está no facer a vontade Sempre executado polo menos unha vez.
Considerando que, co tempo, el pode non funcionar en todos, se o
condición non é satisfeita.
Calquera dúbida con isto?
>> Así, a estrutura dun loop for.
Vós xa deben ter visto iso.
Vostede arrinque-lo.
Ten algún tipo de condición.
Así, por exemplo, podemos arrincar como para i é igual a 0.
i é inferior a 10.
E i + +.
Un moi simple que fixemos.
>> Para un loop while, do mesmo xeito, ten ter algún tipo de arranque,
algún tipo de condición, e algún tipo de actualización.
Así, podemos aplicar o noso loop for tamén como un loop while usar iso.
E do mesmo xeito con un loop Do While, poderemos ter algunha arranque,
realizar algo, actualiza-lo, e a continuación, comprobar a condición.
>> Entón agora funcións.
Poñemos todo xunto.
Podemos querer escribir algunha tipo de función.
Función comúns que pode Xa vimos é o principal.
Principal é unha función.
Ten un tipo de retorno, int.
Ten un nome de función, a principal.
E ten argumentos, argc e argv.
Así principal é só unha función.
>> Outras funcións que pode ter usado, printf - printf é unha función -
GetInt, toupper.
Pero estes ocorrer de ser aplicado por nós
algún tipo de biblioteca.
Se vós me lembro ata esta biblioteca CS50.h ou o
biblioteca estándar de E / S.
Si, cuestionar?
>> Audiencia: É inherente principal só en c?
Será que só unha especie de [inaudível]?
>> COLUMNA 1: A cuestión é se principal é inherente c.
E si, todas as funcións teñen unha función principal.
É unha especie de necesario para o ordenador para saber por onde comezar
execución do código.
>> Audiencia: Entón non [inaudível]?
>> COLUMNA 1: Non
Algunha pregunta?
Legal.
Entón, así como pode usar unha función que está escrito para ti, tamén se pode
escribir a súa propia función.
Esta é unha función que alguén pode escribir para calcular o volume
en q, por exemplo.
Hai un tipo de retorno aquí, neste caso int, o noso nome ea nosa función q
lista de parámetros.
>> E teña en conta que ten que escribir os datos tipo do parámetro que desexe
usar, ou entón a función non fai saber que tipo de
parámetro que debe ser aceptada.
Entón, neste caso, queremos un enteiro como a entrada.
Entón, por que poderiamos querer utilizar as funcións?
>> Primeiro de todo, gran para organización.
Eles axudan a romper o seu código en anacos máis organizado e facer
máis fácil de ler.
Simplificación.
Iso é bo para o proxecto.
Cando estás lendo unha peza de código ea función principal é, en realidade,
moi longo, pode ser máis difícil de razoar sobre o que está a suceder.
Entón, se división la en funcións, quizais sexa máis fácil de ler.
E reutilización-capacidade.
Se tes un anaco de código que se está a chamado ou executado varias veces,
en vez de ter que volver escribir este código 10 veces na súa función principal, pode
quere reutiliza-lo.
E, a continuación, cada vez que precisa para usar esta peza de código, chamar a función.
>> Entón, agora, se nos lembrar de volta a cero, Tamén falou sobre algúns conceptos,
unha das cales é unha rosca.
Tema é o concepto de múltiplo secuencias de código
executando á vez.
Entón, creo que volta a unha onde David tiña día Vostedes contan fóra do número de
persoas na sala.
>> En esencia, o que estaba a suceder en todo é de vostedes estaban
execución segmentos separados.
E eses temas foron reunindo para obter algún tipo de resposta.
Do mesmo xeito, en perigo, cando ten varios sprites, pode
ten un gato e un can.
E eles serían simultaneamente executando os seus propios scripts.
Isto é un exemplo de segmentación.
>> E o outro concepto que foi introducida en cero era eventos.
E os eventos cando varias partes do o seu código de comunicarse uns cos outros.
En perigo, iso foi cando usou o transmitido control eo Cando
Recibir bloques.
>> E tamén, o conxunto de problemas 4 vimos un pouco de eventos tamén.
Vostedes poderían usar a biblioteca GEvent.
E non era unha función waitForClick en que estaba esperando
para que o usuario prema.
E o seu click, neste caso, sería o evento e esperar por prema é o seu
manipulador de eventos.
>> E tamén, ao longo da súa execución Serie de exercicios e traballando nos seus Serie de exercicios, vostede
pode entrar en contacto con algúns destes comandos.
Isto é o que escribiu no seu fiestra de terminal ou calquera que sexa a xanela
que aparece na súa edición para g, esencialmente, navegar no seu ordenador.
>> Así, por exemplo, LS lista o contido dun directorio.
Fai directorio crea un novo cartafol.
CD, cambie o directorio.
RM, eliminar exclúe un ficheiro ou algún directorio.
E, a continuación, eliminar o directorio elimina un directorio.
>> Audiencia: [inaudível]?
>> COLUMNA 1: Si, claro.
Sentímolo, a pregunta era se suxiro poñer este
sobre a folla de fraude.
Podería axudar.
Se ten espazo, pode poñelas.
Tamén é só xeralmente bo o suficiente para recordar, porque cando usalo
pode querer só ter memorizado.
Isto vai facer a súa vida moito máis fácil.
Será que eu responder a túa pregunta?
>> Entón, agora, nós falamos un pouco brevemente sobre bibliotecas.
Pero os dous principais que fomos usando ata agora en curso
E / S estándar e CS50.
Que tipo de cousas están incluídas na biblioteca de E / S por defecto?
>> Si, ata agora usamos printf.
En CS50, usan GetInt e GetString.
E a secuencia de tipo de datos tamén acontece sendo declarado neste biblioteca CS50.
Imos falar un pouco máis en profundidade sobre como as bibliotecas funcionan e como
interactuar co resto do seu código.
Pero estas son as dúas principais que nós, entrar en contacto coa medida en
o curso.
>> Tipos.
Estes son bos para lembrar o que cada tipo é representado por ou como
moitos bytes de cada tipo require -
int, 4 bytes; char, 1 byte.
Float é de 4 bytes.
¿Que é un dobre?
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, entón un float pero o dobre do tamaño.
Que tal un longo?
>> Audiencia: [inaudível].
>> COLUMNA 1: Aceptar.
¿Que é un tempo?
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, dobrar un int.
Si
>> Audiencia: [inaudível].
>> COLUMNA 1: Long [inaudível].
E despois dun longo tempo é o dobre diso.
>> Audiencia: Non, non.
Unha longa é só un int.
Depende da arquitectura antes de que o [inaudível]
int e teñen o mesmo tamaño.
[Inaudível].
>> COLUMNA 1: Entón, unha longa e un int son os mesmos.
E entón, un longo é o dobre do int.
Legal.
E entón, cal é o último tipo?
>> Audiencia: Pointer.
>> COLUMNA 1: Si, así aprendemos un pouco sobre punteiros.
E, con independencia do que un punteiro é apuntando cara - que podería ser unha estrela de char
ou unha estrela int -
sempre 4 bytes para un punteiro.
Preguntas sobre iso?
Si?
>> Audiencia: [inaudível]?
>> COLUMNA 1: Entón, un longo e un int son mesmo neste aparello CS50.
>> Audiencia: O aparello está completamente intercambiables.
>> COLUMNA 1: Yeah.
Entón un longo, longo é o dobre dun int.
>> Audiencia: Este é o 32 bits?
>> COLUMNA 1: 32 bits, si.
>> Audiencia: Entón, [inaudível]?
>> COLUMNA 1: Si, se iso non acontecer explicitamente dicir,
debe asumir un pouco 32.
>> Audiencia: El diría algo como asumindo unha
arquitectura como o aparello.
Para 64 bits, as únicas cousas que cambio son longs e punteiros.
Ambos [inaudível].
>> COLUMNA 1: Si?
>> Audiencia: Pregunta.
Así, nun das probas prácticos, el pregunta sobre un unsigned int.
Entón, como iso sería determinado dende un int [inaudível]?
>> COLUMNA 1: Un unsigned en é tamén de 4 bytes.
Pero o que é diferente sobre un asinado int e un unsigned int?
>> Audiencia: [inaudível].
>> COLUMNA 1: Certo.
Pódese representar valores negativos.
Pero como facelo?
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, el salva unha bit para representar o sinal.
A sinatura ten algo que representa o sinal.
E non asinado só se todos os aspectos positivos.
>> Audiencia: Aceptar.
Entón di que é un dobre dúas veces o tamaño dun flotador?
>> COLUMNA 1: Dobre é dúas veces o tamaño dun flotador, si.
>> Audiencia: Como é que un punteiro para un longo [inaudível]?
>> COLUMNA 1: Entón a pregunta é como é que o punteiro para un longo, longo -
como é que só catro bytes cando un longo seus 8 bytes.
Entón recorda que é un punteiro, esencialmente, polo valor base moi.
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, entón un punteiro é só un lugar de memoria.
Por iso, non importa o que de espazo ese punteiro está apuntando.
El só precisa de 4 bytes para seguir de que a localización de memoria.
Algunha pregunta?
Legal.
>> Así, a última cousa que eu teño é a saída estándar.
Debe usalos con frecuencia o suficiente para que poida lembrar.
Pero iso é cando usamos printf, por exemplo.
E nós temos eses espazos reservados que foron chamados de códigos de formato.
>> Entón por cento c char, i por cento a int, e tamén podemos utilizar por cento d.
É o mesmo.
Pero, en xeral, na que CS50 proba a usar por cento i.
Porcentaxe f para float.
Ld por cento por moi longo e por cento sa cadea.
>> Do mesmo xeito, temos que chegou a utilizar algúns desas secuencias de escape.
Por exemplo, barra invertida n para nova liña.
Este é só para cando está formateo o seu código para imprimir f.
Si?
>> Audiencia: Cal é por cento para d?
>> COLUMNA 1: Entón a pregunta é o que se por cento para d?
Porcentaxe d é a Ints.
Porcentaxe d e i por cento son os mesmos.
>> Audiencia: Cal é a diferenza entre barra invertida n e barra invertida r?
>> COLUMNA 1: Entón a pregunta é, cal é o diferenza entre reacción e n
reacción r?
Creo que é barra invertida r -
>> Audiencia: Entón barra invertida r só implica regresa ao inicio da liña
sen realmente ir a unha nova liña.
Entón, se imprimir unha barra invertida e r volver ao inicio da liña
a continuación, imprimir máis cousas, sobrescribir o material que xa está en
[Inaudível].
Considerando que, en realidade, non vai para un novo liña e vai para o [inaudível].
>> COLUMNA 1: Ben, algunha pregunta?
Todo ben.
Vou entregalo a Dan, que vai continuar.
>> [Aplausos]
>> DAN: Todo ben.
Entón, eu vou estar falando outro gran gama de ideas da clase que son
aproximadamente representante de dúas semanas e o inicio da terceira semana comezando
con fundición, que é só unha forma de tratamento dun valor dun determinado tipo, como
un valor de un tipo.
Así, podemos facelo con carácteres para Ints, Carrozas para Ints e
longas longs para o dobre.
>> Todas estas cousas poden ser utilizadas como formas para o tratamento de algún valor numérico
menos char como calquera outra valor numérico.
Polo tanto, hai algúns problemas con isto, curso, que vén cando reparto
cousas como float para Ints.
Entón, iso é un pouco raro.
Temos un coche que é de 1,31.
Nós multiplicala lo por 10.000.
E, entón, imprimir lo como un int.
Que esta saída?
10.000 veces 1,31.
Así, 13.000, é que a estimación?
>> Audiencia: Creo que é 10.000.
>> DAN: Entón, eu estou multiplicándose por 10.000 antes de que eu estou lanzando-o.
>> Audiencia: Ah.
Non habería un 9 e algúns números 0?
>> DAN: Pode ter algúns díxitos estrañas.
Tan seguro, que é 1,3 veces 10.000.
Entón, iso é 13.000.
E este aumento estraño -
>> Audiencia: 13.100.
>> DAN: 13.100.
Grazas, Rob.
E esa estrañeza adicional -
este 9,9 -
é simplemente porque este reparto acabou redondeo onde
non debería ter.
É.
>> Audiencia: O casting pasa tras algo máis?
>> DAN: Entón, por que eu teño iso na impresión, ela fai esta multiplicación antes
fai casting.
>> Audiencia: [inaudível].
>> DAN: Coido que sería lanzado en primeiro lugar, si, o que sería 10.000.
Algo máis?
Legal.
Polo tanto, esta é 13.099.
Por que isto ocorre?
Imprecisión.
>> Carrozas non son perfectos.
Eles só poden representar números a un número de números significativos.
Entón, se nós imprimir 8 figos sig sobre este flotador, temos unha especie de
número mirando feo.
E iso é porque non pode con precisión 1,31 ser representado por simple
potencias de dous na máquina.
Por iso, acaba levando o máis próximo creo que, o que acaba
ser un pouco baixo.
Ten sentido?
Aceptar.
>> Agora, conexionado son unha forma diferente de facendo declaracións condicionales, onde todos
que nos interesa é unha única variable.
Polo tanto, neste exemplo particular, estamos a obtención dun número enteiro desde o sitio web.
E entón nós estamos mirando para o que este enteiro é.
Presuntamente, é o número entre un e catro.
Iso é o que estamos pedindo.
>> Entón fai un cambio de nome da variable.
Despois de configurar os casos de posible valores que podería ser.
Entón caso dun, digo que é baixa.
E entón rompe para saír da condición interruptor de modo
non continuar.
>> O próximo caso -
así se dous e tres casos -
si é caso de dous só cae para a primeira liña de código que ve como coa
caso, tres, ata que ve unha pausa.
Así, a razón que comeza un caso de só impresión baixo é porque eu
ter a pausa aquí.
Se eu, por exemplo, ignorou esta pausa - se eu xoguei este separatista -
sería imprimir abaixo, a continuación, que sería imprimir medio, e logo, ía romper.
>> Entón breaks son unha parte importante de cambiar as condicións e
eles deben estar alí.
Os casos que non sexan recoñecidos explicitamente son tratados polo patrón
caso no interruptor e debe ser lanzado.
>> Audiencia: Entón, 1, 2, 3, e 4 serían n?
>> DAN: Os valores que non pode ser.
Si
Si?
>> Audiencia: Entón, cando ten que [inaudível]?
>> DAN: Ía imprimir abaixo, e logo sería imprimir medio, e
logo ía romper.
>> Audiencia: Por que ía imprimir medio se [inaudível]?
>> DAN: Entón, todo baixo un caso antes dunha pausa enmarca.
Así, no caso de unha impresión é caso baixo un, como é este seguinte impresión.
Si?
>> Audiencia: [inaudível]?
>> DAN: Entón ese número é só unha especial valor que esta variable
pode tomar, non?
Será que isto ten sentido?
É.
>> Audiencia: [inaudível]?
>> DAN: Si, no caso de dous ía imprimir medio e, a continuación, romper.
>> Audiencia: [inaudível]?
>> DAN: Eu creo que calquera?
Que outros tipos de datos pode cambiar?
>> Audiencia: Pode cambiar máis de calquera tipo de datos.
Pero iso só significa algo máis caracteres e Ints e cousas así, porque
se está migrando un punteiro que realmente non ten sentido,
conmutación de carga, se aínda imos de facelo, por mor de punto flotante
en precisión, non vai realmente quero facelo de calquera maneira.
Entón, practicamente, só Ints e caracteres e cousas así.
>> DAN: Si, é cando ten explícita Os valores que sabe, eu creo, pode ser
que o cambio é realmente útil.
Bo?
Aceptar.
>> O ámbito é o intervalo que a declarada variable estende.
Entón, neste pequeno anaco de código que eu teño, sería cheo de erros.
E a razón é que declarou esta int i dentro do ámbito deste loop.
E entón eu estou tentando facer referencia que i fóra dese ámbito de loop.
>> Entón, basicamente, pode pensar sobre o alcance como calquera cousa que declarar
con dentro dun conxunto de claves só hai dentro desas chaves.
E se tentar usar esa variable fóra desas claves, vai
obter un erro do compilador.
Si?
>> Audiencia: Entón este non funciona?
>> DAN: Isto non funciona, si.
Cordas.
Cadea a char *.
Son exactamente o mesmo.
Son só punteiros para caracteres.
E calquera cadea que ten que rematar con barra invertida cero, que é só
unha convención c.
>> El é chamado o terminador NULL.
E NULL -
capital de N, K maiúsculo, o capital L, L maiúsculo -
non é o mesmo que o Terminador NULL.
Este é un punteiro.
Este é un personaxe.
Son moi distintos.
Teña en conta que diso.
Será a proba, probablemente.
Eu non vin o quiz.
Si?
>> Audiencia: Entón NULL é, digamos, o punteiro?
>> DAN: si.
>> Audiencia: Qué [inaudível]?
>> DAN: Se, por exemplo, malloc chámase cando non ten memoria suficiente para obter
o tamaño que está pedindo, malloc volverá NULL.
É, basicamente, sempre que unha función é debe devolver un punteiro, ten
que comprobar contra NULL por NULL é un bo -
é, máis ou menos, o valor de lixo.
É un cero na medida en que os punteiros balde.
>> Sempre que chamar a unha función, que retorna un punteiro.
Vai querer comprobar a ser seguro de que este punteiro non é NULL
porque NULL é moi común.
É unha especie de un retorno de lixo.
Entón, se algo non vai ben, só retornan NULL no lugar.
>> Audiencia: [inaudível]?
>> DAN: Si, e iso é así.
>> Audiencia: [inaudível]?
>> DAN: Spell-lo como este.
É o terminador NULL.
É minúsculas N-U-L-L se está soletrado-lo.
>> Audiencia: E eu só fun cara atrás e proba.
E se tentar poñer un punto flutuante valoran nun switch, que vai berrar contigo
dicir, indicación precisa expresión do tipo enteiro.
>> DAN: Alí vai.
Pero si, cal foi a pregunta de novo?
>> Audiencia: [inaudível]?
>> DAN: Entón o capital N, capital de U, o capital L, L maiúsculo é unha cousa real c.
É o punteiro NULL e ganas só ser tratado como tal.
Vostede non vai deletrear o Carácter NULL para ver calquera
outra forma que non esta.
Si?
>> Audiencia: Entón Voltar a char max ou algo nas notas, sería
encarnan a mesma función como [inaudível]?
>> Audiencia: Entón está referíndose a volvendo de char máximo de getchar, ou
Sexa o que sexa?
>> Audiencia: Yeah.
>> Audiencia: Si, así o xeneral prazo para todas esas cousas
son valores sentinela.
Así como volver int max de GetInt e de char máximo de getchar, é
quere que sexa así, todo ben, se esas cousas están volvendo a nós,
algo deu mal.
>> Para punteiros, que só terá lugar a ter este valor de sentinela que todo o mundo
Acepta arriba.
E esta é a cousa que volver cando as cousas van mal.
Entón carácter máximo é o que estamos a usar para representar algo
como NULL ou getchar.
>> Audiencia: Entón, se está probando getchar, podería só poñer NULL?
Isto faría algunha diferencia?
>> DAN: Non podería só comprobar NULL.
Vostede tería que comprobar carácter máximo porque o valor de retorno da función é
un carácter non un punteiro.
Si?
>> Audiencia: Esta pregunta para a lonxitude da corda.
Isto inclúe o carácter NULL?
>> DAN: Non
E iso é, en realidade, como lonxitude da corda sabe que deixar porque pasa por
súa matriz de caracteres ata ve un personaxe NULL.
E entón como é, o único ben, eu son feito.
>> Audiencia: [inaudível] cinco?
>> DAN: Ola sería cinco.
Yep.
Así, as matrices son continuas bloques de memoria.
Teñen acceso instantáneo ao dicir que o nome da matriz e, a continuación, en crespos
tirantes, calquera que sexa o índice que quere ir para, están indexadas dende cero a
a lonxitude da matriz menos 1.
>> E eles están declarados polo tipo de cousa que está almacenando no
matriz, o nome da matriz, e entón calquera que sexa o tamaño é de que a matriz.
Polo tanto, esta é unha matriz de char de lonxitude seis que ten eses valores.
Si?
>> Audiencia: [inaudível]?
>> DAN: Yeah.
>> Audiencia: [inaudível]?
>> DAN: Se ten o que está a suceder na matriz xa feita.
Entón, podería indicar que en vez de, dicir, char, calquera que sexa o nome do
matriz é, corchetes baleiros igual rizado cinta H coma por comas E L L coma por comas
O carácter coma NULL e bosquexo.
Isto tamén funcionaría como unha declaración.
>> Audiencia: [inaudível]?
>> DAN: Entón ten que ter o tamaño xa feito.
>> Audiencia: [inaudível]?
>> DAN: si.
Todo ben.
Argumentos da liña de comandos son unha forma de obter a entrada do usuario como
argumentos para inicio.
Iniciar recibe dous argumentos.
O número de argumentos que está a ser pasou ao longo da liña de comandos e un
vector cadea ou unha matriz de cadea de todos os argumentos.
>> Entón, se eu, por exemplo, chamada de función, como Un punto fóra un espacio, espazo 2, tres,
argc sería 4.
E o argv 0 sería un punto fóra.
Argv1 sería 1.
argv2 sería 2. argv3 sería 3, en cuxo caso particular.
Si?
>> Audiencia: [inaudível]?
>> DAN: O último elemento na matriz porque a matriz é argc lonxitude máis
un dos argb, o último elemento é o punteiro NULL.
É argc máis 1.
Así, no caso de que eu acaba de dicir, el sería argv 0 é un punto fóra.
argv 1 é 1. argv2 é 2. argv 3 é 3.
argv 4, que é unha maior argc que sería NULL.
>> E ese é o punteiro NULL.
Si
E iso é porque cadea é unha estrela char é un punteiro.
Por iso, debe ser do mesmo tipo.
Si?
>> Audiencia: Dúas preguntas.
Entón, un, cal é a diferenza entre isto e GetString outro do que un tipo
no motor de usuario?
E dous, é almacenado dentro súa memoria recente?
Así como, GetString faría ser [inaudível]?
>> DAN: Onde se garda?
Non sei onde está almacenado.
>> Audiencia: Entón, en realidade, xa sabe como calquera funcionan chamalo de argumentos
almacénanse na pila?
Entón argc e argv son argumentos para inicio e están na pila, ou realmente
logo enriba o que pensa como o principio da pila.
Cal era a outra parte de cuestión?
>> Audiencia: Entón, cal é o [inaudível]?
>> DAN: Si, é só unha forma diferente de obter a entrada do usuario.
Isto dun lixeiramente máis eficaz e é máis práctico para os scripts, porque
pode só pasar argumentos para o seu principal función, en vez de ter que esperar
para os usuarios, se non ten ningún usuarios.
>> Audiencia: E si, obter cordas sería [inaudível].
Sería almacenar o material que precisa.
>> DAN: Si?
>> Audiencia: [inaudível]?
>> DAN: Si, argv 0 inclúe sempre a barra punto da chamada de función.
Si?
>> Audiencia: [inaudível]?
>> DAN: Si, cada un dos argumentos son rematou en carácter NULL porque
son cadeas.
>> Audiencia: [inaudível]?
>> DAN: Si, argv argc é un punteiro NULL.
>> Audiencia: [inaudível]?
>> DAN: Oh yeah.
Si, moito.
>> Audiencia: Entón, [inaudível]?
>> DAN: Entón a cuestión é se tivese o liña de comandos dot cortar un punto out 1, 2,
sería o número de liña de comandos argumentos ser dous ou sería tres?
>> Audiencia: Eu creo que iso non acontece realmente importa.
Costume dicir, oh, non pasar calquera argumentos de liña de comandos cando,
obviamente, chamou a función.
Entón, eu tenden a eliminar a vocalmente función a partir da liña de comandos
argumentos, aínda que sexa incluídas na argv.
>> DAN: Pero se fose a proba -
si - e tamén se dixo algo como argc é igual a 3,
está en posición segura.
Si?
>> Audiencia: [inaudível]?
>> DAN: Coido que, se en vez de chamar esta en argc e argv corda corchetes
pero mantivo os mesmos tipos e chamado só de Lles algo diferente, como un
eb, será que aínda funciona?
E el continuaría a traballar, Vostede só -
en vez de usar argc - usaría ae b.
Si?
>> Audiencia: [inaudível]?
>> DAN: Entón a cuestión é GetString é indo para almacenar memoria no heap
porque GetString é char *.
El almacena memoria no heap porque chama agora malloc dentro do real
implementación GetString.
OK, seguindo adiante.
>> Seguridade.
Así, para ser realmente seguro, confiar en ningún un e permitir que ninguén o acceso a calquera
de información, polo que todo o mundo constrúe as súas propias máquinas,
seus propios sistemas operativos, todo o seu programas a partir de cero, e, obviamente,
non chamar a calquera outra máquina través de Internet.
Así, os computadores son inseguros.
Eles realmente son.
Temos que confiar doutras persoas.
>> E a idea de seguridade é que é intento para limitar a cantidade de
Confiamos en que precisa.
E un dos medios que fai que é a través de cifrado.
A criptografía é, esencialmente, temos segredos.
>> Ás veces temos que pasar os nosos segredos xunto a través de, por exemplo, a Internet ou
outras cousas.
E nós non queremos que a xente coñecer estes segredos.
Entón, nós transferir nosos segredos para unha forma que esperamos que ninguén pode descubrir.
>> Entón usamos -
a través do curso desta clase -
cousas como cifra de César e [Inaudível], que son moi, moi
formas inseguras de cifrar as cousas.
Son fáciles de descubrir o que eles son e cales son os seus segredos.
O mundo real emprega moito máis esquemas de cifrado complicados.
E nós non imos entrar en moito máis que iso.
>> Debugging.
GDB é o mellor.
Vou resaltar de novo.
Use GDB todo o tempo todo xa que ten un problema.
As ordes que son útiles en GDB son romper, o que quere pasar unha liña
número, un nome de función, esencialmente onde o seu código queres parar,
e ser capaz de asumir o control.
>> Imprimir leva unha variable e imprime sexa alí o que é variable en que
apuntar na súa execución.
Logo move súa execución ao longo dunha etapa.
E paso pasos dentro dunha función na súa execución.
>> Outras cousas son executados, que é como realmente realizar o seu código.
Continuar toma todas as medidas necesarias para chegar ao seguinte punto de parada.
E hai moitos, moitos outros.
Buscar-os.
Son óptimos.
Si?
>> Audiencia: [inaudível]?
>> DAN: Si, o que é un depurador.
Así, un depurador é un programa que permite depurar o programa.
Non é un programa que atopa erros para ti, con todo, que sería óptimo.
>> E para rematar, para min é investigación.
Así, os tipos de investigación que falamos sobre esta clase son de busca lineal,
que é exactamente iso que ollar a través de cada elemento do espazo de procura, un
elemento de cada vez, ata atopar o que está a buscar ou acadar
o final do seu espazo de procura no que punto dicir que non podería atopar
o elemento que busca.
E iso leva a mellor constante de tempo, que é 0 a 1 e, no peor lineal
tempo, o que é de n 0.
>> Busca binaria, que debe elementos sórdidos.
Vai para o medio dos seus elementos, ver se o elemento que está a buscar
é maior ou menor que o elemento que está no medio.
El é máis grande, vostede di que o fondo do seu espazo de procura é a súa
localización actual, o medio e reiniciar o proceso.
De ser menor, parece dicir que o - si, o que pasou?
>> Audiencia: [inaudível]?
>> DAN: si.
Calquera tipo de especie que foi ensinado en a clase é un xogo xusto para a proba.
>> [Risas]
>> DAN: E o feito de non ter tido para facelo por un conxunto de problemas, é xusto
xogo para a proba.
>> Audiencia: Podemos pasar por iso como -
>> DAN: Será ir máis.
>> COLUMNA 2: O código real para [Inaudível] é en study.cs50.net.
Entón, se ollar para o problema práctica na páxina de merge sort
study.cs50.net, existe o código para a implantación de merge sort.
Entón non ten que aplicar lo só esta noite.
Pero asegúrese de comprende-lo, en vez que só lembra-la.
>> Audiencia: [inaudível]?
>> COLUMNA 2: A páxina de merge sort en study.cs50.net, non é unha práctica
problema que, se fai clic en problema, ao final hai unha
solución, que é a fusión implantación especie.
Pero asegúrese de comprende-lo no canto de só lembra-la
ou copia-lo para abaixo.
>> Audiencia: E un perfectamente válido problema para o exame sería
algo así como aquí está unha lista.
Que esta lista quedar despois un paso de seleccións de tipo ou de
tipo de inserción ou o que sexa.
Unha iteración completa da lista.
Así, mesmo se non acabar precisando código para el, hai que entendelo la
o suficiente para saber como vai sendo modificar esta matriz.
>> DAN: Isto é todo para min.
>> [Aplausos]
>> LUCAS: Hola a todos.
O meu nome é Lucas.
Vou falar da recursividade, todos tipo que aprenden, e unha
pouco de todo punteiros.
OK?
Entón, primeiro de todo, recursión.
Que significa dicir que unha función é recursiva?
>> Audiencia: Chama-se.
>> LUCAS: OK, chama-se, si.
Así como esta imaxe, por exemplo.
É coma se a imaxe dentro dunha imaxe e así por diante.
Así, por exemplo, pode ter - como Dan que estaba a falar de busca binaria.
Unha forma na que busca binaria é recursiva é o feito de que é
intentando atopar un número.
Entón vai para o medio.
E despois de que comprobe que as cifras alí na parte esquerda e no dereito.
>> E entón se descubrir o número é será do lado esquerdo, que é o mesmo
cousa como facer a procura de novo, pero só na parte esquerda da lista.
Entón é así que soa como é recursiva.
Entón é por iso que vostedes teñen recursiva solución para merge sort.
>> OK, entón aquí está un exemplo.
Entón, imos dicir que quero escoller todos os números de 1 a n.
Eu pode entender que a suma de n número é n máis n menos 1 a 1.
Pero entón, se eu ollar n menos 1 máis n menos 2 máis 1, que é o mesmo
que suma números ata n menos 1.
Entón eu podo dicir a suma de unha cantidade igual é igual a n máis a suma de n menos 1.
Será que isto ten sentido?
>> E eu tamén tería algo máis chamado o proceso de base, que é o que
a suma dos números arriba a cero sería cero.
Así, logo que chegar ao número cero, eu deixar de contar.
Será que isto ten sentido?
>> Entón aquí está un exemplo de como Podo aplicar iso.
Entón, eu teño esa función en algúns.
Isto leva un enteiro n.
Entón aquí eu primeiro comprobar se n é inferior ou igual a cero.
Entón, se é menor ou igual a cero, eu voltar cero, que é o noso caso base.
Se non, eu só podo voltar n máis a suma dos números de
un de n menos un.
Ten sentido?
Aceptar.
>> Entón aquí está o que parece.
Ten suma de dúas iguais 2, máis a suma do 1.
E algúns dos 1 é 1, máis o suma de 0, que é 0.
Ten sentido?
Entón, se olharmos para a pila de seu programa, que é o que parece.
>> En primeiro lugar, temos a función principal.
E, a continuación, a función principal chamado suma 2.
E, a continuación, suma 2 vai dicir, oh, suma 2 é igual a 2, máis a suma de un.
Así que engadir suma de 1 a pila.
E a suma de 1 vai chamar suma de 0, o que tamén será engadida
para a pila.
E, a continuación, cada un destes os que son encima do outro ten que voltar
antes de que os outros poden continuar.
>> Así, por exemplo, aquí, suma de 0, en primeiro lugar, vai voltar 0.
E, a continuación, escoller suma de 1.
Logo suma de 1 vai voltar 1 a suma de 2.
E, finalmente, suma de 2 vai para volver 3 a principal.
Será que isto ten sentido?
>> É moi importante entender como a pila está traballando e tratar
ver se ten sentido.
OK, entón a clasificación.
Entón, por que é importante a clasificación, en primeiro lugar?
Por que temos que preocuparnos?
Calquera?
Déame un exemplo?
Si?
>> Audiencia: [inaudível].
>> LUCAS: Si, OK.
Así, pode buscar de forma máis eficiente.
Isto é un bo camiño.
Así, por exemplo, temos unha morea de cousas, de feito, na nosa vida que
son clasificados.
Por exemplo, os dicionarios.
>> É moi importante ter a colección palabras algún tipo de orde que
pode acceder facilmente.
Entón, iso é o que estaba dicindo.
Podes buscar de forma máis eficiente.
Debería quão difícil sería ter un dicionario en que as palabras están en
orde aleatoria.
Vai ter que ollar, moi bonito, cada palabra, ata atopar o
palabra que está a procurar.
>> Se está a usar o Facebook tamén, cando está mirando para os seus amigos, está
vai ver que Facebook poñer o seu amigo máis próximo está na parte superior dos máis
que non fala a moito.
Se percorrer todo o camiño ata o fondo do súa lista de amigos, vai ver
persoas que probablemente nin sequera lembre que está cos amigos.
E iso é porque os tipos Facebook os seus amigos con base en como
está preto deles.
>> Así, a organización de datos.
Tamén Galiza.
Entón ve que todos os Pokémons teñen números.
E iso é como un doado forma de acceso aos datos.
>> Audiencia: Acceder Galiza.
>> LUCAS: É.
>> Audiencia: [inaudível].
>> LUCAS: Yep.
OK, entón a selección tipo.
Tipo de selección que vai seleccionar o menor valor indiferenciados dunha lista cada
tempo en cada iteración.
É unha especie de como o tipo que fai na súa cabeza cando estás
ordenar unha lista na man.
>> Basicamente, todo o que fai é mirar a menor número.
Poñelas na lista de clasificación.
E entón mira para o preto menor número.
E entón continuar facendo que e así por diante.
>> Así, a selección tipo é basicamente seleccionar cada vez menor
valor indiferenciados.
Poñer ao final da ordenada parte da lista.
E continuar facendo isto.
Entón, imos ver rapidamente o que este parece.
Entón aquí está o clasificado e lista indiferenciados.
>> Así, para a ordenada de lista, é inicialmente baleiro.
E entón eu estou indo a seleccionar o menor número aquí, que é 2.
Entón eu recibín o número 2 e engada na parte da fronte da lista.
E entón eu ollo á seguinte menor elemento, o cal é de 3.
Entón eu poñelas ao final da lista clasificada.
E entón eu continuar facendo isto.
Creo 4 e poñelas ao final.
Atopar 5 e poñelas ao final.
>> E mira como todos aqueles momentos en que Estou dicindo que poñelas ao final é,
basicamente, intercambiar dous valores.
OK?
E entón o último, só ter máis dun elemento.
Entón, el xa está clasificada.
>> OK, entón ordenación por inserción.
Inclusión tipo que vai ter tamén esa cousa de ter un ordenado e
unha lista non ordenada.
O único é que cada vez que está engadindo un elemento ao clasificadas
lista, basta escoller o elemento que está diante da lista indiferenciados.
E entón vai atopar o que colocar debe estar na clasificados
parte da lista.
>> Imos ver o que isto é así isto fai máis sentido.
Así, inicialmente, por exemplo, estou tentando para introducir os tres números no
clasificadas parte da lista.
Así, a lista non ten nada.
Entón, podo só poñer o número 3.
>> Agora, quero engadir o número 5 para a parte ordenada da lista.
Así que ollo ao número 5.
Entendo que é maior que 3.
Entón eu sei que ten que ser despois de 3.
Entón eu coloque 3 e 5.
>> Entón, quero introducir o número 2.
Eu noto que o número 2 é, en realidade durar tanto continuación 3 e 5.
Entón, realmente teño que poñer todo o ida ao comezo da lista.
Entón eu teño que, tipo, cambiar toda a elementos da lista ordenada para que eu poida
abrir espazo para o número 2.
>> Entón eu vexo o número 6.
Vexo que debe ser despois de 5.
Entón eu colocar-lo alí.
E, finalmente, eu ollar para o número 4.
E notei que debería situarse entre 3 e 5.
E entón eu colocar-lo alí e cambio todos os outros elementos.
Ten sentido?
>> Bubble Sort.
Entón bubble sort é basicamente o que está a vai facer - que chamamos burbulla
tipo, porque percorrer a lista - é realmente mellor se eu só amosar
che gusta deste -
e está indo para comparar números adxacentes.
E vai cambiar a súa posicións se eles non están
na orde correcta.
>> Entón, basicamente, o que vai pasar é aquí, por exemplo,
ten 8 e 6.
Vostede sabe que a orde de clasificación será realmente ser 6 e 5, non?
Entón vai para intercambiar as ordes.
Entón eu vexo 8 e 4 aquí.
E fago o mesmo.
Eu cambiar de novo.
E, finalmente, 2 e 8.
Eu tamén trocalos.
>> Chámase Bubble Ordenar porque despois Cada unha destas repeticións, en realidade,
o maior número na lista queda todo o camiño para a fin da lista.
Será que isto ten sentido?
Porque segue cambiando- e movendo-o para a dereita.
>> OK, entón esta é a segunda iteración.
Iso sería o mesmo.
Vou facer un intercambio e a continuación, o último.
Eu que non existen de swaps ea lista é ordenada.
Así, en Bubble Sort, nós basicamente manter pasando pola lista e cambiar
cousas ata que eu entender que eu non fixen calquera swaps facendo a iteración, o que
quere dicir que a lista xa está clasificada.
Ten sentido?
>> Imos falar un pouco sobre a execución de cada vez.
Así que vostedes recorda Big O, Omega e Theta?
Si?
OK, o que é Big O, en primeiro lugar?
>> Audiencia: [inaudível].
>> LUCAS: Si, é chamado de peor caso tempo de execución, o que só significa que é
o que espera que o programa tomando para realizar.
Como, en termos de -
neste caso - n.
Número de elementos na consultar no peor dos casos.
Como, no caso peor posible.
>> Así, por Bubble Ordenar por exemplo temos Big O de n cadrado.
Por que temos isto?
Por que é Bubble Ordenar Big O n cadrado?
>> Audiencia: [inaudível].
>> LUCAS: Si, así o peor caso será que eu vou ter que facer n iteracións.
Así, cada unha das iteracións vai traia o maior elemento para o extremo
da lista.
Entón, o peor caso é que eu teño para facer esa cousa n veces.
E para cada unha desas veces, eu teño que facer n swaps porque eu teño que comparar
cada dous elementos.
Entón é por iso que é n ao cadrado por que é n veces n.
>> A continuación, a selección de tipo tamén é n cadrado porque, para cada iteración, eu teño que
mirar para cada elemento na lista.
E despois atopar o máis pequeno, o que significa que eu teño que
ollar a través de n elementos.
E eu teño que facelo n veces por Teño que seleccionar todos os elementos n.
>> Un tipo de inserción é tamén n cadrado xa que o peor escenario será
ser, un, eu teño que introducir n números, non?
Entón, eu xa sei que vou ter n iteracións.
Pero para cada un destes números, se eu tivese a ollar a todos os números en
a lista ordenada e poñer-lo todo o camiño na parte dianteira, que será n cadrada
porque será n veces n de novo.
Ten sentido?
E sobre omega?
>> Audiencia: [inaudível].
>> LUCAS: É o mellor escenario.
Entón, é como, en unha morea de veces para selección, o escenario de mellor caso é
cando a lista xa está clasificada.
Entón, o que realmente non ten para facer calquera cousa.
Bubble Ordenar ten a mellor escenario de n.
Vostedes saben por que?
>> Audiencia: [inaudível].
>> LUCAS: Si, se manter o control de se tivo algunha razón datos swaps ou
non, se ten algo como conxunto de verdadeiro se hai unha iteración, se o
lista xa está clasificado, basicamente, o que vai ocorrer é que eu vou
tentar cambiar cada dous elementos adxacentes.
Eu estou indo a ver que non existen swaps.
E eu só retornar inmediatamente.
>> Entón iso significa que eu tiña que percorrer a lista xa.
Por iso, é n porque eu ollo no n elementos.
Por selección tipo n Square?
>> Si, aínda que a lista é ordenada, por cada iteración de selección tipo, eu
Ten que seleccionar o elemento mínimo.
Entón iso significa que eu teño que mirar para fóra en todos os elementos do indiferenciados
lista e atopar o mínimo para cada iteración.
Será que isto ten sentido?
>> E a espada de inserción é n porque o caso que eu estou tratando de introducir o
números e as cifras, cando tentar inserir-los, vexo que
están na posición correcta.
Eu non teño que ir comprobar todos os demais números da lista non ordenada.
Entón é por iso que vai ser n.
Ten sentido?
E o que é teta?
>> Audiencia: [inaudível].
>> LUCAS: Que, desculpe?
Diga iso de novo.
>> Audiencia: [inaudível].
>> LUCAS: Exactamente.
Así pode ver que só a selección almacenado en merge sort ten tetas.
E iso é porque só ten teta se ambos Big O e Omega son os mesmos.
Aceptar.
E, finalmente, merge sort é o rexistro n.
>> E entón, como Dan estaba dicindo, merge sort é tipo como do mesmo xeito que
fai a procura binaria.
Entón comeza a lista.
E vai cortar á metade.
E entón corte-los en metades menores.
E entón fundín-los.
Vostedes lembrar que, non?
OK, xa que estaba dicindo.
>> OK, punteiros.
Entón, o que é un punteiro?
>> Audiencia: [inaudível].
>> LUCAS: un enderezo.
Aceptar.
Sei que David mostra un grupo de videos de Binky e as cousas que apuntan
uns ós outros.
Pero eu gusto de pensar de punteiros só como un enderezo.
Polo tanto, é unha variable que está a suceder para almacenar un enderezo.
>> Entón é só esta variable especial que é catro bytes de lonxitude.
Lembre, este punteiro para calquera cousa é sempre catro bytes de lonxitude para o noso 32-bit
máquina de xeito que o caso o aparello.
E só ten a localización dunha variable dentro del.
>> OK, non hai esa memoria, basicamente.
Así, cada bloque de memoria, de feito, ten un etiqueta, o cal é o enderezo do
Slotty memoria.
Entón iso significa que eu podo ter un punteiro que apunta a
calquera destes enderezos.
Así, a razón pola que imos usar punteiros é se eu teño que lembrar a súa localización
que unha variable específica é unha memoria.
>> E vostedes recorda que unha das casos foi se eu tivera unha función
se eu realmente quero que intercambio para reais, realmente
ten que enviar un punteiro.
Non é a variable.
Vostedes se lembran diso?
A diferenza entre -
cal é o nome?
Chamada por valor e chamando por referencia, non?
>> OK, si.
Entón chame por valor.
Cando acaba de enviar unha variable para función que vostede está só enviando un valor.
Entón está realmente enviando unha copia da variable.
E o programa non podería me importar menos sobre si mesma variable, en realidade,
fai unha copia.
>> E chamando por referencia significa que En realidade, estou enviando unha copia do
punteiro para esa variable.
Entón iso significa que eu estou enviando o localización desta variable.
Entón, sinto que teño a localización do variable, cando eu chamo a función
con punteiros, eu son capaz de realmente cambiar os datos que estaban no inicio.
Ten sentido?
>> Aínda que, o punteiro é unha copia, o punteiro aínda ten a dirección real de
a variable que quero cambiar.
Ten sentido?
>> Así, a creación de punteiros.
Lembre, o punteiro sempre o tipo que está a apuntar
ao e, a continuación, unha estrela.
E entón poñer o nome.
Entón lembre que sempre que ten calquera que sexa estrela, é como un punteiro para
que calquera que sexa variable tipo que tiña.
>> Entón, aquí en estrela, por exemplo, é un punteiro e un enteiro.
E entón estrela char é un punteiro estrela char e así por diante.
Si?
>> Audiencia: E si temos unha punteiro para a estrela n x.
Sei que crea un punteiro para x.
Será que ela tamén declarar x un enteiro?
>> LUCAS: OK, entón cando di que non estrela x, non está creando un punteiro a un
x variable.
Está creando un punteiro chamado x.
>> Audiencia: [inaudível].
>> LUCAS: Entón cando digo n estrela x, eu son dicindo, hey, na memoria, vou
conseguir unha desas tres caixas.
E eu vou dicir que iso será x, o que é
Vai ser un punteiro.
E unha cousa interesante sobre punteiros é que dicimos que teñen
4 bytes para unha máquina de 32 bits.
E a razón para iso é porque 4 bytes son 32 bits.
>> E máquinas que son de 64 bits, en realidade teñen enderezos punteiros
que son de 64 bits.
Por iso, só significa que a dimensión da enderezos na máquina é diferente.
>> Entón referenciando e Dereferencing.
Existen dous operadores que Vostedes deben lembrar.
O primeiro é ampersand.
A segunda é a estrela.
Non sexa confuso con esta estrela e este protagonizar pois recorda que, en
Neste caso, ten n estrela.
>> É como unha cousa toda en conxunto.
Non hai espazo estrela n.
Entón, isto significa que el é o tipo.
Lembre, que cando ten a estrela variable, está
falando sobre o tipo.
>> Cando acaba de estrela e, a continuación, o nome da variable, isto quere dicir que
está dereferencing o punteiro, que significa que está mirando para o
punteiro, atopar o enderezo é apuntando, indo a este enderezo,
e mirando para sempre ten alí.
Entón eu digo aos meus alumnos que cando ten estrela, ten que pensar que é
a abreviatura de contido.
>> Entón se ten un punteiro e facer punteiro estrela, é o
contido do punteiro.
Entón vai para o que está a apuntar cara e mirar para o contido constante.
E o comercial é o mesmo cousa como enderezo.
>> Entón, se eu teño unha variable a - como, imos dicir que eu fixen un int é igual a 3 -
se eu quere atopar o enderezo de que unha memoria variable, eu só podo facer
comercial Unha.
Entón, é o enderezo dun arquivo.
Ten sentido?
>> Entón, aquí está un exemplo.
Isto falta int b e c int.
Así, a é igual a 3 int medios que Eu estou indo a ir á memoria.
E eu vou pensar un slot e poñer o número 3 aquí.
>> E, a continuación, int b é igual a 4.
Vou facer o mesmo.
Ir á memoria e poñer un número 4 nunha das caixas.
E int é igual a 5.
Atopa outra caixa e poñer un número 5.
>> Entón, o que é esta liña está facendo? n é igual a estrela pa ampersand a.
Entón, primeiro de todo, n estrela pa.
O que está facendo?
>> Audiencia: [inaudível].
>> LUCAS: Si, por iso n estrela aa, en primeiro lugar, declara un punteiro chamado pa.
E el está atribuíndo o valor de punteiro que pode ser o enderezo dun.
Entón comercial Unha.
Entón, se eu fai estrela pb, o que é unha estrela pb?
>> Oh, desculpe.
Isto tamén está en falta. n estrela pb.
Quero dicir estrela PC.
Eu sinto moito.
É o mesmo.
Pero agora eu son bo aire creando un punteiro para B e, a continuación, un punteiro para c.
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Si
Entón, se vai á memoria e vai para a caixa que é designador para aa,
está realmente indo a ver un enderezo dun.
OK?
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Si, punteiro é un enderezo.
Nunca se esqueza diso.
É coma se o máis importante parte sobre punteiros.
Ten almacenar e enderezo a algunha variable.
Algo máis?
Algunha pregunta?
Aceptar.
>> Entón punteiros e matrices.
Lembre que cando fago int conxunto 3, Basicamente, o que eu estou facendo é que eu son, tipo
de, declarando nun punteiro.
Entón matriz é tipo como un punteiro para un lugar específico na memoria en que eu
alocados tres slots para enteiros.
Será que isto ten sentido?
>> Entón, cando int conxunto 3, o que eu son facendo, basicamente, é a creación de tres
slots de memoria.
Entón, eu só atopar tres slots de memoria.
Entón, se eu fai iso, entón, un conxunto de estrelas, que basicamente, o contido do array,
o que significa que eu apagar o punteiro, vou para aquel lugar que está apuntando,
e engada o número un.
>> E entón, se eu fai conxunto estrela máis 1, iso é o mesmo que facer arranxo
soportes de un, o que significa só que eu vaia o lugar que está apuntando.
E entón o máis 1 marcas me desprazar unha posición.
Entón eu vou para esa posición, en realidade, e poñer o número dous.
>> E entón, finalmente, cando fago variedade máis 2, eu vou para onde
enlace de matriz en.
E entón eu me pasar a bloques de memoria.
E entón eu coloque o número tres aquí.
Si?
>> Audiencia: array Entón estrela é simplemente dicindo que o primeiro punto.
E pode engadir 1, só porque estamos realmente só
referenciando que o primeiro enderezo.
>> LUCAS: É.
Por que, por exemplo, dicir disposición 0, array 1 e matriz de 2?
Eu digo, por que fai 0, 1, 2, 3, no canto de 1, 2, 3?
Unha das razóns é, un, ordenador programadores prefiren comezar
contando a partir de 0.
Dous é porque cando fai conxunto 0, é o mesmo que facer arranxo
Acréscimo de 0, o que significa que eu vaia nesa posición, e eu non
saltar todos os bloques de memoria.
Entón eu non mover todos os bloques de memoria.
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Entón está pregunta o que é a diferenza entre facer
este ou facer malloc.
Unha das diferenzas é que int matriz 3 é a creación dun
disposición na pila.
E cando fago malloc, el crea na pila.
Será que isto ten sentido?
>> Entón como é que malloc realmente funciona?
Entón, por que aínda que empregar malloc?
Seu tipo compilador de figuras fóra todo as variables que declarou.
E crea espazo para todos deles na pila.
Así, as súas variables van estar nalgún lugar na pila.
Entón aquí está as variables de ambiente.
>> Entón, basicamente, o espazo para as variables en memoria é alocada en
tempo de compilación.
Entón, isto significa que o seu ordenador ten coñecer todas estas variables
antemán.
Non ten que saber que o valor que está indo a poñer neles.
Pero el que saber como cantidade de memoria que precisa.
>> Pero agora imos dicir que, por exemplo, está creando unha matriz ou tomar un
cadea que está tomando desde o sitio web.
Non sabe canto tempo a corda será, por exemplo.
Entón, vostede non sabe exactamente cantos bloques de memoria que reservar, non?
>> Polo tanto, non fai moito sentido para quere dicir poñer 100 caracteres.
E entón o que se o usuario escribe 150?
Vai ser parafuso.
>> Entón, basicamente, non pode estar seguro de como cantidade de memoria que precisa reservar
cando compilar o programa.
Vostede só sabe que en tempo de execución.
Entón é por iso que ten o heap.
Así, a pila terá memoria que está alocando durante o
duración do programa en execución.
>> Entón, basicamente, cando fai malloc, o que está facendo memoria está alocando en
tempo de execución, o que significa que está decidir nese momento que
debe ter esa memoria.
Entón é iso, cando está asignación.
Será que isto ten sentido?
>> Entón lembre, a pila ten variables que son creados en tempo de compilación.
E entón a pila ten variables que son creados como vai
con malloc, por exemplo.
>> Audiencia: [inaudível]?
>> LUCAS: Entón é GetString vai chamar malloc.
Déixeme falar malloc, e Vou explicar GetString.
Entón malloc é o mesmo como distribución de memoria.
Por iso, vai a asignar memoria no heap.
E el vai voltar un punteiro para onde que a memoria foi alocada no.
>> Entón, cando fai -
aquí, por exemplo -
n punteiro estrela.
E entón punteiro igual malloc tamaño de 10 polgadas veces.
Estou creando un punteiro.
E entón eu estou atribuíndo este punteiro para o valor do enlace que malloc
é me dando.
>> Entón eu estou pedindo malloc podes reservar espazo para 10 enteiros.
Iso é o que está dicindo.
E malloc me dá de volta a punteiro para aquel lugar.
Ten sentido?
Aceptar.
Eu E GetString é, basicamente, facer un chamar a malloc para que poida reservar
memoria durante a execución.
>> Lembre sempre comprobar nulo porque malloc vai voltar nulo
se non pode asignar memoria.
Imos dicir que pedir un ridículo cantidade de memoria.
O seu ordenador non será capaz de reservar moito.
>> Entón malloc é só ir para volver nulo.
Entón, lembre sempre comprobar que o punteiro que ten de malloc é
nulo ou non, xa que, de ser, pode ser referencia un punteiro e
provocando fallos laterais.
E, finalmente, non esqueza súa memoria libre.
>> Malloc é a creación de memoria no heap.
E ten que liberar a memoria antes do programa termine.
OK, iso é todo para min.
Sentímolo, Rob.
Grazas.
>> [Aplausos]
>> LUCAS: Calquera últimas preguntas Rob vén antes?
Non?
Si?
>> Audiencia: Eu non vin este en liña.
Xa cargou-o aínda?
>> LUCAS: Eu creo que Dave é cargalo pronto.
>> Dave: Vai ser lanzado.
>> LUCAS: Vai ser en liña.
>> Audiencia: É-se.
>> LUCAS: É enriba?
Aceptar.
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Si, ten que liberar todo o memoria que colócase na pila.
>> Audiencia: [inaudível]?
>> LUCAS: Si
Cada vez que ten un malloc cultura, ten que ter unha cultura libre
despois que deixar de usar esa variable.
Entón malloc e free son sempre xuntos.
Os seus mellores amigos.
É.
Rob?
>> ROB: Vou rapidamente.
E tamén o vídeo vai ser instalado.
Eu teño o micrófono diante.
>> OK, entón semana de cinco cousas.
O primeiro que temos é a pila.
Entón recorda que hai só unha pila cadros por chamada de función activa.
A ver isto nun segundo.
E tamén me lembro do que realmente pasa en cada cadro de pila van ser
as variables locais das nosas funcións, os argumentos que se pasan para o noso
funcións, xunto con un par outras cousas que realmente non
se preocupe.
>> Entón aquí está un exemplo de programa que, previo aviso, a principal é o regreso printfing
valor de foo 4.
foo é só ir a voltar o valor de bar 4 coma 6.
E bar vai definir algúns locais variable n igual a 4 veces 6.
E a continuación, regresar n.
>> Entón, imos ollar para a pila de todo a iteración actual do programa.
Polo tanto, hai o fondo da nosa stack.
Lembre-se de que a pila crece.
Así, na parte inferior do noso pila, nós ter un cadro de pila para o principal.
Cando o programa comeza, principal sempre vai estar no
fondo da nosa stack.
>> E o que está dentro do noso apilar marco para principal?
Así, aínda que non existan locais variables a principal, como dixen antes,
temos argc e RGV ocupando espazo dentro do cadro principal de pila.
Así principal agora vai chamando a función foo.
E isto significa que foo vai obter o seu propio cadro de pila.
>> Entón, agora estamos dentro a función foo.
E o que ten que ir en cadro de pila do foo?
Ben, foo ten un argumento n.
E n é igual a 4, xa que iso é o que principal está pasando como argumento de foo.
>> Entón agora foo vai chamar bar.
Que é barra terá dentro do seu "cadro de pila?
Ten x igual a 4 y igual a seis.
Iso non é todo o que nós imos ter no cadro de pila porque bar
Tamén ten unha variable local n.
E n imos definir igual a 24.
>> Entón agora bar volverá n.
Entón bar está retornando 24 a o cadro foo pila.
E por bar agora está volvendo, que quere dicir que estamos estourando o cadro de pila
para untar fóra da pila.
Entón, toda a memoria que fora bar usando agora está fóra da pila.
>> Agora, foo tamén para voltar 24 a principal.
Polo tanto, agora que foo está retornando, a memoria foo que estaba usando na súa "
cadro de pila tamén está desaparecido.
E agora, o principal vai chamar printf.
Entón printf é só unha función.
Cando chamamos printf, que será outro cadro de pila para o printf
chamada de función.
>> O que estamos pasando printf?
É iso que está indo a ir no seu cadro de pila.
Como mínimo, estamos pasando que por cento de i n e barra invertida
argumento 24.
Pode ter máis en que é apilar estrutura se printf pasa a ser a usar algún
variables locais.
Non sabemos.
>> Pero todo o que ocorre no printf do apilar cadro.
Vai a realizar o printf.
Entón printf está feito.
El pode voltar.
Por último, o principal está feito.
Iniciar volverá.
E entón o noso programa está feito.
Si?
>> Audiencia: Estás a ver [inaudível]
argumentos [inaudível]
parámetros?
>> ROB: Entón hai unha diferenza sutil entre argumentos e parámetros.
E realmente, o falar común, as persoas tenden só para mestura-los o tempo.
Pero parámetros son os formais nome das cousas.
>> Entón argc e argv son o parámetros para inicio.
Os argumentos son o que realmente pasar como eses parámetros.
Entón alí cando eu chamar foo de 4, 4 é o argumento que eu estou pasando dentro
E o parámetro n, dentro foo, toma o valor 4
desde 4 foi o argumento.
>> Audiencia: [inaudível]?
>> ROB: n é unha variable local para untar.
n aínda é lugar para foo, pero é un parámetro para foo.
Non é unha variable local.
Si?
>> Audiencia: [inaudível]?
>> ROB: foo é só chamar bar e retornando calquera bar retorno.
>> Audiencia: [inaudível]?
>> ROB: Si, só para ver múltiple pila de cadros.
Si?
>> Audiencia: Por que foi chamado foo antes printf?
>> ROB: Por que foo chamado antes printf?
Entón, eu podería, en vez diso, fixo algo como int x é igual a foo de 4
e logo, impreso x.
Pero en vez diso, eu combinei a función chamar o argumento de printf.
>> Pero teña en conta que non podemos, de feito, realizar a chamada a printf ata que
descubrir o que foo de 4 é.
Entón, imos avaliar iso.
E só unha vez feito isto vai para volver e avaliar iso.
Si?
>> Audiencia: Xa que tanto bar [inaudível]
valor, polo que non ten [inaudível]?
>> ROB: Eles totalmente debe ser int.
Isto non foi collido sobre varios pases.
Así debe ser int bar e int pepe xa que ambos
están retornando enteiros.
Baleiro é só no caso de que non van para voltar os valores reais.
Si?
>> Audiencia: Se tivese unha liña enriba a volta, [inaudível]?
>> ROB: A liña anterior o regreso?
>> Audiencia: Yeah.
Como se se printf e [inaudível] sería imprimir dúas veces?
>> ROB: Entón, dentro de foo?
Se tivésemos un printf aquí?
>> Audiencia: Yeah.
>> ROB: Entón, se nós tivésemos un dereito printf aquí, sería imprimir unha vez.
Xa que estamos chamando xa foo dereita aquí, así que imos acertar o printf.
Entón imos chama-bar.
E entón foo vai volver.
E é iso.
Nós só nunca atopar printf unha vez.
Si?
>> Audiencia: [inaudível]
printf chamar foo porque estamos en primeiro lugar chamando printf e entón nós estamos pasando
os argumentos.
>> ROB: Entón, en teoría, non é printf chamar foo?
Entón, non.
Só a orde que c vai realizar estas cousas é, antes de que pudermos
chamar unha función, todos os argumentos para a función ten
ser completamente avaliada.
Entón é iso totalmente avaliado?
Si, é só unha cadea.
É só un valor.
>> Entón temos que completamente avaliar esta.
Unha vez feito isto, agora todos seus argumentos son avaliados.
E agora podemos facer a chamar para printf.
Si?
>> Audiencia: Unha pregunta.
Se vostede ten unha función void, debe ten retorno punto e coma?
>> ROB: Non fai un punto e coma retorno se ten unha función void.
Aceptar.
Entón, agora algunhas cousas heap.
Entón pila é como imos tratar coa xestión de memoria dinámica.
E isto contrasta directamente co apilar o que poderiamos chamar de automático
xestión de memoria.
>> Entón, na pila, vostede non ten para xestionar o xeito no que as variables locais
están a ser empurrado e bateu fóra todo estes cadros de pila e todas esas cousas.
Non ten que se preocupar con iso.
É automático.
Así, a pila é manual.
E o [inaudível]
vén destas funcións malloc e free.
>> Entón aquí está outro programa.
Todo o que estamos facendo é mallocing un enteiro.
Estamos almacenando o en estrela x.
Por suposto, hai que comprobar a ver se x é nulo.
Entón imos só definir o que x apunta a 50.
Imprimir o que x está a apuntar cara, print x, e despois libre x.
>> Entón, como é que isto realmente vai mirar se miramos para a nosa pila e pila?
Entón, imos comezar de novo.
A parte inferior do noso pila de antes.
Lembre que che amontoar directamente oponse a pila de?
Entón, nós imos ter a principio da nosa pila alí enriba.
>> Así, o fondo da nosa pila, temos noso cadro de pila para o inicio.
Ten o espazo para argc, argv, e nós Agora temos unha variable x lugar, que
é unha estrela int.
Entón, imos facer unha iteración a través deste programa.
O primeiro que temos é unha chamada a malloc.
>> Entón, nós estamos facendo unha chamada a malloc.
Malloc é unha función.
Chegará un cadro de pila.
O que estamos pasando para malloc?
Isto vai entrar do cadro de pila.
Estamos pasando tamaño n, que é 4.
Entón, que é pasado para malloc.
>> Que malloc facer?
El nos colle un pouco de espazo na pila.
Entón, nós estamos indo a ir ao heap.
E nós estamos indo a coller 4 bytes do conxunto.
Entón imos dar ese un enderezo arbitrario.
0x123 Basta finxir que é un enderezo que está na pila.
>> Entón, o que en realidade está dentro dese rexión de memoria na páxina Ox123?
Garbage.
Entón, nós non memorizou nada nel.
Así, tanto como sabemos, Podería ser calquera cousa.
Non debe asumir que é cero.
Non é máis probable que cero.
>> Retorno Entón agora malloc.
E o que facemos cando malloc volve?
Montar o que retorna.
Montar x igual ao que está volvendo.
Entón o que é o regreso?
Está volvendo 0x123 xa que é a enderezo do bloque de memoria que
só asignado no heap.
>> Entón retorne 0x123 x agora vai ser definido igual a 0x123 que, pictoricamente,
nós frecuentemente como deseñar x ter un real frecha que apunta a ese bloque.
Pero x é só almacenar ese enderezo.
Entón, agora, debemos comprobar se x é nulo.
Non é nulo.
Fingimos que malloc que conseguiu.
>> Entón, agora estrela x é igual a 50.
Así estrela recorda que significa ir a este enderezo.
Entón 0x123 Imos ir a este enderezo.
Entón, iso nos leva ata alí.
O que estamos facendo nese enderezo?
Estamos almacenando 50.
>> Así, tras esta liña, que é o que as cousas están indo a opinión.
Entón, agora non é máis lixo alí enriba.
Agora sabemos que o 50 é nese determinado enderezo porque
nós configuralo para iso.
OK?
Entón agora imos imprimir f.
>> Entón, primeiro imos imprimir estrela x.
Entón, cal é estrela x?
Unha vez máis, estrela x medios ir ao que x está a apuntar.
Entón x é almacenar 0x123 Ir a iso.
Estivemos con 50.
Así que imprimir f.
E isto significa que vai imprimir 50.
E, a continuación, que retorna.
>> E despois temos o segundo printf.
Agora estamos por cento p.
Se aínda non viu, iso é só como lle imprimir un punteiro.
Polo tanto, temos por cento i, cento f, e todos aqueles xa.
Entón por cento p, imprimir un punteiro.
>> Así, x é un punteiro.
Entón, se nós estamos indo para imprimir x si mesmo, estamos imprimindo o que é realmente dentro
x, o cal é 0x123 Así, o primeiro print f vai imprimir 50.
A segunda impresión f vai para imprimir 0x123 Si?
>> Audiencia: Vostede usa por cento x para imprimir un enlace?
>> ROB: Entón usa por cento x para imprimir un enlace?
Entón pode, pero por cento x é xusto, xeral, xa que, como se ten algún
enteiro e que quere imprimir lo como un hexadecimal.
Isto é só como facelo.
>> Considerando que, por cento d faría imprimir como decimal.
É alí onde comezan por cento d. i é só enteiro.
por cento p é especialmente para punteiros.
>> Así, x é un punteiro.
Queremos usar por cento p.
Pero por cento x podería funcionar.
Si?
>> Audiencia: [inaudível]?
>> ROB: Yeah.
Polo menos a esta chamada - entón eu non inclui-lo aquí.
Pero estes dous argumentos son necesariamente dentro deste marco de pila
xunto con calquera variables locais printf pasa a ser utilizado.
E, a continuación, a seguinte chamada a printf agora dentro printf pila cadro é
por cento p barra invertida n e calquera que sexa o valor de x é, cal é 0x123.
Si?
>> Audiencia: [inaudível]?
>> ROB: Vai imprimir algo que se parece con isto.
>> Audiencia: [inaudível].
>> ROB: El imprime-lo en forma de enderezo.
Parece un enderezo.
Si?
>> Audiencia: [inaudível]?
>> ROB: Por que é o que?
>> Audiencia: [inaudível]?
>> ROB: ¿Por que este punteiro 4 bytes?
Polo tanto, hai un grupo enteiro de 0 está diante deste.
Entón é realmente 0x0000000123.
Nun sistema de 64 bits, non habería unha morea de máis ceros.
Si?
>> Audiencia: [inaudível].
>> ROB: Entón o primeiro printf vai imprimir -
>> Audiencia: [inaudível].
>> ROB: Si, está indo para imprimir o que x está a apuntar.
Estrela di o que é iso cousa a apuntar.
Agarre-o.
Entón o que é a apuntar cara?
50.
Agarre-o.
Iso é o que nós estamos indo a imprimir.
Considerando que, no próximo, estamos só imprimir x si.
O que está dentro da f?
0x123.
Aceptar.
>> E entón, finalmente, temos o libre.
O que estamos pasando para liberar?
Estamos pasando x.
Naquela época eu realmente exhibido Lo no cadro de pila.
>> Entón, nós estamos pasando o valor 0x123 para liberar.
Entón, agora libre sabe, todo ben, Teño que ir ata o monte
e sen que a memoria.
El xa non está a usar o que está no enderezo 0x123.
>> Tan libre vai publicar que desde o heap.
Agora a nosa pila está baleira novo.
Non temos perdas de memoria.
Agora libre pode voltar.
Teña en conta que x aínda é 0x123.
Pero isto é agora a memoria non é válido.
Xa non debe excluír a referencia x.
Si?
>> Audiencia: É voltar 0 redundante?
>> ROB: É returen 0 redundante?
Si
Acabamos de poñer que non hai por que temos un retorno dun ao aire.
Entón, é como si, imos inclúen o retorno 0.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón, despois de libre x, o que pasa se tratando cancelar o punteiro?
É posible que nada malo.
É posible que aínda vai recibir 50.
>> É posible, tamén, que a memoria é agora está a ser usado para outra cousa.
Polo tanto, é un comportamento indefinido.
E indefinido significa nada pode ocorrer.
Si?
>> Audiencia: [inaudível]?
>> ROB: Non, por iso, se asignar x para outra cousa.
Entón, aquí dixemos x é igual a algo malloc máis -
evento tamaño malloc -
entón que bloque orixinal de memoria non é liberar.
E nós temos oficialmente perdeu.
Isto é un baleirado de memoria.
Perdemos todas as referencias para este bloque de memoria.
Entón non hai ningunha maneira que podemos nunca liberalo la.
OK, entón, a continuación, regresar 0 significa feito.
>> Todos estourido ben, entón pila.
Cal é a idea aquí?
Entón lembre, pila está indo para abaixo.
Stack está subindo.
Polo tanto, este foi o exemplo da charla, Coido, onde o principal é só ir a
chamar esta función foo, que vai a chamarse de recursivamente máis e
unha vez máis.
>> Entón pila de cadros van funcionan exactamente do mesmo.
Entón, imos comezar con principal como o cadro de pila de fondo.
Entón principal vai chamar foo, que está indo para obter un cadro de pila.
>> Entón foo vai chamar foo de novo, o que se ve
outro cadro de pila.
E entón, de novo, e de novo, e de novo, e de novo, ata que, finalmente, corremos
no heap.
Entón é así que obtemos un estourido de pila.
E, neste punto, SEG culpa.
Ou realmente SEG fallo antes este punto, pero si.
>> Audiencia: É núcleo despexar o aínda que culpa seg?
>> ROB: Entón verás segmentación núcleo culpa despexado.
Vostede gañou un dump de memoria cando vostede SEG culpa.
E é como unha descarga de toda a contido da súa memoria actual
que pode tentar identificarse por que SEG falla.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón, significa un fallo de segmento hai un estourido de pila.
Entón, non necesariamente.
Un fallo de segmentación significa que está memoria tocar de forma
non debe ser.
Polo tanto, unha forma de isto acontecer é que, cando ti estourido de pila, comezan tocar
memoria dunha forma que non hai que ser.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón, dentro dun loop infinito.
Como, é dicir como un infinito recursiva loop e entón temos outro
pila encadrar cada vez.
Pero só dentro dun estándar infinita, mentres que un -
ben, non imos nin imprimir f -
facer algo.
É igual.
>> Non imos estar recibindo outro cadro de pila.
Nós só estamos indo a perder looping sobre esta única instrución.
A pila non está crecendo.
É o feito de que cada recursiva chamada está nos dando un cadro de pila.
É por iso que temos un estourido de pila.
Si?
>> Audiencia: Entón, se dixo para o while e logo, [inaudível]?
>> ROB: Entón, se dentro do loop while había un printf, aínda
SEG non falla.
Eu só non quero confundir as cousas.
Sería loop.
Quere obter unha única pila marco ao printf.
>> Entón printf ía volver.
Entón ciclo de novo.
Quere obter unha única pila marco ao printf.
Ía volver.
Cadro único pila.
Entón non está a recibir ese infinito acumulando cadros de pila.
>> Audiencia: [inaudível]?
>> ROB: si.
Entón ese estourido de pila pasa porque ningún deles
chamadas a foo están volvendo.
Entón, se volvemos, entón poderiamos comezar a perder cadros de pila.
E, entón, non sería estourido de pila.
E é por iso que precisa dun caso base para as súas funcións persoais.
Si?
>> Audiencia: É o tamaño potencial ea apilar para a pila o mesmo para
todos os programas?
>> ROB: Aproximadamente.
É o tamaño do potencial da pila e a pila a mesma para todos os programas?
Preto.
Hai uns randomização para onde a pila é iniciada e
onde a pila comeza.
Se ocorrer de ter unha chea de variables globais e as cousas, pode
aproveitar algún espazo para a súa heap.
>> Nun sistema de 64 bits, que practicamente ten memoria infinita.
Hai tanta cousa.
Entre 32 bits e 64 bits, que é unha diferenza significativa.
>> Vai ser moito máis pila e heap space nun 64 bits
sistema, xa que non é só enderezos que poden usar.
Pero nun sistema individual, será ser máis ou menos a mesma cantidade de pila
e espazo de pila.
Todo ben.
>> Entón último é a compilación.
Entón ten que saber este proceso.
Existen catro grandes pasos.
Así, o primeiro hai que ser fácil de lembrar.
Vista procesamento.
Ten o pre prefixo nel.
Por iso, vén antes de todo.
>> O único a lembrar o hash.
Así define hash e de hash inclúe en todo isto.
Estas son todas pre-procesador directivas.
Estas son as cousas que o pre-procesador coida.
>> Entón, o que un pre-procesador de facer?
É unha cousa realmente idiota.
Todo o que é capaz de todo isto son operacións de copia, e de corte, e pegar.
>> Entón de hash inclúe estándar i0 punto h.
Que está facendo?
É coller o estándar i0 dot h arquivo e pegalo na parte superior
onde queira que el di de hash inclúe estándar i0 punto h.
>> E calquera hash de definir que temos ver, que é o que está facendo?
A súa copiando o valor que a suma defínese como definido e pegado que
onde queira que está a usar o valor.
Así, o pre-procesador só fai realmente operacións de texto simple baseado.
El non fai nada intelixente.
Entón, todo o demais é máis complicado.
>> Polo tanto, agora que é pre-procesador feito, nós realmente compilar.
Entón, o que compilando significa?
Estamos indo de código C ao código de montaxe.
Si?
>> Audiencia: [inaudível]?
>> ROB: Si, pegamos iso.
Entón compilar.
Estamos indo de C para a montaxe.
Polo tanto, esta é un cambio de linguaxe real.
Compilar-se significa ir de unha linguaxe de alto nivel para
unha linguaxe de nivel máis baixo.
>> Ec é unha linguaxe de alto nivel en comparación coa montaxe.
Que é montaxe?
As súas instrucións que, moi moito, feito para o seu CPU.
Pero o equipo aínda non Non entendo de montaxe.
El só entende uns e ceros.
Entón, o seguinte paso é a montaxe, que lévanos a partir desas instrucións que
súa CPU comprende e realmente traduce-las,
os uns e ceros.
>> Entón C para montaxe de binario.
Pero eu non teño un executable aínda.
Entón, creo que da biblioteca CS50.
Nós fornecen-lle con un binario para esta biblioteca CS50, que ten GetString
e GetInt e todo iso.
>> Pero a biblioteca CS50 -
por si só - non é executable.
Non ten unha función principal.
É só unha banda de binario que pode usar.
Entón conexión é así que reunir todos destes ficheiros binarios distintos
nun arquivo executable real.
Un que podes escribir dot cortar un punto fóra.
>> Entón, iso é como o ficheiro que escribiu, - calquera que sexa o seu programa é -
Ceaser punto c.
Pero agora compilouse abaixo para binario.
Entón Ceaser punto o.
E este é o noso bibliotecas CS50 binario.
E eles están a ser combinadas nun único executable.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón, primeiro inclúen, lembre, incluír o hash é en realidade un
etapa de pre-procesador.
Pero iso é separado.
Se non está a usar as funcións que están fóra do seu arquivo único, a continuación,
non, non precisa de conexión nada pois ten todo.
>> Dito isto, printf está a ser conectado dentro
Se nunca usar printf, iso é algo que ten que ser ligada en
porque non escribiu isto.
E, de feito, printf automaticamente ligada dentro
Vostede sabe como na liña de comandos ou cando escribe make, ve que ten
trazo l CS50, que ten conexión na biblioteca CS50?
Printf, e cousas así, vai para ser conectada automaticamente.
Calquera outra dúbida sobre algo?
>> Audiencia: [inaudível]?
>> ROB: Vinculación?
Temos unha morea de diferentes arquivos binarios.
Este é o exemplo canónico que usan é a biblioteca CS50.
Nós compilar e dado a vostede o binaria para esta biblioteca CS50.
>> Quere usar GetString no seu programa.
Entón vai e utilizar GetString.
Pero sen o meu código binario para GetString cando compilar o código
abaixo, non pode realmente realizar o seu programa porque GetString cadea é
aínda non completamente definido.
>> É só cando conectar na miña binario que contén GetString que agora, o único
dereito, podo realmente realizar GetString.
O meu arquivo está completo.
E podo executar este.
Si?
>> Audiencia: A vinculación converter o binario para o executable?
Así, mesmo se non ten outra bibliotecas, non sería aínda
necesario traducir o [inaudível]?
>> ROB: Entón un executable aínda é en binario.
É só combinar un todo banda de binarios.
>> Audiencia: Moitas grazas.
>> ROB: Non hai ningún problema.
Algunha pregunta?
En caso contrario, está todo listo.
Todo ben.
Grazas.
>> [Aplausos]
>> Audiencia: Grazas.
>> ROB: Yeah.