[Powered by Google Translate] DAVID J. Malan: Todo ben, iso é CS50, e este é o
inicio de dúas semanas.
Grazas.
Imos comezar con unha chamada.
Estou a piques de marcar 617-erro-CS50.
CS50: Este é CS50.
Para Neno Shuttle, prema 1.
Para comezar de novo, prema 9.
DAVID J. Malan: Entón el dixo para o neno Shuttle, prema 1.
Entón, nós estamos indo para presionar 1.
CS50: Cal é a súa orixe?
Para quad, prema 1.
Mather, prema 2.
Boylston, prema 3.
Lamont, prema 4.
Memoria Hall, prema 5.
Para comezar de novo, prema 0.
DAVID J. Malan: Imos presionar 1 para o quad.
CS50: próximo autobús deixa iso moi minuto a 1:10 PM, e
a continuación, ás 1:20 PM, 1:30, 1:40 PM.
Este é CS50.
>> DAVID J. Malan: Entón esta é a voz do CS50.
E é un exemplo dos tipos de proxectos finais, para
exemplo, pode morder a
o fin do semestre.
Por exemplo, que hai shuttleboy.cs50.net -
en realidade, un proxecto que escribín por primeira vez despois de tomar CS51
cando eu era estudante de graduación.
E a inspiración aquí era naquela época, todo o que tiñan era
os horarios de autobuses impresos de autobuses, e non había
noción de ollar as cousas en liña.
E así eu especie de pomba en un fin de semana, filtrado a través da
impreso, cronograma e portouse para un programa de ordenador.
Na altura, o programa de ordenador ocorreu ser escrito
en C. E, de feito, el foi por Boy Shuttle escribindo nun
piscando ventá como temos benvida a facer ata agora.
Pero ao longo dos anos, ten evolucionado nun instante
mensaxes bot.
El evolucionou máis recentemente a este sitio web, nun
SMS ferramenta baseada, así como para esta ferramenta baseada en voz.
E esta é a información para os tipos de cousas que podes
facer por si mesmo ata o final do semestre.
>> Por exemplo, alí, a versión de texto do Neno Shuttle acontece
para operar como segue.
, No seu teléfono móbil, enviar unha mensaxe de texto 41411 e
a continuación, enviar o sboy símbolo especial, para o neno de Transporte
seguido de A e B, onde A é unha orixe e B é un
destino -
por exemplo, Boylston Espazo Quad -
o que ten que volver dentro duns segundos é un texto
mensaxe do Neno Shuttle dicir exactamente cando o
próximos autobuses son poucos, que o punto A, que vai
punto B.
E este é un exemplo máis xeral do que se coñece como
utilizando unha API.
>> Así, por exemplo, este aquí é só shuttleboy.cs50.net, o
Encarnación web-based real deste.
Pero os datos que subliña este e outros programas que CS50
desenvolveu son todos expostos a todos aquí na forma
de APIs, interfaces de programación de aplicacións.
E iso é só un xeito elegante de dicir que a xente quere en nós
Internet e outros de pasar algún tempo a crear
software que pode usar para pegar os datos de nós e
a continuación, construír os seus propios aplicativos enriba
de que o conxunto de datos.
Así, por exemplo, este Shuttle páxina da API do neno aquí, que
pasa a ser o manual CS50, esencialmente documentos
como pode ir en pedir CS50 servidores de datos.
Por exemplo, se vostede está familiarizado con arquivos CSV, coma
valores separados, estes son só unha especie de rápido e sucia
Excel-como arquivos.
Entón pode preguntar Boy Shuttle para todos os datos en toda a
casas e coordina seus GPS, e vai ter
volta, esencialmente, unha folla para que
entón podes ler nun programa da súa preferencia e, a continuación
xerar resultados, como Neno Shuttle si
pasa a ser facer.
Para os máis familiares, representacións máis modernas de datos
inclúen JSON, JavaScript Object Notation.
Algo vai voltar a vostede dirección
o fin do semestre.
>> Pero, de novo, esta é só unha das varias APIs do propio CS50.
E a cousa excitante agora, nestes días, Facebook e
Twitter e Google e practicamente todos os web popular para fóra
alí ten algún tipo de API, o que significa que se ler o
documentación no seu sitio web, que rexistrarte para unha
conta, pode entón comezar a escribir software encima
calquera ferramentas ou datos da empresa que ofrece.
E así un dos nosos compañeiros de ensino propios un par de anos atrás
escribiu unha versión para Mac deste.
Entón, o enlace titulado Mac aquí na esquina superior esquerda, pode realmente
descargar dun Mac OS Widget que executa no seu propio Mac para facer o
mesmos tipos de cousas.
Entón, é todo sobre a construción encima de conxuntos de datos como estes.
Pero máis sobre iso ao final do semestre.
>> Entón, imos mergullar en rápido real a un erro, só para obter o tipo de
cousas Calefacción hoxe, e pensar no pasado algúns dos
cousas que mirou a semana pasada.
En particular, deixe-me ir adiante e puxe-se, por exemplo,
Neste exemplo aquí.
Buggy1.c, este está dispoñible na páxina web do curso se
quere baixa-lo e picar en torno a si.
Pero imos zoom aquí neste programa moi curta, e só
unha recapitulación super-rápido dalgúns dos bloques básicos de construción que
realmente estamos indo só para comezar a tomar para concedida.
>> Entón, as cousas azuis, nas liñas 1 ao 9, son só
preguntas softball.
Entón, estas son só comentarios.
Eles non teñen ningún significado funcional.
Pero son comentarios no sentido de que son notas que
Eu, o ser humano, feito para min para que na clase e despois
charla, eu lembro que este programa
fai sen ter que lelo liña por liña e
recriando a historia na miña mente.
Ademais, se eu entregar este programa a outra persoa como
ti, é moito máis clara para ti, por mor de comentarios como este,
o que o programa está realmente facendo, ou polo menos o que o
programa debería estar facendo.
Se é ou non é correcto é outra cuestión.
Agora, en C, con comentarios de varias liñas, recordar que na liña
aquí é o símbolo máxico, / *.
Isto significa que aquí vén o inicio dun comentario.
E nada máis importa, ata chegar ao final de terminación,
que é * /, o oposto.
Entón o feito de que eu teño 80-algunhas estrelas estrañas aquí
esquerda a dereita é realmente só un detalle estético.
Non ten ningún significado funcional.
>> Agora, que tal liña 11?
O que isto fai en termos leigos?
¿Que é iso?
Audiencia: Inclúe o estándar.
DAVID J. Malan: OK, xenial.
Por iso inclúe a biblioteca stdio.h.
Entón, o que significa isto?
Ben, dentro dese arquivo, stdio.h, son unha morea de
declaracións de función -
é dicir, o código que alguén escribiu.
É un exemplo perfecto dunha función que é declarada no
stdio.h é -
que favorito ata agora?
Así printf, unha das máis comúns de usar, seguramente
En principio, a partir desa biblioteca e alí.
Se eu eliminar esta liña de código, Clang vai berrar
para min algo sobre o uso dun símbolo non declarado.
Algo non declarado é, probablemente, a palabra clave, pois
non informado ao compilador o printf parece
como se non incluír esta liña.
E máis para a Terra, realmente, o que esta liña está dicindo é
abrir este ficheiro, stdio.h, onde queira que sexa sobre a do servidor
disco duro, ou disco duro do aparello, e copiar-pegar-lo
alí no meu arquivo, sen a miña
ter que facelo manualmente.
>> Agora, unha vez que temos aquí abaixo a principal, en pouco tempo imos comezar
provocando separar o que int e que o baleiro é.
Pero, por agora, imos ollar para as tres liñas
no prazo de 15 a 17.
Este aquí eu reivindico como buggy.
Liña 7 meus comentarios di "Se imprimir 10
asteriscos, pero non. "Por que iso non imprimir, de feito,
10 desas estrelas?
Audiencia: [inaudível].
DAVID J. Malan: Exactamente.
Entón, observe que estamos empezando a contar a partir de 0.
E iso é realmente unha convención na programación e
ciencia da computación en xeral, comezando a contar
a partir de 0 en vez de 1.
E este realmente só deriva do feito de que, para
exemplo, cando tivemos oito persoas no escenario, cando
ninguén estaba levantando a man, eles foron
todos os ceros de forma eficaz.
E por iso é só unha especie de convención ordenador así,
polo tanto, para iniciar a conta de 0.
Se ese é o menor número que pode representar en binario.
>> Entón aquí comezan arrincar i a 0.
Creamos i igual a 0.
Pero entón eu cometín este erro aquí, dicindo que eu é menor ou
igual a 10.
Pero se pensas que, por medio, se eu comezar en 0 e entón eu vou
ata 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, eu estou indo realmente para
imprimir 11 estrelas para a pantalla, porque eu teño ido ata
a é igual a 10.
Así, a corrección doado aquí, entón é o que?
Audiencia: [inaudível].
DAVID J. Malan: Só cambia-lo para menos.
Se realmente quere, pode facelo.
Pero, en xeral, que é desaprovada.
E así comeza a contar a partir de 0 é só algo que ten que
normalmente se acostumar.
Agora, o que dicir de toda esa construción en si?
Esta liña 15 demarks un loop.
Así, para non é unha función.
É só unha declaración.
É unha construción de loop, como vimos no scratch.
E ten tres partes.
Nótese que hai a primeira parte a
á esquerda do punto e coma.
Hai a parte do medio, entre as dúas comas.
E despois hai a parte da man dereita cara á dereita
do punto e coma segundo.
Agora, o primeiro deles fai o que?
Audiencia: [inaudível].
DAVID J. Malan: Volve alí?
Si?
Audiencia: Inicio.
>> DAVID J. Malan: Inicio.
Entón, o que significa isto?
Declaramos unha variable chamada i.
El é de tipo int, porque eu especifiquei int i.
E estou inicializando i como o valor 0.
Entón, o que iso realmente dicindo?
É efectivamente dicindo ao ordenador hey, dáme o suficiente
memoria RAM, o suficiente para atender un número, e despois poñer o
número 0, en que pedazo de memoria RAM.
E como un aparte, quão grande é un int normalmente, polo menos dentro
do aparello?
Audiencia: 32 bits.
DAVID J. Malan: 32 bits.
Entón isto significa que me dar 32 bits, tamén coñecido como 4 bytes,
e poñer o valor 0 na mesma, o que é moi doado, porque
Significa só que definir todos os bits a 0.
>> Entón, agora, a segunda parte aquí é a condición.
E a condición de que, como o seu nome suxire, é o que se verificar
de novo e de novo e de novo para saber se é certo ou falso.
Polo tanto, este é só dicir facer as seguintes liñas de código -
ou sexa, liña 16, porque esa é a única recuado
baixo -
sempre que i sexa inferior a 10.
E despois de cada iteração través deste circuíto, faga o
incrementação, o que neste caso é a i + +.
Agora, isto non ten que ser i + +.
Pode ser i -.
Pero se eu fixese iso, o que está a suceder o comportamento
ser deste programa?
Audiencia: Vai ser un loop infinito.
DAVID J. Malan: Vai ser unha especie de loop infinito,
a non ser que teña sorte despois de 2 millóns negativo ou así.
Quizais as cousas van involucrar, só pola natureza do finito
número de bits que foron afectados por un int.
Pero é, certamente, vai repetir moito máis do que 10 e
seguramente máis de 11 veces aquí.
>> E agora, como un aparte, entender que i + + e i -
son realmente só azucre sintático.
É só notación abreviada para o que é un pouco máis
explicitamente escrito do seguinte xeito:
i = i + 1.
Isto é o mesmo que o i + +.
É só unha especie de aparencia máis bonita para dicir i + +.
É máis sucinta, máis lexible.
E así a maioría das persoas que, en vez.
Pero esta é idéntica funcionalmente
o que acabamos de ver.
Así, en breve, a solución rápida aquí é só para dicir iteração i
desde 0 por todo o camiño ata menos que 10.
E entón nós imos realmente obter 10 estrelas.
>> Entón, imos tentar iso.
Deixe-me abrir o terminal na parte inferior.
Deixe-me ir ao directorio que esta está dentro
E eu vou recompila-lo manualmente con Clang por agora.
E eu estou indo a compilar isto como buggy1.c, Intro.
E agora buggy1, por que non hai tal ficheiro ou directorio
buggy1 chamado?
Audiencia: [inaudível].
DAVID J. Malan: Yeah.
Polo tanto, é en realidade chamado a.out.
Entón, se só recordar executar Clang, onde é o Clang
compilador, e non especifica o nome que quere
dar ao seu programa, que vai para o estándar para a.out.
Entón, en realidade, se eu fago ls -
oops.
E eu didn't - a cuestión en branco e negro algúns dos
vostede afrontou foi corrixido.
Pero deixe-me facelo.
Hai que ter a.out no lado da man esquerda alí.
Entón temos que correr a.out en vez de buggy1.
>> Entón deixe-me ir adiante e facelo.
. A.out /, Intro.
E eu, ao parecer, non facer o que?
Audiencia: Gardar.
DAVID J. Malan: Gardar o meu arquivo.
De xeito que é facilmente resolto por bater S de control, ou vai
Arquivo, Gardar, como na maioría dos programas.
Deixe-me ir aquí abaixo, limpar a pantalla, executa-o de novo.
E aínda hai un erro.
Entón o que está a suceder -
Audiencia: Non compilar.
DAVID J. Malan: Ah, bo.
Non recompila-lo.
Como un idiota, eu estou ollando para o código para ver o que está mal.
Entón buggy1.c bumbum, agora a.out.
E Ufa, salva.
>> Polo tanto, parece un pouco feo, porque non hai ningunha nova liña
en calquera punto do programa.
Pero, de novo, iso é só un detalle estético.
E polo menos contamos aqueles fóra, debemos
ver agora 10 desas estrelas.
Ben, que tal este exemplo de calefacción segundo?
Así, en buggy2, eu afirmo que esta versión, tamén, imprimir
10 estrelas, unha por liña.
Entón, esta vez, eu teño un carácter de nova liña, só para facer
as cousas un pouco máis bonitas.
Pero en vez diso o que eu recibín é ese.
Entón deixe-me facer buggy2.c bumbum, Intro.
Agora é novo chamado a.out.
Intro.
Eu só vexo unha nova liña, só a liña de moi novo que pasou
move o meu aviso para a próxima liña.
E aínda claramente eu teño a impresión *, a continuación, unha nova liña,
*, A continuación, unha nova liña.
Pero o que é o erro aquí?
Si?
Audiencia: [inaudível].
>> DAVID J. Malan: Exactamente.
Así, a diferenza de moitas linguaxes, como Python, onde o descenso
En realidade, ten un significado funcional, unha
linguaxe como C -
como veremos, PHP, Javascript -
o retroceso é realmente só para beneficio dos seres humanos.
Entón o feito de que eu teño recuado liña 16 e 17 parece gran,
pero non ten significado funcional aquí.
Se eu queira ambas as liñas para realizar como parte do para
loop, entón eu teño que poñer-los en chaves, facendo iso.
Só podes cortar aquel canto e omitir as claves se
cal é o caso?
Audiencia: só unha liña.
DAVID J. Malan: só unha liña.
Entón, iso é só unha especie de unha especie agradable de detalle de sintaxe, de xeito que
non perda tempo escribindo tres liñas, dúas das cales son
chaves, só para escribir unha soa liña de código.
Pero se ten dous ou máis liñas,
realmente precisa facelo.
>> Entón, agora déixeme gardar este.
Deixe-me ir adiante e re-executar Clang.
Entón deixe-me reprise a.out, e agora eu pegá-los un por liña.
Agora, a.out novo é unha especie de un nome estúpido para un programa.
Como podo saber Clang para realmente me dar un nome de ficheiro
que é máis user-friendly, como buggy2 si?
Un pouco máis claramente?
Audiencia: [inaudível].
DAVID J. Malan: OK, para que eu poida realmente ter moi
amigable de acceso e escribir só facer buggy2.
Eu non especificar. C neste caso, e prema Intro.
E o que fan fai que compila buggy2.c por min
Clang pedindo para facelo.
Especificamente, el chama Clang, corre Clang usando xeito máis
liña de comandos argumentos ou switches que realmente precisa.
Co tempo, imos volver ao que todos eses diferentes
enigmáticas expresións hifenizadas significa.
Pero, por agora, iso é só Aforre-me o traballo de
ter que lembrar e ter que escribir todos aqueles
varias expresións hifenizadas.
E a vantaxe de que, en última análise é
que agora eu teño buggy2.
Se eu queira facer iso manualmente, pero eu
pode, en vez facelo -
clang-o e, a continuación buggy2 buggy2.c.
E que tamén pode dar-me un arquivo chamado buggy2.
>> Entón, en suma, é o compilador Clang.
Facer é só unha ferramenta de fácil utilización que imos usar máis
e máis, porque só comeza a
simplificar as cousas para nós.
E voltar 0 finalmente.
De momento, só porque, pero imos comezar a provoca que parte
hoxe e mércores.
Calquera dúbida sobre isto?
Si?
Audiencia: [inaudível]
ls entre comiñas alí?
DAVID J. Malan: Aceptar.
Cando ls ingresaran entre comiñas, que se me facendo un pouco de maxia
nos bastidores para corrixir un erro.
Esquecín o meu, como temos benvida a dicir que moitos de vostedes no
foros de discusión, que facer -
imos facelo agora - sudo yum-y update appliance50.
Uups, que iso está escrito correcto.
Así, o aparello é como un sistema operativo.
Está funcionando neste sistema operativo chamado Fedora.
E agora por mor da miña conexión de internet lenta, eu teño
realmente hosed iso.
Entón, correndo yum update sudo, como din para facer na
conxunto de problemas, é, esencialmente, gusto de executar as actualizacións automáticas
Mac OS ou Windows.
E a razón para usar esta moito no comezo do
conxunto de problemas é porque cando creamos o aparello, eu
desarrumada, e eu accidentalmente fixo todos os seus programas ollar
negro nunha pantalla negra, que é por iso que non está a ver-os
por defecto.
Pero a versión máis recente do aparello resolve isto.
E eu vou fixar iso durante as vacacións unha vez que teño internet
conectividade.
>> Así, as comiñas só agocha o meu erro, moi discretamente,
aparentemente.
Outras preguntas?
Si?
Audiencia: onde fai ven?
[Inaudível]
DAVID J. Malan: Boa pregunta.
Onde fai ven?
É un programa de Linux que xa existe hai moitos anos, moito tempo
antes CS50.
E ven con un sistema operativo como o Fedora.
El non vén da biblioteca CS50.
En realidade, as únicas cousas que veñen da biblioteca CS50
ata agora, que temos visto, son GetString, GetInt, todos
Obter as funcións e, a secuencia de palabras e, en certa
extensión, a palabra bool.
Pero imos xogar que ademais cando mergullo no CS50
propio aparello.
>> Entón, si, unha pregunta aquí.
Audiencia: Cando dixo facer e, a continuación, buggy, como é que o
ordenador sabe [inaudível]?
DAVID J. Malan: Boa pregunta.
Entón, cando acabou de realizar o make buggy1 ou facer buggy2, como
fai saber?
Entón, por defecto, se escribir buggy1 facer, facer looks para un
arquivo chamado buggy1.c.
E entón el executa os comandos axeitados Clang,
así, substituíndo o ficheiro de saída estándar chamado a.out.
En realidade, se olharmos para o que fan, o que -
imos saír desta.
Se olharmos para o que fan realmente estaba facendo, facer buggy2,
xa está actualizado.
Entón deixe-me aproveitar o comando rm, o
programa que eu escribín antes.
Escribindo Y-E-S para confirmar que quero eliminar-lo.
Se eu agora fan, teña en conta que nesta liña de moito tempo,
hai esa última cousa aquí, o buggy2.
Todos marca está a facer é pasar ese argumento, por así dicir, a
Clang, de modo que eu non teño que escribir-lo eu mesmo.
>> Todo ben, entón un par rápido administrativa
anuncios.
Así, por seccións, que comezou oficialmente o próximo
Domingo, sempre quere traer, se
ten un, un portátil.
Se non ten un portátil, chegan a min por
deixar-me un e-mail.
E nós imos descubrir un fluxo de traballo.
O que xeralmente vai atopar na sección é que son parte
parte conceptual, hands-on.
Nós imos empregar especificamente a sección de preguntas, parte
conxunto da semana problema, para percorrer algunhas das
material conceptual da charla.
E iso é todo o conxunto de problemas actuais.
E nós tamén imos mergullar en algunhas actividades hands-on, ás veces
que será necesario para ser presentado, ás veces de
que non.
Por exemplo, esta primeira semana, eles foron feitos só como un
exercicio de calefacción.
E podes ver que estes problemas son realmente só iso.
Eles foron feitos para ser relativamente pequeno, pero non necesariamente
programas sinxelo de escribir, que non son necesariamente
emocionantes en si mesmos, pero son boas oportunidades para
practicar a sintaxe, con novas funcións, no confort dun
onde ten algúns dos seus compañeiros se presentar como
así como o seu TF.
>> E o que imos facer ao longo do tempo é utilizar unha ferramenta chamada CS50 Spaces,
en que en vez de só usar o dispositivo CS50, vai
en vez de ir a unha páxina web en un navegador, onde pode
escribir código nunha fiestra do navegador durante a sección.
E entón, se optar, o seu compañeiro de ensino pode, entón, amosar
todo o que está escribindo na súa pantalla no seu navegador
fiestra-se na fronte da clase, xa sexa de forma anónima ou
público, para que el ou ela pode, entón, percorrer con
seus compañeiros o que fixo ben, o que non fai ben.
E unha vez máis, a certeza de todo isto pode ser ben anónimos.
Pero vai ser unha boa oportunidade para moito máis
interactividade que algo charla permite.
>> Mentres tanto, nós imos ter esas cousas, chamado de super
seccións, que son opcionais, pero están abertos a todos en
a clase, para que poida facer isto máis colectivamente para
problema definido.
Aquí está o calendario.
Isto tamén é publicado na páxina inicial cs50.net.
Teña en conta que haberá un hacker específica-
unha tarde de mañá.
E imos filmar un hoxe e un mañá e publicar os
online en 24 horas.
Polo tanto, non se non pode facer calquera destas veces, a se preocupar.
E, de novo, o programa está en liña agora cs50.net.
>> En termos de corte en si, debería ter obtido unha
Enviar correo-e coas instrucións para ir á páxina de inicio do curso para atopar
a súa sección.
A vida cambiou e precisa cambiar a súa sección,
non un problema.
Voltar para o mesmo URL, cs50.net/section, singular,
e vai encher o formulario similar, de modo que pode
a continuación, dar-nos as súas preferencias.
E nós imos seguir ata o final da semana, como o que pudermos
acomodar.
A semana pasada, lembre que propuxo utilizar CS50 discutir,
ferramenta do curso, discusión na aula.
Entón, tivemos 40 preguntas que se fixeron e
respostar durante a charla.
Polo tanto, parece funcionar ben, por iso imos continuar
intentando facelo.
Se, durante a charla, non me sinto cómodo levantamento
súa man, non un problema.
Cambiar a cs50.net/discuss, publicar alí, e un do noso ensino
compañeiros van quere respostas la electronicamente ou aumentar a súa
man no seu nome de forma anónima para pedir, dependendo
sobre a natureza da pregunta.
E en termos de producto, en xeral serie de exercicios será
devoltos no prazo dunha semana.
Porque é preciso un pouco de tempo para seccións de acadar
de equilibrio, o primeiro pset, 0 e 1, será un pouco
atrasadas como as cousas se calmaren.
Pero sexa en conta para que nas próximas semanas.
>> Todo ben, entón deixe-me poñer no meu grave
voz por un momento.
Polo tanto, este é realmente un clima interesante para ser
tendo esa discusión, o que con todas as outras cousas
suceder na mesma campus relacionado.
Pero CS50 ten certamente tivo a súa historia deste especial
tema, na medida en que cada ano, este curso, para moitos
anos, Ad-Foros preto de 3% da clase.
Este ano, máis recente, de 2011, CS50 Ad-embarcado de 35 alumnos.
Este non é, penso eu, debido á falta de claridade.
Comprender que, no transcurso do programa, existe unha páxina de
Declaración explicando onde as liñas son.
Esta afirmación repítese en cada un dos
problema define na primeira páxina.
>> Entón eu falar iso hoxe realmente só para facer
persoas conscientes deste.
E nós tratamos cousas distintas.
E o que eu penso que ía facer hoxe é só ter un momento para
realmente ollar para algúns dos casos do pasado que xurdiron.
En vez de manter estes segredos tan sucios, en realidade
apuntar que os alumnos fixeron e como temos detectado
e realmente o que a motivación principal é a
mesmo tendo esa conversa.
Entón, o que dixo, a liña é esencialmente iso -
por programa, é benvido, que son animou, para
falar con compañeiros de clase.
Ese é o propósito de ter estes colaborativo
o horario de expediente en Annenberg e incentivar a xente a
final do proxecto para traballar xuntos.
Pero a liña é deseñada cando chega a hora de realmente escribir
súa solución final.
Falando en inglés, totalmente ben, falando en código pseudo
totalmente ben.
Correo-e a un compañeiro seu pset, deixando os mirada
a pantalla como as mans segue escribindo,
ao longo da liña tamén.
Non ollar para o currículo para as liñas específicas.
>> Pero só para pintar un retrato de como este é, por desgraza, unha
realidade, entender que hai sitios por aí que
ter solucións dende esta clase e moitas outras clases.
O feito de que vostede ou preto de 3% de vostedes saben que iso existe
significa que sabemos que iso existe.
O feito de que hai sitios como este onde
Pode pagar alguén para realmente facer os seus xogos de problemas - que foi
un caso real que xurdiu o ano pasado.
Este é un sitio chamado odesk.com.
E Tim era o nome da persoa aquí que estaba postea en
esta web e pediu a alguén para facer o seu pset 7 en
Neste caso en particular.
Ben, é moi odesk.com Google capaz, e nós tamén somos
moi bo buscando.
Aquí, tamén, hai sitios - e este é bastante
atroz, francamente.
[Risas]
DAVID J. Malan: O divertido sobre esta web é se
ler a páxina sobre eles falan sobre a súa empresa
cultura e como o servizo ao cliente é o seu número un
prioridade, para asegurarse de que as súas atribucións chegar
virou á hora.
>> Pero, falando serio, de novo, o feito de que estes sitios
existir, entendemos que tamén son conscientes de
Estes tipos de sitios.
E para dar unha sensación de que xeito iso xeralmente
leva, xeralmente non ten grandes escándalos, onde as persoas
están a colaborar en calquera tipo de escala, senón
É nestes momentos de fin de noite de debilidade, que ten así
moito por facer, é 04:00, está exhausto, e
pensar a si mesmo, así, deixe-me dar un ollo no meu
compañeiro de cuarto ou o código do meu amigo ou similar.
E as manifestacións desta desgraza participa Estudante
Un algo a presentación como esta e presentación de B Estudante
algo así, que seguramente nun computador
ciencia de clase, é moi doado para os científicos da computación
para detectar con software.
Este é outro paradigma común, onde teño a sorte de
está a traballar ao lado de alguén, quizais falando en
Inglés, así pseudocódigo.
Pero entón chega a hora de realmente presentar, e os serie de exercicios
só se trocadas por correo electrónico ou Dropbox ou similar.
Pero, nunha tentativa de facer menos evidente que esta é
o que pasou, entón é iso que está sometido.
Isto, tamén, non fai viaxe ata ben escritos pezas de
software como o que temos que realmente detectar
Estes tipos de cousas.
E de feito o que facemos é un programa de execución que compara todos
submissões deste ano contra todo o pasado ano
submissões, contra todo o que atopamos na
Internet, contra calquera sitio de emprego alí fora.
É todo moi automatizado.
E, así, facelo moi xustiza gran os 97% que
están realmente traballando súas Bundas neste e noutros
clases e poñendo en todos os que o esforzo para que o traballo
eles finalmente presentar é a súa propia.
E podo ir as idades.
>> Estes son só un puñado de casos do ano pasado.
Algúns alumnos sometidos estes arquivos da mesma forma para pset 2,
pset 3, pset 4, pset 5, pset 6, pset 9.
Neste caso, esta foi cuestionario 0 e no último ano, onde dous
estudantes presentado esta frase idéntica entre moitos
outros, "A petición do tipo -" punto, punto, punto.
Así, mesmo nunha clase de 600 que detectar esta
en cuestionarios presentados.
Así, en breve, este -, francamente, eu odio ter este tipo de
conversa - pero este é realmente un esforzo deliberado
este ano para intentar reducir este número.
Porque mesmo que dicir que estes tipos de cousas cada
anos, eu creo que a realidade de ter morado nela para poucos
máis segundos que o habitual e, en realidade, só apuntando
que o que pode parecer, non é, non un negocio tan grande, polo menos
creo que volve a este momento especial, tanto na xustiza para
si mesmo e para os seus compañeiros aquí.
Entón, se ten algunha dúbida respecto de onde a liña
é, por favor, chegar a min persoalmente.
Pero a resposta é sempre, completamente estrés no
último minuto, diñeiro en un día de atraso.
Ou se é unha cuestión de non ter ningún día de atraso,
honestamente, me e-mail persoal.
Nós imos descubrir algo.
Por favor, non poña o tempo aquí en Harvard en perigo.
>> Agora, eu penso que debería aliviar o clima, entón eu
incluído este como o seguinte diapositiva.
[Risas]
DAVID J. Malan: Este sitio web foi excelente.
Eu realmente teño un pouco distraído.
Hai un regalo.
E entón este foi incrible.
Ok, entón pense que gatinho tarde da noite ao facer
destas decisións.
Todas as cousas, dalgún xeito de volta para máis diversión e menos grave, como
condicións.
>> Todo ben, entón nós falamos un pouco sobre iso.
Iso é algo que probablemente é bastante familiar a partir de
o mundo do scratch.
E no mundo do scratch, temos esa necesidade, por veces, a
ir facer garfos na estrada.
Ou iso ou aquilo ou esta outra cousa aquí.
E cando a xente quere facelo, podemos utilizar, en C agora, iso
outra construción.
E entón aquí temos expresións booleanas.
Por exemplo, expresións booleanas aquí, podemos OU
los en conxunto, no sentido de que teñen esta condición OR
esa condición.
Podemos e xuntos, no sentido de que queremos
comprobar esa condición e esa condición.
E aquí temos un switch agora, que non é tan
sintaticamente semellante a eses tipos de condicións, pero
nos permite facer o equivalente a if, else if, else if, else
, e semellantes, bastando enumerando-los, caso a caso
a caso a caso.
Entón vimos os da última vez.
E entón comezamos a tocar cousas como loops.
Vimos un destes só un momento atrás.
Pero hai esas outras construcións de looping.
>> Por exemplo, este aquí.
Así, mentres (condición), facer esta cousa de novo e de novo.
Entón, fundamentalmente, o que parece ser diferente entre esta
loop e este loop mentres aquí?
Este loop e este loop while.
Si?
¿Que é iso?
Audiencia: [inaudível].
DAVID J. Malan: Gran.
Así, mentres na súa condición de loop, hai claramente
sintaxe máis.
Hai esa inicio, hai esta actualización.
En un loop mentres, só hai esa condición.
Polo tanto, parece que é un pouco preparados para abaixo en relación ao
loop, o que significa que, se quere ter variables e queremos
ter incremento, nós realmente temos que
facelo nós mesmos.
>> Entón deixe-me ir adiante e abrir gedit.
Deixe-me pasar o aparello.
E imos facer un rápido exemplo de que
distingue un destes a partir do outro.
E no fondo da miña mente aquí, debo dicir unha cousa.
Eu especificamente mencionado o nome de Tim
Tim era, en realidade, alguén que un estudante intentou atopar para facer
seu deber de casa para eles.
Nós non tivemos ningunha Tim que en determinado punto.
Entón entender, para que eu non difundido un estudante, que non era un alumno.
Era unha persoa aleatoria en internet facendo cousas
o ano pasado proxy.
Entón nós cremos que, tamén.
Polo tanto, neste caso aquí, deixe-me ir adiante e
abrir un novo arquivo.
Arquivo, Novo.
Tanto me dá unha guía aquí.
Deixe-me ir adiante e salva-o como loop.c.
Deixe-me ir e prema en Gardar.
E entón, aquí, imos adiante e comezar a escribir
# Incluír.
Deixe-me facer zoom in
Agora imos facer int main (void).
Agora déixeme ir adiante e facer a (int i = 0; i <
oh, 10; i + +).
E agora eu estou indo para adiante e non imprimir a estrela que
fixo anteriormente.
E entón, ao final deste programa, nós só estamos indo a
imprimir unha nova liña, só para que o meu poder
non mirar todo desorde.
voltar 0.
Parece sintaticamente correcta?
Ata agora.
Entón, imos ver.
>> Entón deixe-me afastar, ir para a miña xanela de terminal.
E deixe-me ir adiante e executar loop, porque eu chamei esta
loop.c. cousa
Entón faga loop.
Parece compilar Aceptar.
Déixame correr loop, e agora Intro.
E parece impreso 10 estrelas.
Entón imos converter isto en un loop while para ver o que
tipo de cuestións que tropezar.
Entón, en vez diso, deixe-me entrar aquí e dicir mentres i é
inferior a 10 -
deixe-me librar do lazo é.
OK, entón temos algúns problemas xa.
Así, a condición é a mesma, pero eu estou, obviamente, falta a
inicio.
Estou perdendo a incrementação.
Entón, o que o compilador probablemente dicirme cando intento
compilar este programa?
Si?
Audiencia: [inaudível].
>> DAVID J. Malan: Gran.
Por iso, vai dicir algo así como non declarado - neste
caso, a variable i.
E, de feito, o uso do identificador non declarado i.
E así, en contraste con linguaxes como PHP e
Python e Ruby, coa que algúns de vostedes poden estar familiarizado,
onde podes só unha especie de inicio utilizando variables
Queres ou non, e non se preocupe cos declarar
explicitamente sempre.
C e en linguaxes como Java e C + +, ten que ser
Super explícito.
E se queres unha variable chamada i, ten que me dicir
o tipo de variable que é.
Entón nós imos ter que resolver iso do seguinte xeito.
Vou ter que ir ata aquí e escriba int i, polo tanto,
Teño declarado dunha variable chamada i.
Agora, eu teño pulado un paso.
Eu, obviamente, non inicializar, pero imos ver que en
parada polo Clang marcas reclamando.
Entón deixe-me refacer este programa.
>> Todo ben, agora é só solicitar
por unha razón diferente.
"Variable" i "non é inicializar cando se emprega aquí." Todo ben, entón
iso é moi explícito.
Inicializada só significa define-lo igual a un valor.
E nós non fixemos iso, entón deixe-me tentar igual a 0.
Agora imos tentar iso de novo e volver a executar Clang.
Compilados neste momento.
E eu estou a piques de executalo.
Pero lazo vello gran infinito, porque eu fixen o
inicio, eu fixen a condición, pero eu nunca fixen
calquera tipo de incremento.
Entón, como podo facer a incrementação?
Ben, en un loop while, parece que eu vou ter
para facelo dentro do loop, porque así como o primeiro
exemplos semana de facer construcións de iteração, como con
as medias e coa auto-conta, tivemos que facer
algo ao final, como ir de volta para a liña seguinte.
E se eu ir adiante e facelo i + + aquí?
Non imos nin compilar este.
Colle-me xa.
O que está mal aquí?
Audiencia: [inaudível].
>> DAVID J. Malan: Entón, en definitiva non é int.
É i.
E as claves, como antes,
retirada non é suficiente.
Entón agora eu teño esa construción.
Entón, mentres eu sexa menor que 10, imprima unha estrela,
entón incrementar i.
E a forma dun tempo obras de lazo é que, logo que usar o
inferior da alza, o que neste caso parece a liña 10,
vai volver para a liña 6, altura en que o
condición verificarase de novo.
E se eu aínda é menor que 10, imos facer liñas 8 e
a continuación, 9, despois imos acertar 10, e volver a 6, de novo e de
de novo e de novo e de novo, sempre que i é menor que 10.
Entón imos voltar a executar facer aquí.
>> Ok, nós compilamos ben.
Deixe-me volver correr loop.
E agora, en realidade, parece funcionar.
Entón pros e contras aquí?
Ben, ata agora non hai, en realidade, un conxunto de Plo -
tan bonito.
Todo ben, que era un - Ah, iso foi un accidente.
Todo ben, entón imos volver para o loop.
Así, para os loops son bos porque son super explícito.
E aínda que eles están un pouco desajeitado para escribir, é
moi poderosa e permite que faga
varias cousas ao mesmo tempo.
Mentres lazos non parecen ter unha enorme cantidade de valor só
aínda, porque parece que só temos que facer máis traballo.
Temos que poñer o arranque ata aquí, o
actualizar aquí, e temos que lembrar de facer todo isto.
Entón, imos ver co tempo que lazos, mentres en realidade prestar
si a só distintos contextos, datos diferentes
estruturas como listas e táboas de hash, cousas que nós imos chegar a
mediados semestre.
Pero, por agora, sei que hai este terceiro tipo coñecido como un do-
while.
E vimos que brevemente.
E iso pode ser super atenciosa con pset 1.
Cada vez que quere facer algo e despois comprobar se
o usuario colaborou, e non o fixo, fai-o de novo, un do-
while se presta a este tipo de lóxica.
Porque, como a ordenación de arriba para abaixo aquí suxire,
que significa, literalmente, facer iso.
E facelo de novo e de novo, o que pode ser iso?
Quizais iso signifique GetInt chamada ou GetString e despois
comprobar o valor de GetInt ou GetString e gritando
ao usuario no caso de que non teñen cooperar, pedíndolles
de novo e de novo e de novo.
Onde quere facer algo novo,
a continuación, comprobar algunha condición.
>> Entón, imos tentar iso.
Deixe-me realmente cambiar isto agora para un loop do-while.
E eu estou indo a ir adiante e facer o seguinte.
Entón faga o seguinte.
Imos facer int i = GetInt (), pero imos primeiro dicir que o usuario
o que facer.
Entón, un pouco diferente desta vez.
"Deixa-me un int".
Entón, eu vou usar printf para iso.
E agora eu vou baixar aquí, e eu vou facer iso
mentres i é, digamos, máis que -
imos ver, i é, digamos, menos que 0, ou i é
superior a 10.
Noutras palabras, é un número do 1 ao 9, só
arbitrariamente.
Entón, eu estou usando unha expresión combinada Boolean aquí para
asegurarse de que i sexa inferior a 0 ou superior a 10, en que
caso, vou facer este loop aquí de novo.
Entón, de novo, facer iso -
mentres i é menor que 0 ou i é maior que 10.
>> Entón agora imos seguir adiante e facelo unha vez que fixemos iso.
Imos facer unha proba de sanidade rápido.
printf ("Grazas, i é% d", i).
Polo tanto, este programa simple pide ao usuario a un int,
asegúrese de que está dentro dalgún intervalo de 1 a 9, inclusive,
e despois agradece ao usuario, lembrando-lles o que eles só
escritas, así como unha proba de sanidade pouco.
Pero imos ver se isto funciona como desexado.
Deixe-me ir de cabeza para baixo aquí e volver a correr facer loop.
Hmm
"O uso de identificador non declarado 'i'". Isto é raro.
Eu penso que nós resolvemos isto.
Mesmo síntoma, pero de código diferente.
Si?
Audiencia: [inaudível] dentro de dous, temos que
[Inaudível].
>> DAVID J. Malan: Exactamente.
Entón, iso realmente nos leva a un tema coñecido como ámbito.
Acontece que C, de novo, realmente leva literalmente.
E se fai algo así como este onde declarar un int
e despois asignar-lle un valor, pero fai iso dentro dunha
par de chaves, o que C fai é el asume que
só quero os bits 32, coñecidos como i para existir dentro do
contexto destas chaves, dentro do contexto de liñas
6 a 9. Entón eu é declarada, e é asignado un
valor na liña 8, pero logo que comeza fóra de
liña 9 debaixo da chaveta, eu xa non está en
ámbito, por así dicir.
S-C-O-P-E. Non é máis no contexto correcto.
Polo tanto, agora non hai i, por iso é coma se non tivese mesmo
declarou el en todo.
>> Entón, o que é unha corrección a continuación, para algo como isto, o
razón é que eu sexa declarada dentro das chaves, que
aparentemente é malo?
Aquí?
Audiencia: [inaudível].
DAVID J. Malan: Yeah.
Así, podemos arrincar-lo fóra.
Entón deixe-me ir adiante e eliminar as partes declaración na que
Eu especificar o tipo, e deixe-me facelo aquí.
Así, na liña 5, que agora di "Deixa-me un int." Chama-o i.
Obsérvese na liña 9, eu non quero facer iso, porque eu
xa ten os bits 32.
Eu non quero pedir ao ordenador por un
diferentes de 32 bits.
Eu quero usar eses mesmos 32 bits.
E agora, porque eu é declarado en liña 5, aínda é lexítimo
usalo na liña 11 e liña 12.
>> Entón deixe-me tentar recompilar iso e ver
se Clang deixa de berrar.
facer loop.
Polo tanto, agora é "declaración implícita da función
'GetInt' non é válida na C99. "¿Que é iso?
Si?
Audiencia: [inaudível].
DAVID J. Malan: Yeah.
Polo tanto, agora que eu estou realmente usando GetInt, iso non é algo
que só vén con C. Isto vén de CS50.
Entón necesitamos diso aquí.
E deixe-me volver a ventá de abaixo
aquí e re-executar o make.
Ok, finalmente.
Agora temos que resolver e que o erro dos outros.
Déixame correr loop e ver o que acontece.
"Deixa-me un int." Vou dar-lle 11.
Eu vou dar -1.
Eu vou dar foo.
Eu vou dar 5.
E agora realmente funciona.
Pero o poder cambiou para unha razón aquí.
¿Por que din que repetir unha desas veces, pero me dea un
int outras tres veces?
Por que o comportamento distinto?
Audiencia: deulle unha corda.
DAVID J. Malan: Sentímolo?
Audiencia: Vostede deu unha corda.
DAVID J. Malan: Yeah.
Polo tanto, deron unha cadea neste terceiro intento,
cando eu escriba foo.
Foo é unha cadea.
Obviamente non é un int.
E de maneira que CS50 aplicou GetInt que
non comprobar se algo é menor que 0 ou maior que 10
para ti, porque como sabemos de antemán o tipo de
int que quere?
Pero podemos minimamente comprobar a vostede, o usuario polo menos
Escriba un número enteiro?
E se non o fixo, nós berrar co usuario escribindo "repetir" na
pantalla.
>> Polo tanto, agora temos un programa que é looping. Okay.
Agora, cal destes é o mellor tipo de construción?
Entón é aquí que as cousas comezan a estar un pouco confuso, o
feito de que ten que se lembrar de declarar unha variable-aquí
Se queres usalo dentro duns
claves e fóra.
Pero aínda que isto parece un pouco enigmática en primeiro
vista, só unha vez, lembre-se a lóxica simple.
A fin de utilizar calquera cousa en C, se é unha función ou
é unha variable, ten que inclui-lo se é unha función
nalgunha biblioteca, ou precisa declarar.
Pero agora precisa ser consciente extra do feito de que
está declarando que no ámbito dereita.
Non está poñendo moita forza dentro parénteses.
>> Entón deixe-me realmente reverter.
Se volvemos ao noso, por exemplo, de máis cedo, e eu vou
de volta para a int, int i = 0; i <10, i + +, e eu
printf facer estrelas, coma este, a continuación, paren preto, e agora
printf i agora -
de acordo coa mesma lóxica, o que vai ocorrer cando intento
compilar este programa?
Audiencia: identificador válido.
DAVID J. Malan: Entón é outro identificador válido,
identificador non declarado.
Agora, a razón é un pouco diferente.
Hai, obviamente, non hai chaves aquí, pero o mesmo
idea, a mesma historia de alcance aplicable.
Se declarou unha variable como i dentro dunha
loop for, mesmo se non ten explicitamente escrito o crespo
chaves, pensar-los mental como aínda estar alí, en que
caso eu só é válido dentro do loop.
Non é válido cando chegar para a próxima liña, que en
neste caso, é agora 10.
Así, só algunhas cuestións de ámbito e similares.
Todo ben, algunha dúbida?
>> Todo ben, entón ese é un tipo de programa trivial pouco,
imprimir só pequenas estrelas.
Pero imos ver se se lembra desta música aquí.
Esta é unha música moi irritante os nenos cantaban en
o autobús escolar e afíns.
Pero o que é bo niso é que ten esa ciclicidade,
cal é "99 botellas de cervexa na parede,
99 botellas de cervexa.
Tomé un para abaixo, pase adiante, 98 botellas de cervexa na
parede. "E entón a canción repite a 97, despois 96, despois
95, 94, todo o camiño para 0 se realmente ten que
agora no autobús.
Polo tanto, este é un bo programa para clasificar de aplico, porque a miña
Deus, se podería só implementar isto con algúns
liñas de código, pode cuspir as letras enteiras para este
canción moi rapidamente.
Pero ao longo do camiño, podemos comezar agora desmembrar algúns
desas construcións básicas looping e agora tamén
introducir funcións que escribir nós mesmos, volver valores
que pasar ao redor.
Pero, primeiro, por que non ir adiante e ter a nosa cinco minutos
romper aquí?
E cando volvemos, imos cantar esa música.
>> Todo ben, entón estamos de volta.
E cando digo agora imos cantar esa música, quero dicir
programaticamente, non verbalmente.
Polo tanto, temos aquí beer1.c, que é unha implementación deste
música en particular.
E só para quedar claro, para aqueles que non familiarizados co que
esta cousa parece, deixe-me ir adiante
e facer beer1, Intro.
Agora déixeme correr beer1, eo que imos ver - cantas botellas
de cervexa haberá?
Vou escribir en 99, como di a canción.
Intro.
E agora percorrer -
oops - percorrer todo isto, nós imos ver que
este, de feito, cantar a canción enteira.
Espere un minuto.
A miña barra de rolagem é un pouco confuso.
Imos usar a xanela máis grande.
Entón beer1, 99, alí imos nós.
Polo tanto, temos aquí toda a música, cantada moito máis rápido
ordenador que podería ter sido por nós.
Entón, observe, porén, a natureza cíclica aquí.
El di que 99, entón 99, a continuación, "tomar un baixo, pasalo
volta ", entón 98.
E agora repite unha e outra vez.
>> Polo tanto, esta é realmente unha oportunidade perfecta para calquera tipo de
looping construír.
Repare que eu son o tipo de corte de un canto aquí.
Repare que eu estou dicindo "98 botellas de cervexa na parede,
97 botellas de cervexa na parede ", e que era tan
que cando chegamos a un botellas de cervexa, eu non teño
se preocupar coa gramática do inglés.
Pero tamén podemos solucionar isto con un pouco máis de un se
condición, quizais.
Se ese número é singular, vai adiante e dicir "botella",
en caso contrario, se é plural, dicir "botellas".
Pero, por agora, estou completamente corte que canto.
Entón imos ver o que temos aquí.
Entón, nós temos algúns comentarios na parte superior.
Estou incluíndo estas dúas bibliotecas, como
Temos sido comunmente.
E agora déixeme rolar para a primeira
liñas de código.
Liña 17 comeza principal.
Liña 21 e 20 ten o número de botellas de cervexa haberá?
E entón eu chamo GetInt.
E agora eu teño un pouco de unha proba de sanidade.
>> Polo tanto, esta é unha convención que imos agora comezar a adoptar para
máis rigor comprobar a entrada do usuario.
Ás veces só non quere leva-los de novo
e de novo e de novo.
Se o usuario se parafusos e non cooperar, todo ben.
Saia e simplemente non tratar con eles.
E iso é o que eu estou facendo aquí.
Se n é menor que 1, eu estou indo só para berrar co usuario,
"Sentímolo, iso non ten sentido." E entón eu vou
arbitrariamente volver 1.
Entón, de novo, esta é só unha convención para se acostumar.
Por agora, leva-lo na fe.
Pero, ata agora, temos sido sempre retornando 0, porque
dixemos retornando 0 denota o que?
Audiencia: Éxito.
DAVID J. Malan: Éxito, iso é todo.
Polo tanto, agora que finalmente estamos empezando a pensar en
non logro -
noutras palabras, os casos de canto, as condicións de erro -
agora eu teño unha fonte infinita, ou polo menos catro billón
posibles cousas que poden dar mal nos meus programas.
E podo comezar a asignar-lles números individuais.
Agora, xeralmente basta só volver
algo diferente de 0.
Entón, nós imos simplemente voltar un por agora.
Pero a razón para voltar 1 é que, logo que volver
1, creo que o que ocorre co resto do programa?
Que pare.
É iso aí.
Así, o feito de que estou retornando 1 é efectivamente
curtocircuíto a execución deste programa, de xeito que
nada por baixo da liña de 27 continuará a execución.
Así que retorna principais, que é el.
>> Todo ben, por iso, se o usuario fai cooperar e chegar á liña 30
porque digitaram un número lexítimo, aquí é o meu
implantación desta canción.
Entón eu primeiro imprimir un carácter de nova liña, só para
estética.
Agora teño un loop.
E repare que eu estou facendo as cousas con un pouco
dunha dirección distinta.
Eu non teño que facer menos do que, eu non teño que facer + +.
Eu podo dicir que en vez arrincar dunha variable i, configure-lo igual a
n, o número que o usuario introduciu, entón faga o seguinte, de xeito
mentres i é maior que 0, entón i -
unha vez que termine un iteração deste loop.
Así, podemos contar para abaixo, usando un loop tamén.
Agora, esta é unha semana moi cousas agora, con printf.
Así impresión "% botellas d de cervexa na parede." Imprimir "% d
botellas de cervexa. "" Teña unha para abaixo, pase adiante. "Imprimir
"% D botellas de cervexa na parede." Entón aínda é d%, pero
conta que o argumento de printf está cambiando.
Tras a vírgula, teño eu, porque eu quero dicir 99.
Tras esta coma, teño eu, porque eu quero dicir 99.
Tras esta coma, teño i - 1, porque quero dicir 98 en
Esta primeira iteração, e así por diante.
E agora aquí, eu só teño unha observación estúpida.
E despois a liña 42, eu voltar 0, por convención, o que significa que
está todo ok.
>> Entón, o que se eu goofed?
O que pode un erro común aquí estar?
Ben, e eu accidentalmente dixo ben, quero contar
a 0, quero 0 botellas de cervexa na parede?
Entón, digo, i é superior ou igual a 0.
O que vai ser o síntoma que agora podo ver si recompilar
beer1 e executa-lo?
Audiencia: Negativo.
DAVID J. Malan: Si, que vai ir negativo.
Este é un erro off-by-one, incrible
erro común de facer.
Imos realmente voltar á xanela da terminal e facelo
aquí, para que poidamos ver máis dunha vez.
Intro, 99 botellas de cervexa.
Preto, pero fomos sempre tan pouco lonxe demais.
Nós cantamos a música moi baixo, de modo que agora alcanzou o
número negativo.
Por iso, non funciona moi ben.
>> Todo ben, entón podemos facilmente corrixir isto, indo de volta para a
xeito que era.
Pero o que son algunhas oportunidades agora
mellora?
Ben, deixe-me abrir beer2.c e descenda aquí e dar unha
mirar para esta versión.
Cal é a primeira cousa que salta en ti como diferente
nesta versión aquí?
Audiencia: [inaudível].
DAVID J. Malan: Si, así, non máis eu, porque se produciu a
min que vostede sabe o que eu estou pedindo ao usuario para n, e entón eu son
definindo i igual a n, e entón eu vou cambiar eu, pero eu nunca son
n tocando de novo.
Entón o que diaños era o punto de que reservar outro 32
bits chamado i só para que eu poida ter unha variable diferente?
Polo tanto, neste caso, eu medio que recoñeceu que innecesaria
característica de proxecto.
E agora vou dicir mentres n é maior que 0, ir
adiante e imprimir a mesma canción, pasando un n para printf como o
segundo argumento, e n - 1 como o segundo argumento aquí.
E entón, en cada iteração do loop, vai adiante e só
decrementar o propio n.
Agora, funcionalmente, este programa
vai ser idénticas.
Se eu escribir 99, n comeza en 99.
Eu decremento, decremento, decremento, decremento.
Eu estou indo a obter todo o camiño para "Unha botella de cervexa en
a parede, unha botella de cervexa.
Tomé un para abaixo, pase adiante.
0 botellas de cervexa na parede. "A fin, porque eu fixen
obter a condición correcta.
É maior que 0.
Eu non cometer este erro.
>> Entón, o que é mellor, unha versión ou a versión de dous?
Entón eu oín unha morea de murmurios para dous.
Por que dous?
¿Que é iso?
Audiencia: [inaudível].
DAVID J. Malan: Ah, ok.
Entón non vai por baixo de 0, pero lembre, nunha versión, a
versión orixinal correcto non ir por baixo de 0 tamén.
Entón lembre que esta é a versión correcta.
Entón, imos polo menos comparar as dúas versións correctas.
¿Que é un argumento a favor da versión
dous sendo, mmm, mellor?
Si?
Audiencia: El usa menos espazo.
DAVID J. Malan: Ok, entón usa menos espazo, non?
Considerando unha versión de 32 bits usado para n, e despois outro
32 bits para i.
Versión dous só usa 32 bits para n, a fin de que
parece ser unha vantaxe.
Outros pensamentos?
Alguén quere argumentar en favor de unha?
Si?
Audiencia: Ten que usar liña extra de código para n -.
>> DAVID J. Malan: Ok, con certeza.
Entón, iso é xusto.
Polo tanto, este xusto, polo menos para min -
É dicir, que realmente se sente un pouco máis confuso, o feito de que
Eu non podo clasificar de encapsular toda a miña lóxica nun
liña fermosa, o loop, como o lazo sexa posible.
Aquí, eu medio que teño para alinhavar este n -
ao final do ciclo, porque
é loxicamente necesario.
Pero que tipo de esfrega-me o camiño mal, só porque
parece separada da lóxica de ata aquí, aínda que,
unha vez máis, que é necesario.
Outros pensamentos?
Si?
Audiencia: [inaudível].
>> DAVID J. Malan: Yeah.
Así que se en vez diso, ao final da canción, quería
imprimir de novo o nome da música?
Como "Grazas por xogar 99 botellas de cervexa", ou algo así
bobada como esa?
Pero o punto é, quería ter acceso ao valor orixinal.
O feito de que vostede mutado ou cambiado en cada n
iteração e, polo tanto, destruír o seu valor orixinal
Significa que non pode facer iso ao final.
Agora, sen dúbida, nos claramente non quere facer
que neste programa.
Entón, quen se importa?
Pero iso é un punto moi válido.
E para ser honesto, realmente non hai unha
dereito responder aquí.
Ambos son igualmente correctas.
Eu podería ser convencido de calquera maneira.
Podo dicir que, en xeral, é un bo principio, se
preguntou o usuario para algún valor e almacenado nunha variable
como n, só unha especie de en principio, pode ser bo
para manter esta situación.
E todos os datos que quere converterse de novo e de novo, só
darche unha copia da variable, só para que
acceder ao orixinal.
Vostede está gastan máis de 32 bits, pero a realidade é esta
ordenador, como dous gigabytes de memoria RAM estes días,
e nós estamos discutindo sobre 32 bits?
Realmente non un negocio tan grande.
E mesmo neste dispositivo aquí, cunha media dun concerto ou unha
Gigabyte de memoria RAM, 32 bits versus 64 bits,
non un gran negocio.
Certamente, hoxe, que vai ser moi oprimido polo tamaño
do programa en si, que vai ser centos
kilobytes, se non algúns megabytes, estes días.
>> Entón problemas razoables, non unha resposta correcta.
Pero polo menos eses son os pensamentos que debe empezar a
pasar pola súa mente?
Porque en pset 0, aínda que nós realmente só esperar
corrección, ou polo menos a renuncia de varios erros que
pode ter atopado, a medida que avanzamos, o deseño é
vai ser outro aspecto fundamental, tanto de escribir código
e tamén a avaliación de código.
E así, polo menos, reflexionar sobre cousas como esta.
E só porque algo funciona non significa que é bo,
non quere dicir que é ben deseñado.
E iso é unha das cousas que os compañeiros de ensino e
conxuntos de problemas nos axudará a provocar peza ao longo do tempo.
>> Ben, o que dicir, imos dicir, esta versión aquí?
Deixe-me facer algo un pouco sexy aquí nun momento.
Primeiro deixe-me librar desta.
E agora imos corrixir este problema gramatical.
Así, nesta versión, quero corrixir a gramática de forma que,
en vez de só dicir s entre parénteses, como "botella"
ou "botellas" -
Eu non quero cortar ese canto -
Eu tamén quero imprimir dinamicamente a palabra "botellas"
ou "botella", así, usando espazos reservados estes% s hoxe.
Entón eu teño condicional comprobar cal é o valor de i.
E se é un, quero dicir "botella", e se é calquera cousa
outra cousa, quero dicir "botellas". Entón, imos tratar de facelo.
Entón, se eu == 1, entón deixe-me ir adiante e declarar -
Eu teño unha cadea, entón deixe-me facer cadea S1, porque é a
primeira corda que me importa agora.
Eu vou dicir "botella". E entón, imos ver, cadea
S2 - e eu vou explicar a onde estou indo nun momento -
"Botellas". Entón, lembrar que, nesta canción, necesitamos ser capaces
para imprimir cousas, dúas palabras diferentes potencialmente.
Entón, se miramos cara atrás, aquí, conta que cando chegamos ao
este exemplo aquí ", dúas botellas de cervexa na parede,
dúas botellas de cervexa, tomar un para abaixo, pase adiante ", quero
esta cuarta liña para agora dicir "unha botella de cervexa na
parede ". Entón eu teño decidir, quero dicir" botellas "ou
"Botella"? Entón eu vou dicir arbitrariamente, todo ben,
Vou agora declarar unha variable chamada S1 cadea,
un, que vai estar conectado aquí e tamén aquí,
porque esas palabras son sempre idénticos, só por mor da
natureza da música.
E eu vou chamar S2 calquera palabra que quero
eventualmente aparecen por aquí.
Agora, literalmente, 99 veces de 100, que vai ser o
mesmo en ambos os casos, porque 3 é plural, 2 e
plural, 4 e plural.
Pero, neste caso, canto, onde se obter a 2 e, a continuación, 1, ou
mesmo 1 e 0, eu teño esta lóxica.
Entón eu teño que pasar algún tempo no meu código recibindo ese dereito.
Entón, se eu fai iso, i == 1, entón S1 definido igual a "botella"
e S2 igual a "botellas", porque iso vai ser para un
botella, e isto será por 0 botellas.
E este aquí, o que iso supón?
Só para quedar claro.
Este é só un comentario.
Así, o feito de que pode ter comentarios dunha liña significa que
pode comentar o seu código coma este, pero outro común
paradigma, tamén, é que se ten unha frase super-curto que
quere poñer a si mesmo e que é só lexible para poñer
que á dereita ao final da liña de código, pode
absolutamente facer algo así.
>> Entón agora o que se eu fai iso? Else if i non é igual a 1.
Entón estrondo iguais -
punto de exclamación é coñecido como "bang".
Entón estrondo = 1.
Entón, se eu non fose igual a 1, o que quero facer en vez?
Ben, a primeira palabra que quero ser o que?
Entón debe ser unha cadea de "botellas" para botellas plurais,
e entón será plural "botellas", así como, por agora.
E imos ver se isto realmente nos leva a
onde queremos ir.
Polo tanto, agora eu rolar por aquí, entender que eu estou conectando
Non só eu, pero S1.
Estou ligando I e S1.
E, a continuación, aquí abaixo, son menos 1, o cal é o mesmo que
antes, pero S2.
Noutras palabras, quero a palabra inglés para cambiar de acordo
nesa lóxica.
Agora, xa hai algúns problemas neste código.
O que está roto, xa fóra da porta aquí?
Si?
Audiencia: [inaudível].
>> DAVID J. Malan: Exactamente.
Entón eu xa violou a lección de ámbito.
Entón eu dixo S1 e S2, pero eu teño feito isto dentro
chaves, o que significa que, si, ese código pode traballar ata
ata a liña 42, pero así que eu bati liña 43, creo que non
hai máis?
Ben, creo que xa non é de ámbito - nin S1 ou S2.
Entón temos que corrixir isto.
Entón deixe-me borrar as declaracións.
E eu vou deixar os nomes das variables e elimine esta aquí
e eliminar iso aquí.
E en que liñas debo realmente declarar isto?
Audiencia: [inaudível].
DAVID J. Malan: Si, entón, probablemente,
ata aquí, 33-ish.
Así cadea S1 e cadea S2.
E non é que eu podo facer iso.
Se está declarando dúas variables do mesmo tipo,
pode realmente usar só unha coma e facelo en C. Todos
Ben, agora eu teño dúas variables -
S1 e S2.
Estou atribuíndolle lles valores nestes
condicións aquí, ou aquí.
E entón eu estou usando as abaixo.
Como está iso agora vai dar certo?
>> Ben, é aínda un pouco de buggy, pero imos polo menos ver
quão lonxe chegamos.
Entón deixe-me ir adiante e facer beer3.
É este beer3?
Si, este é beer3.
E agora déixeme ir adiante e executar beer3.
399 99.
Probablemente, podemos ignorar a maioría deles.
E aquí abaixo, mira iso.
"Unha botella de cervexa na parede, unha botella de cervexa, tomar
un para abaixo, pase adiante, 0 botellas de cervexa na parede. "
Pero eu estou chamando a súa atención para só a metade da solución.
Tipo de asneira aquí.
Polo tanto, parece que os casos de canto xorden cando i é igual que
dous valores?
Audiencia: 2, 1.
DAVID J. Malan: 2 e 1.
Non é un e non 1.
É realmente só estas dúas últimas estrofas desta música.
Entón o que quero facer en vez?
Así, paréceme ter collido o caso en que se i é == 1,
a continuación, a primeira palabra é "botella", pero a segunda palabra
é "botellas". Pero aquí, quero cambiar isto sexa == 2.
E se este é o caso, o que eu quero a
primeira palabra a ser?
Audiencia: "Botellas".
DAVID J. Malan: "Botellas", así para dúas botellas.
E entón esta palabra aquí debe ser -
Audiencia: "Bottle".
DAVID J. Malan: "Bottle", no singular.
>> Todo ben, imos reducir, volver aquí, re-executar o make,
re-run beer3 tipo, 99 de novo.
Ok, "Fallo de segmentación (núcleo)."
O que eu fixen de malo?
Audiencia: Non ten un valor [inaudível].
DAVID J. Malan: Ah punto, excelente.
Todo ben, entón o que está mal aquí?
Así fallo de segmento, e nós estamos indo realmente para ver
este algunhas veces no futuro, deliberadamente.
Pero, por agora, o que iso realmente significa?
Un fallo de segmento case sempre significa que ten
dalgunha forma, intentou acceder memoria RAM no seu ordenador,
que non ten, que non teña realmente pediu o
sistema operativo para.
Polo tanto, neste caso, observe o que eu fixen, que é
falla na miña lóxica.
Eu asignado S1 e S2 un valor si é igual a 1.
Tamén fixen que eu sexa igual a 2.
Pero eu non teño feito isto no número infinito de outros
posibilidades -
en particular, 3 ou 4, ou un punto, punto, punto, 99.
Entón, unha corrección para iso podería ser só imos
ter unha condición máis.
E deixe-me entrar aquí e dicir S1 iguais -
o que debería estar aquí?
Audiencia: [inaudível].
>> DAVID J. Malan: "Botellas", porque, en casos comúns,
É exactamente a mesma cousa.
Entón é igual citas, unquote, "botellas". Entón, para o plural
botellas, e en seguida, ata aquí, para botellas de plural.
Ok, entón agora déixeme volver á miña xanela de terminal,
recompilar, re-executa-lo.
99.
Ufa.
E imos facer unha proba de sanidade rápido.
Tecnicamente, queremos ler todo isto para estar seguro de
son correctos, pero imos ollar para
menos os culpables coñecidos.
3 botellas, 2 botellas, 2 botellas, 1
botella, unha botella, 0 botellas.
Parece que temos, polo menos, fixa-lo por agora.
Pero a cuestión aquí é que o que unha desorde terrible deus que é
só para resolver un parvo
un personaxe-detalle gramatical.
Polo tanto, hai un tipo de razón que eu cortar este recuncho
antes, porque é só completamente aburrido ter que
escribir este código moito.
Pero acontece que hai formas lixeiramente máis elegantes de
expresando exactamente a mesma cousa.
E podemos facelo do seguinte xeito.
>> Permita-me deixar isto na pantalla por un momento e
introducir algo coñecido como un operador ternário.
Este é un tipo de un forro que é só a intención de facer o noso
vive un pouco máis sexy, como prometido.
E eu vou facelo do seguinte xeito.
Déame unha cadea chamada s1, e deixe-me
atribuílo lo como segue.
(I == 1)?
"Botella", en caso contrario, "botellas". Cadea S2 recibe (i == 2)?
"Botella", en caso contrario, "botellas".
Entón, o que é entón a diferenza aquí?
Estas dúas liñas de código, argumentan, pode
substituír toda esta confusión.
Entón, eu chamo iso de desorde, só porque é o tipo de esfrega-mo
xeito incorrecto de que é tantas liñas de código.
Non está mal.
Non é mala concepción.
Tipo, iso é perfectamente correcta e perfectamente ben.
Pero codificación queda molestar se ten de expresar-se de xeito
caramba especialmente novo e de novo e de novo con un simple
escenario como este.
Entón C ten algúns atallos, coma este.
Polo tanto, este é esencialmente dicindo declarar unha cadea chamada s1
asignar valor este ou este valor se i é == -
Sentímolo, eu debería dicir iso máis claramente.
Declare unha variable S1, asignar este valor se isto é verdade.
En caso contrario, asignar-lle este valor.
Así, noutras palabras, este é un tipo de forma de unha liña de
dicindo que máis, pero facendo un traballo ao longo do camiño.
Entón, se eu for 1, entón vai adiante e chaman iso de "botella". E
entón esa persoa, chamalo de "botellas". Mentres tanto, S2, o
segunda palabra que necesitamos establecer, se é igual a 2, imos
S2 definir a "botella". En caso contrario, defina-o para "botellas". E o que
Isto significa que agora é que podo pasar por iso e borrar todos
esas liñas de código.
E cando digo, un pouco ridículo, que este é agora
máis sexy, é máis sexy en un tipo de sentido de estilo.
O feito de que funcionalmente, este código é realmente vai
facer exactamente o mesmo.
E, aínda que poida parecer un pouco enigmática en primeiro
mirar, porque non vin esa construción antes, eu
argumentan que é, en última análise vai ser moito máis
lexible e moito máis fácil para nós, humanos, para clasificar de
comprender, porque agora pode só ler o
código nunha única liña.
Aínda é semellante en espírito a un a, sempre que se
condición, e iso é o que está dentro do caso e este
é o que está dentro da persoa.
Pero podemos facelo só moito máis elegante.
>> E se eu agora vou volver para o meu terminal, tendo eliminado todos
destas liñas e os substituíu con só eses dous,
recompilar, re-run botellas de cervexa con 99, aviso que a miña
código é, en realidade, aínda está correcto.
Entón, de novo, algo para comezar.
2 botellas de cervexa, unha botella de cervexa.
Parece certo.
Si
Polo tanto, temos unha solución moito máis sucinta.
Polo tanto, isto tamén, como se sentir máis cómodo con C, non
necesariamente co pset primeiro ou mesmo segundo, pero
entender que estas construcións poden permitir-nos a facer cousas que nunca
máis elegante.
Agora imos facer outra cousa aquí.
Deixe-me ir adiante e abrir return1.c.
Agora imos comezar a resolver outro problema de forma que
nos permite escribir código máis sofisticado.
>> Entón aquí está un programa sinxelo e pequeno, cuxo obxectivo na vida
é incrementar valores.
E, de feito, imos dar un paso atrás.
Deixe-me facelo manualmente.
Deixe-me facer incluír e int main (void).
E deixe-me chamar esta increment.c.
E o que quero facer?
Eu estou indo a ir adiante e dicir algo así como -
imos chamar a números o mesmo -
int x.
Entón x int recibe 2; x printf% d, a nova liña, x.
Entón, eu estou escribindo rápido, pero tipo de cousas familiar agora.
Entón eu vou facer x + +.
Entón eu vou para imprimir esa mesma frase de novo.
E entón eu vou volver 0 só para saír do programa.
Todo ben, entón que é un programa que
incrementos dun número.
É primeiro indo a iniciar algo a dous, e entón é
vai incrementa-lo e imprimir lo de novo.
>> Entón imos correr incremento, programa moi sinxelo.
Pero supoño que agora que quero cubo valor, así como
algo un tanto arbitraria.
E eu realmente quero facer x recibe o cubo da mesma.
Entón eu podería usar o que se chama a función pow, pero eu non
realmente sei onde é aínda.
Entón eu vou facelo do xeito old-Fashioned.
x veces o que equivale a x veces x veces x.
Entón, eu estou cubing o valor, multiplicándose por si mesmo de novo
e de novo e de novo, para que poidamos obter o poder
de 3 neste caso.
Polo tanto, agora os números que eu debería imprimir debe ser, como veremos
aquí - facer incremento, por iso é, en realidade, non é realmente incrementar
máis, pero imos deixar o nome só -
2 e, a continuación, 8.
Agora, temos o inicio dunha oportunidade para o refinamento
aquí, segundo a cal esa cousa cubagem da multiplicación dun número
por si só, por si só, por si só, se sente como iso pode ser só
útil ter como función, así como alguén decidiu
anos - vostede sabe, tipo de útil se un de nós se senta
e escribe printf para que o resto do mundo pode usalo,
por que non sentir e escribir unha función chamada cube
que fai iso cubagem para nós para que non ten que manualmente
aplicar a noción de cubagem valores aquí?
>> Así, un exemplo simple, pero imos adiante e usar isto é como un
oportunidade de escribir a nosa propia función.
Entón, ata agora, só usei principal, e usamos outro
funcións das persoas, pero non escribir o noso.
Entón, imos alí.
Eu estou indo a ir adiante e escribir unha función chamada cubo.
E eu vou ter que tomar unha entrada.
Polo tanto, a súa entrada vai ser un enteiro.
E que é o que vai facer?
Vai declarar saída int = Entrada de entrada veces
input veces.
E entón el vai volver esa saída.
E entón eu teño que ser específico agora.
Esta función vai voltar un int.
Entón, aquí, entón, é como escribir as súas propias funcións.
Primeiro decidir o que é o nome do seu
función será.
E, xeralmente, algo explicativo é bo, entón eu vou
chamalo cubo.
Entón tes que especificar o que vai volver, o que é
súa saída vai ser.
E non temos opcións que moitos aínda.
Int, char, float, bool, string.
Por agora, eu vou ir con un int, porque quero
para voltar un enteiro.
Entón tes que especificar o que as súas entradas, se hai, son.
E se cubo ten un argumento, leva algo entre
parénteses, ten que dar ese argumento un nome para
pode chamalo algo como está aplicando ou escribir
esta función, e ten que dar un tipo, que neste
caso vai ser int.
Así, en breve, o cubo é unha función que recibe un enteiro
como entrada e retorna un enteiro como saída.
>> Entón, o que facer con esa entrada?
Ben, na liña 14, eu declarar unha variable chamada de saída, e eu
asignar-lle o valor, a entrada de entrada de entrada veces veces.
E entón eu volver a saída.
Entón, como podo usar iso, entón?
O que fago para cambiar estes personaxes destacados en liña
7 dicir, que pensas?
Audiencia: [inaudível].
DAVID J. Malan: Si, entón cubo de x.
Entón X é unha variable, o que significa que ten un valor.
Afortunadamente, é do tipo enteiro.
E porque é un int x, o que significa que podo pasalo en cubo.
E aínda que eu estou substituíndo o valor de x co valor
x de cubo, como foi o caso ata agora, calquera hora
ten signo igual e unha liña de código, o material sobre o dereito
é executado e logo se lle atribúe ao
valor do lado esquerdo.
Polo tanto, a orde de operacións e como sería de esperar.
Entón, isto funciona?
Ben, deixe-me ir para abaixo aquí.
Deixe-me abrir a miña xanela de terminal.
Deixe-me faga incremento, Intro.
"Declaración implícita de 'cubo' función non é válida en
C99. "Como un aparte, C99 refírese á linguaxe C como era
definido en 1999, que foi unha actualización da versión de
1989, que é unha actualización en relación ao orixinal.
Entón, iso é todo o que iso significa.
>> Entón, o que significa que a declaración "implícita de
'Cubo' función non é válido? "É aquí mesmo.
É alí na liña 12.
Audiencia: [inaudível].
DAVID J. Malan: ¿Que é iso?
Audiencia: Non é antes.
DAVID J. Malan: Non é antes.
Polo tanto, esta é a cousa.
C é unha especie de idiota, ou compiladores C son unha especie de estúpida.
Realmente só facer o que lles din que facer.
E, en particular, só ler o seu código superior para a base,
esquerda a dereita.
Entón, se o compilador, Clang, está lendo o seu código, liña 1,
descobre como facelo.
Oh, aquí vén principal.
Ok, deixe-me ir adiante e declarar unha variable x.
Deixe-me imprimir algo.
Liña 7, o que diaños é cubo?
Non é declarada en stdio.h.
El non vén con C. Eu non teño ningunha idea do que facer.
E así Clang só socorrelo e pecha coa mensaxe de erro.
Así, podemos solucionar isto nun par de formas.
Podemos ensinar Clang o cubo é só movendo onde o
declaración é.
Entón eu corte e colei na parte superior principal.
Agora entendo que só porque principal xa non é primeiro, é
aínda executado por defecto.
Principal é principal.
É o nome da función estándar.
Non importa onde está nun arquivo.
Pero polo menos agora Clang viu cubo antes de usalo.
Entón, imos ver se Clang é máis feliz agora.
Fai incremento, fixo compilar este tempo.
>> Déixame correr incremento.
E, de feito, parece estar funcionando.
Agora podes crear escenarios onde finalmente
non é posible poñer todas as funcións
por riba de calquera outra función.
Vai estar preso neste loop infinito, na realidade,
onde este cara quere estar aquí, pero iso
cara que estar alí.
De modo que non sempre funciona.
Entón, por sorte, C ten unha solución máis elegante.
Vou poñer isto de volta onde estaba, só porque eu
prefire, como unha cuestión de principio, que de inicio sempre
na parte superior, porque é só bo para ver o que este programa
fai por defecto.
E o que eu vou facer aquí é declarar o que se denomina
un prototipo.
Eu vou volver a declarar miña función cubo literalmente
copiando e colando.
En realidade, iso non é literalmente.
Entón, literalmente copiando e colando liña 15
Por enriba da liña 6.
Non importa o que esta liña acaba en.
El pasa a ser na liña 4.
Pero ten que ser antes de inicio.
Pero teña en conta a diferenza.
Liña 4 remata cun punto e coma, o que significa hey,
Clang, tome a miña palabra de que existe unha función
chamado cubo que recibe un int e retorna un int.
Pero eu non vou dicir o que é aínda.
Só sei que eu prometer contar eventualmente.
E, de feito, agora está todo ben que este é baixo.
>> Polo tanto, este é, xeralmente, mellor, porque entón na parte superior do
seu ficheiro, pode simplemente recitar, rápido do fogo, unha liña
cada un, o que os nomes das súas funcións, que o seu
entradas, o que os seus resultados son.
E, para ser máis claro, a entrada xeralmente significa argumento ou
parámetro, sinónimos.
Saída significa valor de retorno, o que fai
man de volta para min.
Polo tanto, neste caso aquí, o cubo foi declarado no inicio, pero
definido, tamén coñecido como aplicado, na parte inferior.
Entón agora imos volver aquí e re-executar esta.
Entón, agora deixe-me ir adiante e re-executar o make, re-executar incremento.
E agora parece estar funcionando moi ben.
Entón agora podemos ir adiante e fatorar algo así como o
cervexa exemplo para esta cuarta versión.
Entón deixe-me rolar aquí.
E noten que eu medio que levou esa lección para o corazón agora.
O feito de que eu estaba cantando mesma estrofa novo e
unha e outra vez, a liña mesmo coro na música, sentiu
gusto Por qué non factor que unha función?
E, de feito, esta debe ser unha das motivacións.
Ademais do feito de que alguén no mundo podería querer
usar unha función cubo -
esta é unha boa razón para o factor algo e escribir o seu
función personalizada propia -
se hai un anaco de código no seu programa que só fai
sentido conceptual, que tipo de querer darlle un
nome - como neste caso, coro, -
entón podes tamén escribir que, como unha función separada.
Non ten que escribir todo de inicio, se só
parece máis limpo para separa-lo e dar-lle un nome.
>> Polo tanto, neste caso aquí, entender que eu teño un comentario sobre
esta función que só canta sobre a
números especificados de botellas.
Teña en conta aquí que eu non teño chamar estes
cousas de entrada e saída.
En realidade, esta vez eu chamei o meu b entrada botella.
E notar aquí nula suxire o que?
Este refrán -
Audiencia: Non devolve-lo.
DAVID J. Malan: non retorna un valor.
E, de feito, non ten funcións para voltar valores.
Eles só poden facer algo.
Eles poden ter o que se denomina de efectos secundarios, que neste
caso é só unha morea de imprimir na pantalla.
Entón, observe que este código aquí, eu literalmente roubo
no exemplo anterior.
A única diferenza é, en vez de utilizar como i meu
variable, agora estou usando b como a miña variable.
Entón, eu teño b aquí, teño b aquí, teño b
menos 1 aquí.
Pero o código é exactamente o mesmo.
Pero só para te amosar agora como podemos usar isto, deixe-me ir
adiante e realmente cambiar este é un loop for.
é (i = n; i> n; i -).
>> Entón eu roubei isto do noso exemplo anterior.
Anteriormente, e na liña 37 que eu tería comezado
cantando esa música irritante.
Pero en vez diso, eu só vou agora chamar coro de i.
Feito.
Entón, agora en cada iteração deste lazo, eu chamo este outro
coro, función, que pasou de eu escribir.
Non foi escrito por outra persoa de anos.
Pero coro, á súa vez, usa printf para imprimir
esas catro liñas.
Pero o feito de que eu estou chamando refrán novo e de novo nun
lazo significa que eu estou indo a obter, ao final, o
mesma música exactamente como eu teño ata agora.
Así, en breve, agora eu ollar cara atrás, o meu código, a pesar de
funcionalmente é equivalente, entender que é
comezando a estar aínda máis lexible.
Eu non sei exactamente como GetInt
é aplicado.
Francamente, eu non sei como refrán é aplicado.
Pero iso non importa para min.
Eu non me importa, porque agora podo clasificar de, como un ser humano, lea
este, de arriba para abaixo.
E porque as funcións son nomeados de acordo co que
facer, o meu código é cada vez máis lexible.
E como os nosos programas de estar moito máis complexo -
ata o final do semestre, vai escribir centos de liñas
de código en linguaxes como PHP e JavaScript e outros -
podes ver que é moito máis fácil do que manter o control de
o que fixo.
E cando comezar a colaborar cos amigos ou
socios ou compañeiros, vai ser capaz de escribir moito máis
programas masivos de comezar a se exercitar estes básica
bloques de construción.
>> Así, co que dixo, por que non chamalo un día?
E nós imos velo o mércores.
[Aplausos]