[Powered by Google Translate] DAVID J. Malan: Molt bé, aquest és CS50, i és aquesta la
l'inici de la segona setmana.
Gràcies.
Comencem aquí amb una trucada telefònica.
Estic a punt de marcar 617-BUG-CS50.
CS50: Aquest és CS50.
Per Boy Shuttle, premeu 1.
Per començar de nou, premeu 9.
DAVID J. Malan: Això diu Noi Shuttle, premeu 1.
Així que anem a pressionar 1.
CS50: Quin és el seu origen?
Per quad, premeu 1.
Mather, premeu 2.
Boylston, premeu 3.
Lamont, premeu 4.
Mem Hall, premeu 5.
Per començar de nou, premeu 0.
DAVID J. Malan: Anem a pressionar 1 per el quad.
CS50: Shuttle Següent surt en aquest mateix instant a la 1:10 pm, i
després a les 1:20 pm, 1:30 pm, 1:40 PM.
Això és CS50.
>> DAVID J. Malan: Així que aquesta és la veu del CS50.
I és un exemple dels tipus de projectes fi de carrera, per
exemple, es pot arrencar amb les dents cap
Al final del semestre.
Per exemple, que hi ha shuttleboy.cs50.net -
en realitat un projecte que vaig escriure per primera vegada després de prendre CS51
quan jo era estudiant.
I aquí la inspiració era per aquell temps, l'únic que tenia era
els horaris d'autobusos, transport impresos i no havia
noció de veure les coses en línia.
I, llavors, una mena de colom en un cap de setmana, s'aboca a través de la
calendari imprès, i portat a un programa d'ordinador.
En aquest moment, el programa d'ordinador que va passar a ser escrit
en C. I en realitat corria per Boy trasllat escrivint en un
parpelleig ràpid com ho hem estat fent fins ara.
Però amb els anys, ha evolucionat fins a convertir-se en un instant
missatgeria bot.
Ha evolucionat més recentment en aquest lloc web, en un
Basat en SMS eina, així com en aquesta eina basat en la veu.
I això és fer al · lusió a la classe de coses que vostè pot
fer per si mateix pel final del semestre.
>> Per exemple, hi ha la versió de SMS Boy trasllat passa
per operar com segueix.
Si en el seu telèfon mòbil, enviar un missatge de text al 41411 i
a continuació, enviar el sboy símbol especial, per al noi de trasllat,
seguit per A i B, on A és un origen i B és un
destí -
per exemple, Boylston Space Quad -
el que s'ha de tornar en uns pocs segons és un text
missatge de Boy trasllat dient exactament quan el
pròxims autobusos són pocs, des d'aquest punt Una situació que
punt B.
I aquest és un exemple més general del que es coneix com
mitjançant una API.
>> Així, per exemple, això aquí és només shuttleboy.cs50.net, el
real de web encarnació d'aquesta.
Però les dades que subratlla aquesta i altres aplicacions que CS50
ha desenvolupat estan tots exposats a tots aquí a la forma
d'APIs, interfícies de programació d'aplicacions.
I això és només una forma elegant de dir que la gent que ens agrada a
Internet i altres han passat algun temps en la creació
programari que es pot utilitzar amb la finalitat d'apoderar de les dades de nosaltres i
després construir les seves pròpies aplicacions a la part superior
d'aquest conjunt de dades.
Així, per exemple, aquest noi de trasllat pàgina de l'API aquí, que
passa a ser en el manual d'CS50, essencialment documents
com vostè pot anar sobre la sol · licitud CS50 servidors de dades.
Per exemple, si vostè està familiaritzat amb els arxius CSV, comma
valors separats, aquests són només una espècie de ràpid i brut
Excel-com els arxius.
Així que vostè pot fer Boy trasllat de totes les dades en tota la
cases i les seves coordenades GPS, i obtindrà
de nou, en essència, un full de càlcul com el que
la qual cosa pot llegir-se en un programa del seu compte i després
generar resultats, com el Nen de trasllat en si
passa a estar fent.
Per als més familiars, representacions de dades més moderns
incloure JSON, notació JavaScript Object.
Una cosa sortirà de nou a vostè cap
Al final del semestre.
>> Però de nou, això és només una de diverses de les API del mateix CS50.
I el més emocionant és ara, en aquests dies, Facebook i
Twitter i Google i pràcticament tots els llocs web populars cap a fora
no té algun tipus d'API, el que significa que si vostè llegeix el
documentació al seu lloc web, vostè s'inscriu en un
compte, vostè pot llavors començar a escriure programari en la part superior de
qualsevol eina o dades que l'empresa no proporciona.
I així, un dels nostres companys docents propis un parell d'anys enrere
va escriure una versió per a Mac d'això.
Així que a l'enllaç titulat Mac aquí dalt a l'esquerra, en realitat es pot
descarregar un giny de Mac OS que s'executa en el seu propi Mac per fer el
mateix tipus de coses.
Així que és tot sobre la construcció a la part superior dels conjunts de dades com aquests.
Però més sobre això cap al final del semestre.
>> Així que anem a bussejar en ràpid real a un error, només per tipus d'aconseguir
coses en calor avui, i penso en alguns dels
ho vam veure la setmana passada.
En particular, vull seguir endavant i aixecar, per exemple,
aquest exemple aquí.
Buggy1.c, està disponible a la pàgina web del curs si s'havia
Voleu descarregar-la i ficar al teu voltant.
Però anem a apropar aquí en aquest programa bastant curt, i només
un resum super-ràpid d'alguns dels elements bàsics que
que realment van a començar a limitar-se a prendre per fet.
>> Així les coses blau, a les línies 1 a 9, són només
preguntes de softbol.
Així que aquests són només comentaris.
Ells no tenen un significat funcional.
Però són els comentaris en el sentit que són les notes que
Jo, l'ésser humà, fet a mi mateix, perquè en la conferència i després d'
conferència, realment puc recordar el que aquest programa
fa sense haver de llegir línia per línia i
recrear la història en la meva ment.
D'altra banda, si es em lliuri aquest programa a una altra persona com
vostè, és molt més clar per a vostè, a causa dels comentaris d'aquest tipus,
el que el programa està fent en realitat, o almenys el que el
programa suposa que ha de fer.
Si és o no és correcte és una altra qüestió.
Ara, en C, amb comentaris de diverses línies, recordem que en la línia
d'aquí és el símbol de la màgia, / *.
Això vol dir que aquí ve l'inici d'un comentari.
I res més importa fins que arribi al final de terminació,
que és * /, el contrari.
Així que el fet que tinc 80-algunes estrelles imparells des d'aquí
d'esquerra a dreta és en realitat només un detall estètic.
No té cap significat funcional.
>> Ara, què hi ha de la línia 11?
Què fa això en termes simples?
Què és això?
AUDIÈNCIA: Inclou la norma.
DAVID J. Malan: OK, bo.
Per tant, inclou la biblioteca stdio.h.
Llavors, què significa això?
Doncs bé, dins d'aquest arxiu, stdio.h, són un munt de
declaracions de funció -
és a dir, el codi que una altra persona va escriure.
I un exemple perfecte d'una funció que es declara en
stdio.h és -
que per ara favorit?
Així printf, un dels més comuns d'usar, certament
des del principi, des que la biblioteca està allà.
Si excloc aquesta línia de codi, Clang va a cridar
a mi alguna cosa sobre l'ús d'un símbol no declarat.
Alguna cosa no declarat és, probablement, la paraula clau, perquè
no ens han informat que el compilador ho veu printf
llevat que ens agradaria incloure aquesta línia.
I més a la Terra, en realitat, el que està dient és la línia
obrir aquest arxiu, stdio.h, allà on es troba al servidor de
disc dur o unitat de disc dur del dispositiu, i copiar i enganxar-it
aquí mateix en el meu arxiu, sense el meu
haver de fer-ho manualment.
>> Ara, un cop que arribem fins aquí per principal, en poc temps anem a començar
bromes a part el int i el que és buit.
Però per ara, anem a veure les tres línies
dins de 15 a 17.
Això aquí afirmo com buggy.
Línia 7 en els meus comentaris diu: "En cas d'imprimir 10
asteriscs, però no. "Per què això no s'imprimeixen, de fet,
10 estels d'aquest tipus?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Exactament.
Així adonar que estem començant a comptar des de 0.
I això és en realitat una convenció en la programació i
ciències de la computació en general, començant a comptar
de 0 en lloc d'1.
I això realment només es deriva del fet que, per
exemple, quan teníem vuit persones a l'escenari, quan
ningú aixecava la mà, eren
tots els zeros eficaç.
I el que és només una espècie de convenció ordinador per,
per tant, per començar a comptar des de 0.
Si aquest és el menor nombre que pot representar en binari.
>> Així que aquí hem començat la inicialització i en 0.
Hem establert i igual a 0.
Però llavors vaig fer aquest error aquí, dient que és menor o
igual a 10.
Però si vostè pensa que a través d', si començo a 0 i després em vaig
fins a 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, de fet vaig a
imprimir 11 estrelles a la pantalla, perquè he pujat
a i igual a 10.
Així que la solució fàcil aquí és, llavors, què?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Només has de canviar a menys.
Si realment voleu, vostè pot fer això.
Però, en general, que està mal vist.
I així comença a comptar des de 0 és només una cosa que hauria
normalment s'acostuma.
Ara, què passa amb tota aquesta construcció en si i per si mateixa?
Aquesta línia 15 deMarks un bucle for.
Així que per no és una funció.
És només una declaració.
És una construcció de bucle, com hem vist al Scratch.
I té tres parts.
Recordeu que no és la primera part de
l'esquerra de la coma.
Aquí està la part mitjana entre els dos punts i comes.
I després hi ha la part de la dreta a la dreta
del punt i coma segon.
Ara, la primera d'elles fa què?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Tornar allà?
Sí?
AUDIÈNCIA: Inicialització.
>> DAVID J. Malan: Inicialització.
Llavors, què significa això?
Hem declarat una variable anomenada i.
És de tipus int, perquè he especificat int i.
I estic i inicialitzar amb el valor de 0.
Llavors, què està dient realment?
És efectivament dient a l'ordinador hey, dóna'm suficient
memòria RAM suficient, per ajustar-se a un nombre i, a continuació, posar el
nombre 0 en aquest bloc de memòria RAM.
I en un apart, què tan gran és un int en general, si més no dins
l'aparell?
AUDIÈNCIA: 32 bit.
DAVID J. Malan: 32 bits.
Això vol dir que em donen 32 bits, també coneguda com 4 bytes,
i posar el valor 0 en el mateix, la qual cosa és bastant fàcil perquè
Simplement significa posar tots els bits a 0.
>> Així que ara, la segona part aquí és la condició.
I la condició, com el seu nom ho indica, és el que es comprova
una i altra vegada i una altra sobre si és cert o fals.
Així que això és només dir fer les següents línies de codi -
és a dir, la línia 16, perquè aquesta és l'única sagnia
sota -
sempre que i és menor que 10.
I després de cada iteració a través d'aquest bucle, faci el
increment, que en aquest cas és i + +.
Ara bé, no ha de ser i + +.
Podria ser i -.
Però si ho vaig fer, quin és el comportament va
sent d'aquest programa?
AUDIÈNCIA: Serà un bucle infinit.
DAVID J. Malan: Serà una espècie de bucle infinit,
llevat que tinguem sort després negatiu 2 milions de dòlars o així.
Potser les coses s'emboliquen al voltant, només per la naturalesa del finit
nombre de bits que s'han assignat per a un int.
Però és segur que repetirà molt més que 10 i
sens dubte, més de 11 vegades aquí.
>> I ara, en un apart, adonar-se que i + + i i -
en realitat són només sucre sintàctica.
És només la notació abreujada del que és una mica més
explícitament escrit així:
i = i + 1.
Que és idèntica a i + +.
És només una mica es veu més bonic que dir i + +.
És més concís, més llegible.
I així, la majoria de la gent fa en el seu lloc.
Però això és funcionalment idèntica a
el que acabem de veure.
Així que en resum, la solució ràpida aquí és només per dir iterar i
des de 0 tot el camí fins a menys de 10.
I llavors certament obtindrà 10 estrelles.
>> Així que anem a provar això.
Deixa obrir la terminal a la part inferior.
Déjame entrar al directori que aquest és polz
I vaig a compilar manualment amb Clang per ara.
I vaig a compilar això com buggy1.c, Enter.
I ara buggy1, per què no hi ha tal arxiu o directori
anomenat buggy1?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Si.
Així que és en realitat anomenat a.out.
Així que si vostè acaba de recordar executar Clang, on Clang és la
compilador, i no s'especifica el nom que desitja
donar al seu programa, que va per defecte a a.out.
Així que en realitat, si ho faig ls -
oops.
I I didn't - el tema negre i blanc alguns
et vas enfrontar s'ha solucionat.
Però m'ho dius a mi fer això.
No tenim a.out a la banda esquerra hi ha.
Així que hem d'executar a.out en lloc de buggy1.
>> Així que permetin-me anar endavant i fer-ho.
. / A.out, Intro.
I pel que sembla no va fer el que?
AUDIÈNCIA: Desa.
DAVID J. Malan: Guardar la imatge.
Així que es resol fàcilment prement S de control, o anar a
Arxiu, Guardar, com en la majoria dels programes.
Deixa aquí, esborrar la pantalla, s'execute altra vegada.
I encara hi ha un error.
Llavors, què està passant -
AUDIÈNCIA: No compila.
DAVID J. Malan: Ah, bé.
Jo no ho compila.
Com un idiota, jo estic mirant el codi per veure què passa.
Així clang buggy1.c, ara a.out.
I ¡uf, salvada.
>> Així que sembla una mica lleig perquè no hi ha nova línia
en qualsevol part del programa.
Però, de nou, això és només un detall estètic.
I si més no si comptem els que fos, hauríem
10 Ara veiem d'aquestes estrelles.
Bé, què passa amb aquest segon escalfament exemple?
Així que en buggy2, sostinc que aquesta versió també s'imprimirà
10 estels, una per línia.
Així que aquesta vegada, tinc un caràcter de nova línia, només per fer
les coses una mica més bonic.
Però en lloc del que em passa és el següent.
Així que permetin-me fer buggy2.c clang, Intro.
Ara està de nou anomenat a.out.
Retorn.
Només veig una nova línia, només la nova línia últim que
mou el meu sistema a la línia següent.
I no obstant això, és clar que jo he estat imprimint *, llavors una nova línia,
*, Llavors una nova línia.
Però quin és l'error aquí?
Sí?
AUDIÈNCIA: [inaudible].
>> DAVID J. Malan: Exactament.
Així que a diferència d'altres llenguatges, com Python, on sagnia
en realitat té un significat funcional, en un
llenguatge com C -
com veurem, PHP, JavaScript -
el sagnat és realment només per benefici dels éssers humans.
Així que el fet que he sagnat línia 16 i 17 es veu molt bé,
però no té cap significat funcional aquí.
Si vull a les dues línies s'executen com a part de la de
bucle, llavors he de tancar entre claus en fer això.
Només es pot tallar aquesta cantonada i ometi les claus si
Quin és el cas?
PÚBLIC: Una sola línia.
DAVID J. Malan: Només una línia.
Així que això és només una espècie d'un tipus bonic detall de sintaxi, de manera que
que no perdis el temps escrivint tres línies, dues de les quals són
claus, només per escriure una sola línia de codi.
Però si vostè té dues o més línies,
en realitat hi ha de fer això.
>> Així que ara em deixa desar això.
Deixin-me seguir endavant i tornar a executar Clang.
Llavors m'ho dius a mi tornar a executar a.out, i ara els puc obtenir un per línia.
Ara, de nou a.out és una espècie de nom ximple per a un programa.
Com puc saber en realitat Clang a donar-me un nom de fitxer
això és més fàcil d'usar, com buggy2 si mateix?
Una mica més clarament?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: OK, així que en realitat pot tenir el mateix
de fàcil accés directe i escriure simplement fer buggy2.
No s'especifica. C en aquest cas, i premeu Enter.
I el que fa és fer que compila buggy2.c per a mi per
demanant Clang per fer-ho.
En concret, es diu Clang, s'executa utilitzant Clang manera més
arguments de línia d'ordres o interruptors del que realment necessiten.
Amb el temps, anem a tornar al que tots aquests diversos
críptiques expressions amb guions significa.
Però per ara, això és només m'estalvio la molèstia de
haver de recordar i haver d'escriure tots els
diverses expressions separades per guions.
I l'avantatge que en última instància és
que ara tinc buggy2.
Si jo vull fer això de forma manual, però, em
en el seu lloc pot fer això -
clang-o buggy2 i després buggy2.c.
I de la mateixa manera que em donarà un arxiu anomenat buggy2.
>> Així que en resum, Clang és el compilador.
Fer és només una eina de fàcil ús que utilitzarem més
i més, ja que només comença a
simplificar les coses per a nosaltres.
I tornem 0, finalment.
Per ara, perquè sí, però anem a començar a burlar d'aquesta part
avui i dimecres.
Teniu alguna pregunta respecte tot això?
Sí?
AUDIÈNCIA: [inaudible]
ls entre cometes allà?
DAVID J. Malan: OK.
Quan ls escrites entre cometes, que m'estava fent una mica de màgia
darrere de les escenes per corregir un error.
Se m'oblidava, com ho hem estat dient a molts de vostès a la
fòrums de discussió, que es pot fer -
farem això ara - sudo yum-i update appliance50.
Vaja, que això està ben escrit.
Així l'aparell és com un sistema operatiu.
S'està executant el sistema operatiu anomenat Fedora.
I ara, per la meva connexió a Internet lenta, no tinc
realment una mànega.
Llavors, executar yum update sudo, com ja et dic que facis a la
conjunt de problemes, essencialment agrada córrer actualitzacions automàtiques
en Mac OS o Windows.
I la raó de l'execució d'aquest en el començament mateix de la
conjunt de problemes és perquè quan vam crear l'aparell, em
en mal estat, i accidentalment introduït tots els programes busquen
negre en una pantalla en negre, de manera que vostè no els està veient
per defecte.
Però l'última versió de l'aparell corregeix això.
I vaig a arreglar això durant les vacances un cop que tingui Internet
connectivitat.
>> Així que les cites només s'amaga el meu error, molt discretament,
pel que sembla.
Altres preguntes?
Sí?
PÚBLIC: D'on ve fer vi?
[Inaudible]
DAVID J. Malan: Bona pregunta.
On fer vi?
Es tracta d'un programa de Linux que ha existit durant molts anys, molt
abans CS50.
I ve amb un sistema operatiu com Fedora.
No ve de la biblioteca CS50.
De fet, les úniques coses que vénen de la biblioteca CS50
fins ara, el que hem vist, són GetString, getInt, tots
Obtenir els funcions, i la cadena de paraules, i en certa
extensió, la paraula bool.
Però anem a molestar que a part quan ens submergim en el CS50
aparell en si.
>> Així que sí, una pregunta més aquí.
PÚBLIC: Quan vostè va dir i després fer buggy, com funciona el
equip sap [inaudible]?
DAVID J. Malan: Bona pregunta.
Així que quan vostè acaba de fer executar o fer buggy1 buggy2, com
fa saber?
Així que per defecte, si escriu buggy1 fer, fer looks per a una
arxiu anomenat buggy1.c.
I després executa les ordres Clang apropiades,
així ignorant el fitxer de sortida per defecte anomenat a.out.
De fet, si ens fixem en el que fan, el que -
sortirem d'aquesta.
Si ens fixem en el que fan en realitat estava fent, fer buggy2,
ja està actualitzat.
Així que em tregui la comanda rm, la
programa que he escrit abans.
Escrivint I-E-S per confirmar que voleu eliminar-lo.
Si ara fan, observi que en aquesta línia molt llarga,
hi ha aquesta última cosa que aquí,-o buggy2.
Tots cometem està fent és passar aquest argument, per dir-ho, a
Clang, de manera que no he de escriure jo mateix.
>> Molt bé, així que un parell de ràpida administratiu
anuncis.
Així, per seccions, que va començar oficialment el proper
Diumenge, vostè sempre voldrà portar, si
vostè té un, un ordinador portàtil.
Si vostè no té un ordinador portàtil, arriben a mi per
deixar-me un correu electrònic.
I anem a esbrinar un flux de treball.
El que generalment trobarà al punt és que són part
part conceptual i pràctic.
En especial, utilitzarem la secció de preguntes, part de
la setmana del conjunt de problemes, caminar a través d'alguns dels
material conceptual de la conferència.
I això és tot en el conjunt de problemes actual.
I també anem a aprofundir en algunes de les activitats amb mans, de vegades
dels quals es requereix que es presentarà, de vegades de
quins no.
Per exemple, aquesta primera setmana, que estan destinats només com un
exercici d'escalfament.
I t'adonaràs que aquests problemes són realment només això.
Estan destinats a ser bastant petita, però no necessàriament
programes trivials per escriure, que no són necessàriament
bones oportunitats interessants en si mateixes sinó que han de
practicar amb la sintaxi, amb noves funcions, en la comoditat d'una
secció on vostè té alguns dels seus companys de classe presenten com
així com el TF.
>> I què farem amb el temps és utilitzar una eina anomenada CS50 Spaces,
pel que en lloc d'utilitzar l'aparell CS50, vostè
en lloc d'anar a una pàgina web en un navegador, on podràs
per a programar en una finestra del navegador a la secció.
I després, si et acceptes, el teu company d'ensenyament es pot mostrar
sigui el que sigui que estàs escrivint a la pantalla al navegador
finestra a la part davantera de la classe, ja sigui anònima o
públicament, perquè ell o ella pot caminar a través de
seus companys de classe el que has fet bé, el que no li va anar bé.
I de nou, pot estar segur de tot això pot ser molt bé anònims.
Però serà una bona oportunitat per a molt més
interactivitat que permet una mena conferències.
>> Mentrestant, tindrem aquestes coses anomenades súper
seccions, que són opcionals, però estan oberts a tothom en
la classe, de manera que vostè pot fer això de manera més col · lectiva per
establir un problema.
Aquí està l'horari.
Això també es publica a la pàgina web en cs50.net.
Recordeu que hi haurà un pirata informàtic específic
un matí a la tarda.
I anem a filmar un avui i demà un i publicar els
en línia dins de les 24 hores.
Així que si vostè no pot fer cap d'aquestes ocasions, a preocupar.
I de nou, el programa està en línia en cs50.net.
>> En termes de seccionament si mateix, vostè va haver d'haver rebut un
correu electrònic amb instruccions per anar a la pàgina d'inici del curs per trobar
fora de la seva secció.
Si la vida ha canviat i necessita canviar la seva secció,
no és un problema.
Torna a la mateixa URL, cs50.net/section, singular,
i vostè ompli el formulari similar, perquè pugui
que ens donin les seves preferències.
I seguirem a finals de setmana pel que fa al que podem
acomodar.
La setmana passada, recordem que hem proposat utilitzar CS50 Discussió,
el curs d'eines de discussió a classe.
Així que vam 40 preguntes que es van formular i
respondre durant la conferència.
Així que sembla que ha funcionat bé, així que seguiré
tractant de fer això.
Si, durant la conferència, no només se senten còmodes fons
la mà, no és un problema.
Anar a cs50.net/discuss, ja allà, i una de les nostres ensenyaments
companys o bé contestar electrònicament o augmentar la seva
mà en nom anònima a demanar, en funció
de la naturalesa de la pregunta.
I en termes d'informació, en general els conjunts de processadors serà
retornat aquí a una setmana.
Com que pren una mica de temps per les seccions d'aconseguir
equilibri, el conjunt de processadors primer, 0 i 1, serà una mica
endarrerit ja que les coses es calmin.
Però estigueu atents perquè en les pròximes setmanes.
>> Molt bé, així que em vaig posar el greu
veu per un moment.
Així que aquest és en realitat un clima interessant per estar
tenint aquesta discussió, el que amb totes les altres coses
passant per la mateixa campus corresponent.
Però CS50 certament ha tingut la seva història d'aquest particular
tema, en tant com tots els anys, aquest curs, per a molts
anys, ad-juntes aproximadament el 3% de la classe.
Aquest últim any, el 2011, CS50 Administració entaulat 35 estudiants.
Això no és, crec, a causa de la falta de claredat.
Adonar-se que en el pla d'estudis del curs, hi ha una pàgina de
declaració explicant que les línies són.
Aquesta mateixa instrucció es repeteix en cadascun dels
butlletins de problemes a la pàgina un.
>> Així que parlar d'això avui realment només per fer
persones conscients d'això.
I hem intentat coses diferents.
I el que jo pensava que anàvem a fer avui consisteix en prendre un moment per
realment es veuen en alguns dels casos passats que han sorgit.
En lloc de mantenir a aquests petits secrets bruts que, en realitat
assenyalar el que han fet i com s'ha detectat
i realment el que la motivació principal és per
tenint aquesta conversa.
Així que dit això, la línia essencialment és això -
pel pla d'estudis, de res, se l'anima a
parlar amb els companys de classe.
Aquest és tot el propòsit de comptar amb aquests col · laboratiu
les hores d'oficina a Annenberg i persones encoratjadores per al
final del projecte per treballar junts.
No obstant això, la línia es dibuixa quan arribi el moment d'escriure realment
seva solució final.
En parlar en anglès, totalment bé, parlant en pseudo-codi,
totalment bé.
Enviament per correu electrònic a un company del seu conjunt de processadors, permetent que es vegin més
la pantalla com les mans segueixen escrivint,
sobre la línia també.
Miri al pla d'estudis de les línies particulars.
>> Però només per pintar una imatge de com això és per desgràcia un
realitat, s'adonen que hi ha llocs web per aquí que
tenen solucions d'aquesta classe i moltes altres classes.
El fet que vostè o un 3% de vostès saben que això existeix
vol dir que sabem que això existeix.
El fet que hi ha llocs com aquest en què
pot pagar a algú per fer realitat els seus butlletins de problemes - es tractava de
un cas real que va ocórrer l'any passat.
Es tracta d'un lloc web anomenat odesk.com.
I Tim era el nom de la persona que estava aquí la publicació en
Aquest lloc web i li va demanar a algú que faci la seva pset 7 a
aquest cas particular.
Bé, és molt odesk.com Google-ble, i estem molt
molt bo en buscar a Google.
Aquí, també, hi ha llocs - i aquest és bastant
atroç, francament.
[Rialles]
DAVID J. Malan: El més graciós d'aquest lloc és que si
llegir la pàgina Sobre, parlen de la seva corporatiu
servei de la cultura i com és el seu client número u
prioritat, per assegurar-se que les seves assignacions obtenir
lliurada a temps.
>> Però de debò, un cop més, el fet que aquests llocs
existeixen, ens adonem, també, són conscients
aquest tipus de llocs.
I per donar-li un sentit al que constitueix per regla general,
presa, en general no tenen grans escàndols on la gent
estan col · laborant en qualsevol tipus de forma massiva, sinó més aviat
és ara nocturns de debilitat, on vostè té per
molt per fer, són les 4:00 AM, estàs esgotat, i
pensa a si mateix, bé, deixa fer una ullada al meu
company de quart o codi del meu amic o similars.
I les manifestacions d'aquesta desgràcia involucrar Estudiant
A la presentació d'alguna cosa com això i presentació de B Estudiant
alguna cosa com això, que per cert, en un ordinador
classe de ciències, és molt fàcil per als científics de la computació
per detectar amb programari.
Aquest és un altre paradigma comú, on vostè té una espècie de
estat treballant al costat d'algú, potser parlant en
Anglès, molt bé, pseudocodi.
Però llavors arriba el moment de presentar efectivament, els conjunts de processadors i
només s'intercanvia a través de correu electrònic o Dropbox o similars.
No obstant això, en un intent de fer que sigui menys evident que aquesta és
el que ha passat, llavors això és el que està sotmès.
Això, també, no es dispara fins ben escrits peces de
programari que tenim per detectar realment
aquest tipus de coses.
I de fet el que fem és un programari de gestió que compara tots
aquest any les presentacions contra tot l'any passat
presentacions, contra tot el que trobem a la
Internet, en contra de tots els llocs web d'ocupació que hi ha.
És tot molt automatitzat.
I així ho fem realment per ser justos gran al 97% que
realment estan treballant fora dels seus ases en aquest i en altres
classes i posant en tot aquest esforç perquè el treball
en última instància, presentar és el seu.
I puc continuar durant molt de temps.
>> Aquests són només un grapat de casos l'any passat.
Alguns estudiants van presentar aquests arxius de forma idèntica per pset 2,
pset 3, conjunt de processadors 4, 5 pset, pset 6, pset 9.
En aquest cas, aquesta prova era 0 i l'any passat, on dos
estudiants van presentar aquesta frase idèntica entre molts
altres, "La sol · licitud de tipus -" punt, punt, punt.
Així que, fins i tot en una classe de 600 vam detectar aquest
presentat en concursos.
Així que en resum, això - francament, no m'agrada tenir aquest tipus de
conversa - però això és realment un esforç deliberat
aquest any per intentar reduir aquest nombre.
Perquè tot i que diuen aquest tipus de coses cada
any, crec que la realitat d'haver habitat-hi durant uns pocs
segons més del normal i en realitat només assenyalant
que el que pot semblar, eh, no és una gran cosa, si més no
pensin en aquest moment en particular, tant per ser justos amb
tu mateix i dels teus companys de classe aquí.
Així que si alguna vegada té alguna pregunta pel que fa a on la línia
És a dir, si us plau, només arribar a mi personalment.
Però la resposta és sempre, completament estressat al
últim minut, diners en efectiu en un dia de retard.
O si és una qüestió de no tenir dies de retard,
Honestament, correu electrònic personal.
Ja se'ns acudirà alguna cosa.
Si us plau, no posis el teu temps aquí a Harvard en risc.
>> Ara, vaig pensar que hauria alleugerir l'estat d'ànim, de manera que
inclòs això com la següent diapositiva.
[Rialles]
DAVID J. Malan: Aquest lloc web va ser genial.
De fet, em vaig posar una mica distret.
No és aquest.
I aquest era increïble.
Bé, per la qual cosa pensar en gatet tard a la nit quan faci
aquestes decisions.
Totes les coses bé, així que de nou a més diversió i menys greus, com
condicions.
>> Molt bé, així que parlem breument sobre aquests.
Això és una cosa que probablement és bastant familiar de
el món de Scratch.
I en el món de Scratch, tenim aquesta necessitat de vegades per
anar a fer bifurcacions en el camí.
Qualsevol de fer això o allò o això altre aquí.
I quan volem fer això, podem usar, al carrer ara, si aquesta
else.
I llavors aquí tenim booleana.
Per exemple, les expressions booleanes aquí, podem OR
junts, en el sentit que tenim aquesta condició OR
aquesta condició.
Podem i junts, en el sentit que volem
comprovar aquesta condició i sempre que.
I aquí tenim una sentència switch, cosa que no és tan
sintàcticament similars a aquest tipus de condicions, però
ens permet fer l'equivalent a if, else if, else if, else
si, i similars amb només enumerar cas per cas
per cas per cas.
Així que vam veure aquells última vegada.
I llavors vam començar a tocar en coses com bucles.
Vam veure una d'elles fa un moment.
Però no són aquestes construccions de bucles altres.
>> Per exemple, aquest d'aquí.
Així while (condició), fer això una i altra vegada.
Així que bàsicament, el que sembla ser diferent entre aquest
bucle for i el bucle mentre aquí?
Aquest bucle for i aquest bucle while.
Sí?
Què és això?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Good.
Així, mentre que en la condició de bucle, hi ha clarament
més sintaxi.
Hi ha una inicialització, hi ha una actualització.
En un bucle while, no només per aquesta condició.
Així que sembla que és una mica retallada contra el d'
bucle, el que significa que si volem tenir variables i volem
tenir increment, en realitat hem de
fer això nosaltres mateixos.
>> Així que permetin-me seguir endavant i obrir gedit.
Permetin-me canviar l'aparell.
I farem un exemple petit programa que
distingeix una d'elles de l'altra.
I en el fons de la meva ment aquí, he de dir una cosa.
Jo específicament esmentar el nom Tim.
Tim era en realitat algú que un estudiant va tractar de trobar per fer
seva tasca per a ells.
No teníem Tim en aquesta secció en particular.
Així donen compte, no sigui que jo va revelar un estudiant, no era un estudiant.
Era una persona a l'atzar a Internet fent coses
per l'any passat proxy.
Així ens trobem que, també.
Així que en aquest cas aquí, deixa seguir endavant i
obrir un nou arxiu.
Arxiu, Nou.
Això em dóna una fitxa d'aquí.
Deixin-me seguir endavant i guardar-lo com loop.c.
Deixa anar i feu clic a Desa.
I després aquí, seguirem endavant i començar a escriure
# Include.
Permetin-me zoom in
Ara farem int main (void).
Ara vaig a seguir endavant i fer for (int i = 0; i <
oh, 10; i + +).
I ara vaig a seguir endavant i s'imprimeixen de l'estrella que em
vam fer abans.
I després, al final d'aquest programa, només anem a
imprimir una nova línia, només perquè el meu missatge
no es veu tot desordenat.
retorna 0.
Sembla sintàcticament correcta?
Fins ara.
Així que anem a veure.
>> Així que permetin-me allunyar la imatge, entra a la meva finestra de terminal.
I m'ho dius a mi seguir endavant i executar bucle, perquè em va cridar aquesta
El loop.c.
Així que loop.
Sembla que compili a D'acord.
Deixa córrer bucle, i Enter ara.
I sembla que s'han imprès 10 estrelles.
Així que anem a convertir això en un bucle de temps i veure què
tipus de qüestions que ensopegar.
Així que en lloc d'això, deixa entrar aquí i dir mentre que i és
menys de 10 -
em deixa estirar el bucle for.
OK, així que tenim un parell de problemes ja.
Així que l'estat és el mateix, però òbviament estic perdent la
inicialització.
Em falta l'increment.
Llavors, què hauria el compilador probablement em dirà quan tracte de
compilar aquest programa?
Sí?
AUDIÈNCIA: [inaudible].
>> DAVID J. Malan: Good.
Així que va a dir alguna cosa així com no declarat - en aquest
cas, la variable i.
I de fet, l'ús d'identificador no declarat i.
I això està en contrast amb llenguatges com PHP i
Python i Ruby, amb la qual alguns de vostès podrien estar familiaritzats,
on es pot sol tipus d'inici amb les variables
vulguem o no, no s'ha de preocupar de declarar
sempre explícitament.
En C i en llenguatges com Java i C + +, ha de ser
súper explícit.
I si vols una variable anomenada i, el que has de dir-me
Quin tipus de variable que és.
Així que haurem d'arreglar això de la següent manera.
Vaig a haver d'anar per aquí i escriviu int i, per tant,
He declarat una variable anomenada i.
Ara, m'he saltat un pas.
He òbviament no s'inicia, però anem a veure si en aquest
al límit Clang marques queixar.
Així que permetin-me refer aquest programa.
>> Molt bé, ara és només queixar
per una raó diferent.
"La variable 'i' no està inicialitzada quan s'usa aquí". Molt bé, així
això és bastant explícit.
Inicialitzat només significa igualant a un valor.
I no ho he fet, així que tractaré d'igual a 0.
Ara ho intentarem de nou i tornar a executar Clang.
Compilat aquest moment.
I estic a punt d'executar-.
Però gran bucle infinit d'edat, perquè he fet el
inicialització, he fet la condició, però mai he fet
qualsevol tipus d'increment.
Llavors, com puc fer la incrementación?
Bé, en un bucle while, se sent com que tindré
fer dins el bucle, perquè de la mateixa manera que el primer
setmana exemples de fer les construccions de bucles, com amb
els mitjons i amb l'auto-escrutini, que havíem de fer
cosa que al final, com anar a la línia següent.
Què passa si segueixo endavant i fer això i + + aquí?
Anem a compilar ni tan sols això.
Atrápame ja.
Què passa aquí?
AUDIÈNCIA: [inaudible].
>> DAVID J. Malan: Així que definitivament no és int.
Sóc jo.
I les claus, com abans,
sagnia no és suficient.
Així que ara tinc aquesta construcció.
Així, mentre que i és menor que 10, imprimiu una estrella,
llavors em incrementar.
I la manera com un bucle mentre que les obres és que tan aviat com es prem el
part inferior del bucle, que en aquest cas es veu com la línia 10,
que tornarà a la línia 6, en el qual el
se li examinarà de nou.
I si i és encara inferior a 10, farem les línies 8 i
després 9, llavors arribarem a 10, i tornar a 6, una i altra
una i altra vegada i una altra, sempre que i és menor que 10.
Així que anem a tornar a fer fer aquí.
>> Bé, hem compilat bé.
Permetin-me tornar a executar el bucle.
I ara el que realment sembla que funciona.
Així que més i menys aquí?
Bé, fins ara no hi ha en realitat un conjunt de plom -
tan bonic.
Bé, això va ser un - ah, això va ser un accident.
Molt bé, així que anem a anar de nou al bucle for.
Així que per als bucles són agradables perquè són súper explícit.
I encara que són una mica maldestre per escriure, és
molt potent i li permet fer
diverses coses alhora.
Mentre que els bucles no semblen tenir una gran quantitat de valor just
però, pel fet que se sent sol hem de fer més feina.
Hem de posar la inicialització fins aquí, la
Actualitza aquí, i hem de recordar de fer tot això.
Així que anem a veure en el temps que en realitat presten cicles while
només a si mateixos diferents contextos, diferents dades
estructures com llistes i taules hash, ho anem a arribar a
meitat del semestre.
Però per ara, sabem que hi ha aquest tercer tipus conegut com un document
while.
I hem vist breument.
I això podria ser útil amb súper conjunt de processadors 1.
Cada vegada que vols fer alguna cosa i després comprovar si
l'usuari cooperar, i si no ho feien, ho tornaria a fer, un fer-
mentre que el llaç es presta a aquest tipus de lògica.
Com que l'ordre de dalt a baix aquí suggereix,
Què significa literalment fer això.
I fer això una i altra vegada, què podria ser?
Potser signifiqui getInt trucant o GetString i després
comprovant el valor de getInt o GetString i després cridar
l'usuari si no han cooperat al demanar-los que
una i altra vegada i una altra.
Si vostè vol fer alguna cosa una vegada,
a continuació, comproveu alguna condició.
>> Així que anem a provar això.
Permetin-me canviar aquesta realitat ara a un bucle do-while.
I seguiré endavant i fer el següent.
Així que faci el següent.
Farem int i = getInt (), però primer anem a dir-li a l'usuari
què fer.
Així que una mica diferent aquesta vegada.
"Dóna'm un int".
Així que vaig a utilitzar printf per això.
I ara em vaig a anar per aquí, i vaig a fer això
mentre que i és, diguem, més gran que -
veurem, i és, diguem, menys de 0, o és i
més gran que 10.
En altres paraules, vull els números 1 al 9, només
arbitràriament.
Així que estic utilitzant una expressió booleana combinada per
assegurar-se que i és menor que 0 o més gran que 10, en la qual
cas faré aquest bucle aquí de nou.
Així que de nou, fer això -
mentre que i és menor que 0 o i és més gran que 10.
>> Així que ara seguirem endavant i fer això-les després fet això.
Anem a fer una simple comprovació ràpida.
printf ("Gràcies, i és% d", i).
Així que aquest senzill programa demana a l'usuari un int,
s'assegura que està dins d'un rang de l'1 al 9 inclosos,
i agraeix a l'usuari, recordant el que acaben de
escriure, així com una prova de seny poc.
Però anem a veure si això funciona segons el previst.
Deixa anar al capdavant aquí i tornar a executar make bucle.
Hmm.
"L'ús d'identificador no declarat 'i'". Això és estrany.
Vaig pensar que resoldre això.
Símptoma Mateix codi diferent.
Sí?
AUDIÈNCIA: [inaudible] a l'interior dels dos, hem de
[Inaudible].
>> DAVID J. Malan: Exactament.
Així que aquest fet ens porta a un tema conegut com a àmbit d'aplicació.
Resulta que C, un cop més, el que realment et porta literalment.
I si fas alguna cosa com això on es declara un int
i després assignar algun valor, però ho fa dins d'un
parell de claus, el que C fa és que se suposa que
només volen que aquests 32 bits conegut com i d'existir dins de la
context d'aquestes claus, en el context de línies
6 a 9. Així que es declara, i s'assigna un
valor en la línia 8, però quan et donen fora de
línia 9 per sota de la clau de tancament, i ja no està en
àmbit d'aplicació, per dir-ho.
S-C-O-P-I. Ja no és en el context adequat.
Així que ara no hi ha una i, així que és com si no tinguéssim fins i tot
declarar en absolut.
>> Llavors, què és llavors una solució per a alguna cosa com això, si el
raó és que es declara dins de les claus, que
aparentment és dolent?
Heus aquí?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Si.
Així que podem inicialitzar exterior.
Així que permetin-me seguir endavant i eliminar les parts de declaració mitjançant el qual
Puc especificar el tipus, i dóna'm fer-ho aquí.
Així, en la línia 5, que ara diu "Dóna'm un int." Llámelo i.
Observeu que a la línia 9, que no vull fer això, perquè jo
ja té els 32 bits.
No vull demanar a l'ordinador per un
diferents bits de 32.
Vull utilitzar aquests mateixos 32 bits.
I ara perquè m'està declarada a la línia 5, segueix sent legítim
per usar-lo en la línia 11 i la línia 12.
>> Així que tractaré de tornar a compilar això i veure
Clang si deixa de cridar.
fer llaç.
Així que ara és "la declaració implícita de la funció
'GetInt' no és vàlid en C99. "Què és això?
Sí?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Si.
Així que ara que estic realment utilitzant getInt, això no és una cosa
que només ve amb C. Això ve de CS50.
Així que tenim això aquí.
I permetin-me tornar al prompt baix
aquí i tornar a executar make.
Bé, per fi.
Ara que hem resolt això i l'altre error.
Permetin-me ara s'executen bucle i veure què passa.
"Dóna'm un int." Vaig a donar-li 11.
Vaig a donar-li -1.
Vaig a donar-li foo.
Vaig a donar-li 5.
I ara és en realitat funciona.
No obstant això, l'indicador canvia per una raó aquí.
Per què ho dius reintentar d'aquestes vegades, però em dóna un
int les altres tres vegades?
Per què és que el comportament diferent?
AUDIÈNCIA: va donar una cadena.
DAVID J. Malan: Com?
AUDIÈNCIA: Vostè li va donar una cadena.
DAVID J. Malan: Si.
Així que li va donar una cadena en aquest tercer intent,
quan vaig escriure foo.
Foo és una cadena.
Òbviament no és un int.
I la manera com CS50 ha implementat getint és que ens
no comprovar si alguna cosa és menor que 0 o major que 10
per a tu, perquè com podem saber per endavant quin tipus de
int vols?
Però mínimament pugui comprovar per vostè, ¿l'usuari com a mínim
escriviu un nombre enter?
I si no ho feien, els cridem a l'usuari escrivint "reintentar" a la
la pantalla.
>> Així que ara tenim un programa que està bucle. Bé.
Ara, quin d'ells és el tipus de la construcció millor?
Així que aquí és on les coses es posen una mica desordenat, la
fet que vostè ha de recordar per declarar una variable aquí
si vols usar-lo dins d'alguns
claus i exteriors.
Però fins i tot si això li sembla una mica críptic al principi
mirada, només una vegada més, recordar la lògica simple.
Per tal d'utilitzar res en C, si es tracta d'una funció o
que és una variable, cal incloure si es tracta d'una funció
en alguna biblioteca, o vostè ha de declarar.
Però ara cal tenir en compte el fet addicional que
vostè ho està declarant en l'abast adequat.
No ho estàs posant massa força a l'interior dels parèntesis.
>> Així que permetin-me en realitat revertir.
Si tornem al nostre per exemple d'abans, i em vaig
per tornar a int, int i = 0; i <10, i + +, i jo
printf fer estrelles, com aquest, i després parin prop i ara
printf i és ara -
d'acord amb la mateixa lògica, què passarà quan tracte de
compilar aquest programa?
AUDIÈNCIA: identificador no vàlid.
DAVID J. Malan: Així que és un altre identificador no vàlid,
identificador no declarat.
Ara, la raó és una mica diferent.
Òbviament hi ha ni claus aquí, però el mateix
idea, la mateixa història d'abast s'aplica.
Si vostè s'ha declarat una variable com jo dins d'un
bucle for, encara que no s'ha escrit explícitament l'arrissat
tirants, pensa en ells com mentalment encara ser-hi, en el qual
cas i és vàlid només dins del bucle for.
No s'admet la vegada que arribi a la línia següent, que al seu
aquest cas és ara 10.
Així que només unes poques qüestions d'abast i similars.
Molt bé, alguna pregunta?
>> Molt bé, així que això és una espècie d'un petit programa trivial,
imprimir només les estrelles petites.
Però anem a veure si et recordes d'aquesta cançó aquí.
Aquesta és una cançó increïblement molest als nens a cantar en
l'autobús escolar i similars.
Però el bo d'això és que té aquesta ciclicitat,
pel que és "99 ampolles de cervesa a la paret,
99 ampolles de cervesa.
Prengui un a baix, passi al seu voltant, 98 ampolles de cervesa a la
paret. "I llavors la cançó es repeteix el 97, després 96, després
95, 94, fins arribar a 0 si vostè realment ha de
lluny a l'autobús.
Així que aquest és un bon programa per ordenar de implement, perquè el meu
Déu, si pogués implementar això amb uns pocs
línies de codi, es pot escopir les lletres senceres a aquest
cançó amb bastant rapidesa.
Però en el camí, podem començar a molestar ara, a part alguns
d'aquestes construccions bàsiques de bucle i també ara
introduir funcions que ens escriuen, tornar valors
que passa al seu voltant.
Però primer, per què no seguir endavant i prendre el nostre cinc minuts
trencar aquí?
I quan tornem, anem a cantar aquesta cançó.
>> D'acord, estem de tornada.
I quan dic que ara cantarem aquesta cançó, em refereixo a
programació, no verbalment.
Així que aquí tenim beer1.c, que és una aplicació d'aquesta
cançó en particular.
I només perquè quedi clar, per als que no estan familiaritzats amb el que
això s'assembla, deixa anar per davant
i fer beer1, Enter.
Ara vaig a córrer beer1, i el que anem a veure - Quantes ampolles
de cervesa haurà?
Vaig a escriure en el 99, com diu la cançó.
Retorn.
I ara, si ens desplacem a través de -
oops - si desplaçar a través de tot això, veurem que
això efectivament cantar tota la cançó.
Espera un minut.
La meva barra de desplaçament és una mica desordenat.
Anem a fer servir la finestra més gran.
Així beer1, 99, aquí anem.
Així que aquí tenim tota la cançó, cantada molt més ràpid mitjançant la
ordinador del que podria haver estat per nosaltres.
Així notar, però, la naturalesa cíclica aquí.
Diu 99, després 99, després "prendre un a baix, passar
voltant ", llavors 98.
I ara ho repeteix una i altra vegada.
>> Així que això és realment una oportunitat perfecta per algun tipus de
construir un bucle.
Recordeu que jo sóc una mena de tall d'una cantonada aquí.
Tingueu en compte que el que estic dient "98 ampolles de cervesa a la paret,
97 ampolles de cervesa a la paret ", i que era tan
que quan arribem a una ampolla de cervesa, no tinc
de preocupar de la gramàtica Anglès.
Però també podem arreglar això amb una mica més d'un si
condició, potser.
Si aquest nombre és singular, seguir endavant i dir "ampolla",
en cas contrari si és plural, per exemple "ampolles".
Però, per ara, estic completament de tall de la cantonada.
Així que anem a veure el que tenim aquí.
Així que tenim alguns comentaris a la part superior.
Estic incloent aquestes dues biblioteques,
hem estat comunament.
I ara em baixi fins a la primera
pròpies línies de codi.
La línia 17 comença principal.
Línia 21 i 20 té quantes ampolles de cervesa haurà?
I llavors jo dic getInt.
I ara tinc una mica d'una comprovació de validesa.
>> Així que aquesta és una convenció que ara començarem a adoptar
més rigorosament comprovar la entrada de l'usuari.
De vegades simplement no volen que els preguntarà de nou
i una i altra vegada.
Si l'usuari fica la pota i no coopera, està bé.
Deixi de fumar i no s'ocupen d'ells.
I això és el que estic fent aquí.
Si n és menor que 1, només vaig a cridar als usuaris,
"Em sap greu, això no té sentit." I després em vaig a
arbitràriament tornarà 1.
Així que de nou, això és només una convenció per acostumar.
De moment, assumir la fe.
Però fins ara, sempre hem estat tornant 0, perquè
hem dit retornant 0 denota què?
AUDIÈNCIA: Èxit.
DAVID J. Malan: Èxit, això és tot.
Així que ara que finalment estem començant a pensar en
que no són èxits -
en altres paraules, casos de cantonada, condicions d'error -
ara tinc un subministrament infinit, o almenys 4000000000
possibles coses que poden sortir malament en els meus programes.
I puc començar a assignar els números individuals.
Ara, en general és suficient per tornar només
una mica diferent de 0.
Així que anem a tornar simplement 1 per ara.
Però el motiu de la devolució 1 és que tan aviat com torni
1, saps què passa amb la resta del programa?
Que s'aturi.
Això és tot.
Així que el fet que m'estic tornant 1 és eficaç
un curtcircuit en l'execució d'aquest programa, de manera que
res per sota de la línia 27 es segueixi executant.
Així que es torna principals, que és.
>> Molt bé, així que si l'usuari fa cooperar i arribar a la línia 30
Diu l'Escriptura en un nombre legítim, he aquí el meu
aplicació d'aquesta cançó.
Així que primer imprimeixi un caràcter de nova línia, només per
estètica.
Ara tinc un bucle for.
I notin que estic fent les coses una mica
d'una direcció diferent.
Jo no he de fer menys, no he de fer + +.
Jo en canvi puc dir inicialitzar una variable i i igualar-la a
n, el nombre que l'usuari va escriure en, i després fer el següent, de manera que
sempre i quan i és més gran que 0, i -
una vegada que hagi acabat d'una iteració d'aquest bucle.
Per tant, pot comptar amb un bucle for també.
Ara, aquesta és la setmana més o menys una cosa ara, amb printf.
Així impressió "% d ampolles de cervesa a la paret." Imprimir "% d
ampolles de cervesa. "" Prengui un a baix, passi al seu voltant. "Imprimir
"% D ampolles de cervesa a la paret." Pel que és encara% d, però
adonar que l'argument de printf està canviant.
Després de la coma, jo tinc, perquè vull dir 99.
Després d'aquest coma, jo tinc, perquè vull dir 99.
Després d'aquest coma, i have - 1, perquè vull dir 98 a
aquesta primera iteració, i així successivament.
I ara aquí, només tinc una mica d'observació poc estúpid.
I després la línia 42, de tornar 0 per convenció, el que significa que
tot està bé.
>> I què si em va ficar la pota?
Què pot un error molt comú aquí és?
Bé, i si accidentalment dit bé, jo vull comptar
a 0, vull 0 ampolles de cervesa a la paret?
Per això dic, i és major o igual a 0.
Què serà el símptoma que ara veig si em recompilar
beer1 i executar?
AUDIÈNCIA: Negatiu.
DAVID J. Malan: Sí, serà negatiu.
Aquest és un error de tancament d'una banda, un increïblement
error comú de fer.
Que en realitat es remunten a la finestra de terminal i fer-ho
aquí, perquè puguem veure alhora.
Intro, 99 ampolles de cervesa.
A prop, però vam ser molt lleugerament massa lluny.
Cantem la cançó massa baix, de manera que ara colpejar el
nombre negatiu.
Així que no acaba de funcionar.
>> Molt bé, així que fàcilment es pot arreglar tornant a la
manera que una vegada va ser.
Però, quins són algunes oportunitats ara per
millora?
Bé, deixa obrir beer2.c i baixi aquí i fer una
mira aquesta versió.
Què és el primer que salta a la vista tan diferents
en aquesta versió aquí?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Sí, així que no sóc jo, perquè se li va acudir a
em saps què, jo estic preguntant a l'usuari per an, i llavors estic
establint i igual a n, i després em i canviant, però mai estic
n tocar de nou.
Llavors, què diables era el punt que l'assignació d'altres 32
trossets vaig trucar només perquè jo pugui tenir una variable diferent?
Així que en aquest cas, en certa manera em va reconèixer que innecessari
disseny característica.
I ara diré mentre que n és més gran que 0, vagi
endavant i imprimir la mateixa cançó, passant per una n al printf com la
El segon argument, i n - 1 com el segon argument aquí.
I després en cada iteració d'aquest bucle, seguir endavant i només
decrementar n si mateix.
Ara, funcionalment, aquest programa
serà idèntics.
Si escric en el 99, n comença a les 99.
Jo decrement, reducció, disminució, decrement.
Vaig a arribar fins al final amb "Una ampolla de cervesa a
la paret, una ampolla de cervesa.
Prengui un a baix, passi al seu voltant.
0 ampolles de cervesa a la paret. "Al final, ho vaig fer perquè
obtenir la condició correcta.
És més gran que 0.
Jo no cometre aquest error.
>> Llavors, què és millor, una versió o la versió dos?
Això he sentit un munt de murmuracions per a dos.
Per què dos?
Què és això?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Oh, està bé.
Així que no estigui per sota de 0, però recorda, en una versió, la
versió correcta original no anar per sota de 0 tampoc.
Així que recordi que aquesta és la versió correcta.
Així que anem a almenys comparar les dues versions correctes.
Què és un argument a favor de la versió
dos que, mmm, millor?
Sí?
AUDIÈNCIA: S'utilitza menys espai.
DAVID J. Malan: Bé, de manera que ocupa menys espai, no?
Considerant que una versió de 32 bits utilitzat per an, i després una altra
32 bits per i.
Versió dos només utilitza 32 bits per an, de manera que
sembla ser un avantatge.
Altres pensaments?
Algú vol argumentar en favor d'un?
Sí?
AUDIÈNCIA: Vostè ha de fer servir la línia addicional de codi de n -.
>> DAVID J. Malan: Bé, clar.
Així que això és just.
Així que aquest just, si més no per a mi -
Vull dir, això realment se sent una mica més desordenat, el fet que
No puc ordenar d'encapsular tota la meva lògica en un
bella línia, el bucle for, ja que el bucle for pot.
Aquí, com que he de virar en aquest núm -
al final del bucle, perquè
és lògicament necessari.
Però és com que em frega el camí equivocat, simplement perquè
sembla independent de la lògica d'aquí, tot i que,
de nou, és necessari.
Altres pensaments?
Sí?
AUDIÈNCIA: [inaudible].
>> DAVID J. Malan: Si.
Llavors, què passa si en lloc, al final de la cançó, volia
imprimir de nou el nom de la cançó?
Igual que "Gràcies per jugar 99 ampolles de cervesa", o alguna cosa
ximple com això?
Però el punt és, que volia tenir accés al valor original.
El fet que hagi mutat o canviat en tots els n
iteració, pel que han destruït el seu valor original
significa que no es pot fer això al final.
Ara, sens dubte, és evident que no volen fer
que en aquest programa.
Llavors, qui li importa?
Però això és un punt molt vàlid.
I per ser honest, realment no hi ha una
dret de contestar aquí.
Els dos són igualment correctes.
Podria estar convençut de qualsevol manera.
M'agradaria dir que, en general, és un bon principi si
demana a l'usuari un valor i emmagatzema en una variable
com n, només una mena de qüestió de principis, és probablement bo
per mantenir aquesta situació.
I totes les dades que voleu mutar una i altra vegada, només
doneu una còpia d'aquesta variable, només perquè
tenen accés a l'original.
Vostè està gastant més de 32 bits, però la realitat és aquesta
ordinador té, com, dos gigabytes de RAM en aquests dies,
i estem subtileses més de 32 bits?
Realment no és una gran cosa.
I fins i tot en aquest dispositiu aquí, amb una mitjana d'un concert o d'una
gigabyte de RAM, 32 bits davant 64 bits,
no és una gran cosa.
Certament, avui dia, serà molt aclaparats per la grandària
del programa en si, que serà de diversos centenars
kilobytes, sinó en uns pocs megabytes, en aquests dies.
>> Preocupacions tan raonable, no una resposta correcta.
Però almenys aquests són els pensaments que han de començar a
passen per la teva ment?
Com que en conjunt de processadors 0, tot i que en realitat només s'espera
correcció, o almenys que renunciï a diversos bugs
és possible que hagi trobat, a mesura que avancem, el disseny és
serà un altre aspecte clau, tant de l'escriptura de codi
i també avaluar el nostre codi.
I així, si més no, donar creu que aquest tipus de coses.
I només perquè alguna cosa funciona no vol dir que sigui bo,
no vol dir que estigui ben dissenyat.
I aquesta és una de les coses que els becaris de docència i
conjunts de problemes ens ajudarà a molestar part amb el temps.
>> Bé, què passa, anem a dir que aquesta versió aquí?
Deixa fer alguna cosa una mica més sexy aquí en un moment.
En primer lloc vull desfer-me d'això.
I ara anem a resoldre aquest problema gramatical.
Així doncs, en aquesta versió, vull fixar la gramàtica de manera que,
en comptes de dir s entre parèntesis, com "ampolla"
o "ampolles" -
No vull tallar aquesta cantonada -
També vull imprimir dinàmicament la paraula "ampolles"
o "ampolla", utilitzant aquests marcadors de posició% s avui.
Així que he de comprovar condicional quin és el valor de i.
I si és 1, el que vull dir "ampolla", i si és una cosa
una altra cosa, vull dir "ampolles". Així que anem a tractar de fer això.
Així que si i == 1, llavors m'ho dius a mi seguir endavant i declarar -
Necessito una cadena, així que vaig a fer la cadena s1, perquè és la
primera cadena que m'importa en aquest moment.
Vaig a dir "ampolla". I llavors, anem a veure, la cadena de
s2 - i vaig a explicar a on vaig en un moment -
"Ampolles". Així recordar que, en aquesta cançó, hem de ser capaços de
per imprimir les coses, dues paraules diferents en potència.
Així que si mirem cap enrere aquí, noti que quan arribem a
aquest exemple aquí ", dues ampolles de cervesa a la paret,
dues ampolles de cervesa, prengui un a baix, passi-al voltant ", vull
aquesta quarta línia de dir ara "una ampolla de cervesa a la
paret ". Així que he de decidir, és el que vull dir" ampolles "o
"Ampolla"? Així que vaig a dir arbitràriament, d'acord,
Vaig a declarar ara una variable anomenada s1, cadena
un, que es posarà endollat ​​aquí i aquí també,
perquè aquestes paraules són sempre idèntics, només pel
naturalesa de la cançó.
I jo vaig a trucar s2 qualsevol paraula que vull
finalment apareix aquí baix.
Ara, literalment, 99 vegades de cada 100, que serà el
mateix en ambdós casos, perquè 3 és plural, és 2
plural, 4 és plural.
Però en aquest cas de la cantonada, on vam arribar a 2 i després 1, o
ni tan sols l'1 i després 0, necessito aquesta lògica.
Així que he de passar algun temps en el meu codi d'aconseguir aquest dret.
Així que si faig això, si i == 1, llavors s1 igual a "ampolla"
i s2 igual a "ampolles", perquè això serà per a un
ampolla, i això serà per ampolles 0.
I aquí, què representa això?
Perquè quedi clar.
Això és només un comentari.
Així que el fet que vostè pot tenir una sola línia comentaris que significa
pot comentar el seu codi com aquest, però comú a un altre
paradigma, també, és que si vostè té una frase curta que super-
desitja posar-se i és simplement més fàcil de llegir per posar
el just al final de la línia de codi, pot
absolutament fer alguna cosa com això.
>> I ara què si ho faig? Perquè si no és igual a 1.
Així explosió igual a -
signe d'exclamació es coneix com "bang".
Així explosió = 1.
Així que si no és igual a 1, quin lloc vols fer?
Bé, la primera paraula que vull ser què?
Així que ha de ser una cadena de "ampolles" per ampolles plurals,
i llavors això serà plurals "ampolles", així, per ara.
I veurem si en realitat això ens porta a
cap a on volem anar.
Així que ara si em desplaço fins aquí, fixeu-vos que estic connectant
no només jo, sinó s1.
Estic connectant ii s1.
I a continuació, aquí baix, estic menys 1, que és el mateix que
abans, però s2.
En altres paraules, vull que la paraula Anglès a canvis d'acord
en aquesta lògica.
Ara, ja hi ha alguns problemes en aquest codi.
Què s'ha trencat ja fora de la porta aquí?
Sí?
AUDIÈNCIA: [inaudible].
>> DAVID J. Malan: Exactament.
Així que ja has violat la lliçó d'abast.
Així que he declarat s1 i s2, però ho he fet dins
claus, el que significa, sí, aquest codi funcionarà fins
fins que la línia 42, però tan aviat com vaig arribar a la línia 43, endevinin què no
ja no existeix?
Bé, endevinin què ja no està en l'abast - ni s1 o s2.
Així que hem d'arreglar això.
Així que permetin-me eliminar les declaracions.
I vaig a deixar els noms de les variables i eliminar aquest aquí
i eliminar aquest aquí.
I en quines línies han de declarar que realment aquestes coses?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Sí, per la qual cosa probablement
fins aquí, 33-ish.
Així cadena s1 i s2 cadena.
I resulta que, no puc fer això.
Si vostè està declarant dues variables del mateix tipus,
vostè pot simplement utilitzar una coma i fer que en C. Tots
bé, així que ara tinc dues variables -
s1 i s2.
Els estic assignant valors en aquests
condicions aquí, o aquí.
I llavors jo estic usant baix.
Què tan bé està això ara va a funcionar?
>> Bé, tot i així és una mica buggy, però veurem si més no
fins on hem arribat.
Així que permetin-me anar endavant i fer beer3.
És aquesta beer3?
Sí, aquest és beer3.
I ara m'ho dius a mi seguir endavant i executar beer3.
399 99.
Probablement puguem passar la major part d'ells.
I aquí baix, mira això.
"Una ampolla de cervesa a la paret, una ampolla de cervesa, prendre
un a baix, passi-al voltant, 0 ampolles de cervesa a la paret. "
Però estic cridant la seva atenció només a la meitat de la solució.
Una mica fastiguejat aquí.
Així que sembla que els casos de cantonada sorgeixen quan i és igual al que
dos valors?
AUDIÈNCIA: 2, 1.
DAVID J. Malan: 2 i 1.
No 1 i no és 1.
És realment només aquestes dues últimes estrofes d'aquesta cançó.
Llavors, què he de Volies fer?
Així que sembla haver capturat el cas que si i és == a 1,
a continuació, la primera paraula és "ampolla", però la segona paraula
és "ampolles". Però aquí, vull canviar això sigui == 2.
I si aquest és el cas, què vull la
primera paraula que es?
AUDIÈNCIA: "Ampolles".
DAVID J. Malan: "Ampolles", així que per dues ampolles.
I llavors aquí aquesta paraula ha de ser -
AUDIÈNCIA: "Ampolla".
DAVID J. Malan: "Botella", en singular.
>> Molt bé, anem a reduir, tornar per aquí, tornar a executar make,
torni a executar beer3, escriviu 99 de nou.
Està bé, "Segmentació fallada (core dumped)".
Què he fet malament?
AUDIÈNCIA: No té un valor de [inaudible].
DAVID J. Malan: Ah, excel · lent punt.
Molt bé, i què està malament aquí?
Així fallada de segmentació, i estem realment veurà
això unes quantes vegades en el futur, deliberadament.
Però per ara, què significa això realment?
Un error de segmentació gairebé sempre vol dir que vostè té
d'alguna manera van intentar accedir a la memòria, la memòria RAM en el seu ordinador,
que no és de la seva propietat, que no s'han demanat al
sistema operatiu per.
Així que en aquest cas, adonar-se del que he fet, que és
defectuós en la meva lògica.
He assignat s1 i s2 un valor si i és igual a 1.
També he fet que si i és igual a 2.
Però no ho he fet en l'infinit nombre d'altres
possibilitats -
en particular, 3 o 4 o punt, punt, punt, 99.
Així que una solució per això podria ser només anem a
té una condició més.
I m'ho dius a mi entrar aquí i dir s1 és igual a -
Què hauria d'estar aquí?
AUDIÈNCIA: [inaudible].
>> DAVID J. Malan: "Ampolles", perquè en el cas comú,
és simplement el mateix.
Així que equival Ho van dir ells, "ampolles". Així que per plural
ampolles, i després fins aquí, per ampolles plurals.
Bé, ara vull tornar a la meva finestra de terminal,
recompileu, torna a córrer.
99.
Sort.
I farem una simple comprovació ràpida.
Tècnicament, ens agradaria llegir tot això per assegurar-se que
si és correcta, però anem a veure
els menys culpables coneguts.
3 ampolles, 2 ampolles, 2 ampolles, 1
ampolla, l'ampolla 1, 0 ampolles.
Sembla que ens hem fixat, almenys, per ara.
Però el problema aquí és que el que és un embolic terrible déu és
només per resoldre un estúpid
d'un caràcter detall gramatical.
Així que hi ha una mena de raó de tallar aquesta cantonada
anteriorment, pel fet que és completament molest haver de
escriure aquest codi molt.
Però resulta que no hi ha manera una mica més elegants de
expressant exactament el mateix.
I podem fer-ho de la següent.
>> Permetin-me deixar això a la pantalla per un moment i
introduir alguna cosa conegut com un operador ternari.
Això és una mica d'una sola línia que acaba de dir per fer que la nostra
viu una mica més sexy, segons el promès.
I jo faré això de la següent manera.
Dóna'm una cadena anomenada s1, i em va deixar
assignar de la següent manera.
(I == 1)?
"Ampolla", en cas contrari "ampolles". String s2 gets (i == 2)?
"Ampolla", en cas contrari "ampolles".
Llavors quina és la diferència?
Aquestes dues línies de codi, al meu entendre, pot
reemplaçar tot aquest embolic.
Així que jo en dic un embolic, perquè és com que em frega la
manera equivocada que és tantes línies de codi.
No està malament.
No és un mal disseny.
Igual, això és perfectament correcte i perfectament bé.
No obstant això, la codificació es torna tediós si s'ha d'expressar així
maleït específicament una i altra vegada i una altra amb una simple
escenari com aquest.
Així que C té algunes dreceres, així.
Així que essencialment està dient declarar una cadena anomenada s1 i
o bé assignar aquest valor o si aquest valor és i == -
ho sento, jo hauria de dir això amb més claredat.
Declarar una variable de s1, assignar aquest valor si això és cert.
En cas contrari, assignar aquest valor.
En altres paraules, aquesta és una mena de forma d'una línia de
dient que si una altra cosa però fent un treball al llarg del camí.
Així que si i és 1, llavors endavant i cridar a aquesta "ampolla". I
llavors això altre, en diuen "ampolles". Mentrestant, el s2,
segona paraula que cal definir, si i és igual a 2, anem a
establir s2 a "ampolla". En cas contrari, ajústelo a "ampolles". I què
això vol dir ara és que puc passar per això i eliminar tots els
aquestes línies de codi.
I quan dic, una mica ridícul, que és ara
sexy, és més sexy en el gènere de sentit estilístic.
El fet que funcionalment, aquest codi és en realitat serà
fer exactament el mateix.
I encara que al principi pot semblar una mica críptic al principi
vista, ja que no he vist abans d'aquesta construcció, que havia
argumenten que és en última instància, serà molt més
fàcil de llegir i molt més fàcil per nosaltres els éssers humans a una espècie de
entendre, perquè ara vostè pot llegir la
codi en una sola línia.
Encara és similar a la de la una si, quan sigui
condició i llavors això és el que hi ha dins seu i l'est
és el que hi ha dins de la persona.
Però podem fer això només molt més elegant.
>> I si ara torno al meu terminal, després d'haver eliminat tots
de les línies i els va reemplaçar amb només els dos,
recompilar, re-run ampolles de cervesa amb el 99, l'avís que el meu
gramàtica és, de fet, segueix sent correcta.
Així que de nou, alguna cosa per començar.
2 ampolles de cervesa, una ampolla de cervesa.
Sembla correcte.
Si.
Així que tenim una solució més curta.
Així que això, també, a mesura que se senti més còmode amb C, no
necessàriament amb el conjunt de processadors primer o segon fins i tot, però
adonar-se que aquestes construccions ens permeten fer les coses cada vegada
més elegant.
Ara farem una altra cosa aquí.
Deixin-me seguir endavant i obrir return1.c.
Ara anem a començar a resoldre un altre problema d'una manera que
ens permet escriure codi més sofisticat.
>> Així que aquest és un programa petit i senzill el propòsit en la vida
és per incrementar els valors.
I, de fet, anem a fer un pas enrere.
Deixa fer això manualment.
Deixa fer incloure i int main (void).
I m'ho dius a mi anomenar aquest increment.c.
I què és el que vull fer?
Vaig a seguir endavant i dir alguna cosa com -
anem a trucar als números de la mateixa -
x int.
Així int x obté 2; printf x és% d, línia nova, x.
Així que estic escrivint ràpid, però tipus de coses familiars ara.
Llavors faré x + +.
Llavors em vaig a imprimir la mateixa frase de nou.
I després vaig a tornar 0 només per sortir del programa.
D'acord, aquest és un programa que
increments d'un nombre.
Es va a inicialitzar 1 alguna cosa a 2, i llavors és
s'incrementarà i imprimir de nou.
>> Així que anem a córrer increment, programa increïblement simple.
Però suposem ara que vull per al cub de valor, també ho fan
alguna cosa una mica arbitrària.
I jo realment vull fer x obté el cub de la mateixa.
Així que podria utilitzar el que s'anomena la funció pow, però no ho faig
realment sap on és encara.
Així que vaig a fer-ho de la manera passada de moda.
x vegades això és igual a X vegades x per x.
Així que estic cubicar el valor, multiplicar per si mateix de nou
i una i altra vegada, perquè puguem aconseguir el poder
de 3 en aquest cas.
Així que ara els números que he d'imprimir ha de ser, com veurem
aquí - fer d'increment, pel que en realitat no és realment incrementar
ja, però anem a deixar el nom per si mateix -
2 i després 8.
Ara, tenim el començament d'una oportunitat per al perfeccionament
aquí, de manera que aquesta cosa cubicació de multiplicar un nombre
per si mateix per si mateix per si mateix se sent com això només podria ser
útil tenir una funció, igual que algú va decidir
anys enrere - ja saps, una mica útil si un de nosaltres se senti
i escriu printf perquè la resta del món pot usar,
Per què no ens asseiem a escriure una funció anomenada cubeta
que fa això cubicació per a nosaltres, així que no ha de manualment
posar en pràctica el concepte de cubicar valors aquí?
>> Així, un exemple senzill, però seguirem endavant i utilitzar això com una
oportunitat d'escriure la nostra pròpia funció.
Així que fins ara, només hem utilitzat principal, i hem utilitzat altres
funcions de les persones, però no hem escrit la nostra.
Així que aquí anem.
Vaig a seguir endavant i escriure una funció anomenada cubeta.
I vaig a haver de prendre una entrada.
Pel que la seva aportació serà un nombre enter.
I què farà?
Va a declarar int sortida = entrada de temps entrada
temps d'entrada.
I després es tornarà aquest producte.
I llavors he de ser específic ara.
Aquesta funció va a tornar un int.
Així que aquí és, llavors, com li agradaria escriure les seves pròpies funcions.
En primer lloc, decidir quin és el nom del seu
funció serà.
I, en general, alguna cosa explicatiu és bo, així que vaig jo
diuen cub.
Llavors vostè ha d'especificar el que es va a tornar, el que és
seva sortida serà.
I no tenim moltes opcions encara.
Int, char, float, bool, string.
Per ara, em quedaré amb un int, perquè ho vull
per tornar un sencer.
Llavors vostè ha d'especificar quines són les seves entrades, si n'hi ha, són.
I si cube pren un argument, pren una mica entre
parèntesi, vostè ha de donar aquest argument un nom perquè
es pot dir alguna cosa com ho estem implementant o escriure
aquesta funció, i cal donar-li un tipus, que en aquest
cas serà int.
Així que en resum, la galleda és una funció que pren un sencer
com a entrada i retorna un enter com a sortida.
>> Llavors, què fer amb aquesta entrada?
Doncs bé, en la línia 14, declaro una variable de sortida es diu, i jo
assignar-li el valor, Entrada de vegades vegades d'entrada.
I llavors torno sortida.
Llavors, com puc utilitzar això llavors?
Què puc canviar aquests caràcters ressaltats en línia
7 sigui, et sembla?
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Sí, així cub de x.
Llavors x és una variable, el que significa que té algun valor.
Afortunadament, és de tipus enter.
I pel fet que x és un int, això vol dir que puc passar a cub.
I tot i que estic reemplaçant el valor de x pel valor
x de cub, com ha estat el cas fins ara, cada vegada que
tenir signe igual i una línia de codi, les coses en el dret
s'executa i després s'assigna a la
valor de l'esquerra.
Així que l'ordre de les operacions és com esperaríem.
Així funciona això?
Bé, deixa baixar aquí.
Permetin-me obrir la meva finestra de terminal.
Permetin-me fan increment, Intro.
"Declaració implícita de 'cub' no és vàlid en funció
C99. "Com un part, C99 es refereix al llenguatge C, ja que era
definit el 1999, que era una actualització sobre la versió de
1989, que és una actualització sobre l'original.
Així que això és tot el que això significa.
>> Llavors, què significa que "la declaració implícita de
"Cub" funció no és vàlid? "És just aquí.
És allà, en la línia 12.
AUDIÈNCIA: [inaudible].
DAVID J. Malan: Què és això?
AUDIÈNCIA: No és abans.
DAVID J. Malan: No és abans.
Així que aquesta és la cosa.
C és una mica estúpid, o els compiladors de C són una mica estúpid.
Realment només fer el que els diuen que facin.
I, en particular, només llegir el seu codi de dalt a baix,
d'esquerra a dreta.
Així que si el compilador, Clang, llegeix el codi, línia 1,
s'adona de com fer això.
Oh, aquí arriba principal.
Bé, deixa seguir endavant i declarar una variable x.
Permetin-me imprimir alguna cosa.
Línia 7, què diables és el cub?
No és declarada en stdio.h.
No ve amb C. No tinc ni idea de què fer.
I així Clang només rescata i es tanca amb el missatge d'error.
Així que podem arreglar això en un parell de maneres.
Podem ensenyar el Clang cub és on amb només moure el
declaració és.
Així que vaig tallar i vaig sobre de principal.
Ara s'adonen que només perquè principal ja no és primer, és
sent executat per defecte.
Principal és principal.
És el nom de la funció per defecte.
No importa on es troba en un arxiu.
Però almenys ara Clang ha vist cub abans d'usar-lo.
Així que anem a veure si Clang és més feliç ara.
Feu increment, si compilar aquest moment.
>> Deixa córrer increment.
I, de fet, sembla estar funcionant.
Ara, vostè pot arribar a escenaris on eventualment
no és factible posar totes les funcions
per sobre de qualsevol altra funció.
Et quedes encallat en aquest bucle infinit en la realitat,
on aquest tipus vol ser aquí, però aquest
individu ha de ser-hi.
Així que això no sempre funciona.
Així que gràcies a Déu, C té una solució més elegant.
Vaig a posar això on era, només perquè
prefereix, com una qüestió de principi, que sempre el principal
a la part superior, perquè és només agradable veure el que aquest programa
fa per defecte.
I el que vaig a fer aquí és declarar el que s'anomena
un prototip.
Vaig a tornar a declarar la meva funció cúbica, literalment,
copiar i enganxar.
En realitat, això no és literal.
Així que, literalment, copiar i enganxar la línia 15
per sobre de la línia 6.
No importa el que la línia aquesta s'hagi apuntat.
Li passa a ser a la línia 4.
Però ha de ser abans de principal.
Però noti la diferència.
Línia 4 acaba amb un punt i coma, el que significa bo,
Clang, pren la meva paraula que hi ha una funció
anomenat cub que pren un int i retorna un int.
Però no vaig a dir-te el que és.
Només sé que em compromet a dir-li el temps.
I de fet, ara que està bé que es tracta a continuació.
>> Així que aquest és generalment millor, perquè llavors a la part superior de
seu arxiu, vostè pot recitar d'una tirada, de tir ràpid, una línia
cada un, el que els noms de les seves funcions són, quin és el seu
les entrades són, quines són les seves sortides són.
I per ser més clar, l'entrada general significa discussió o
paràmetre, sinònims.
Sortida significa valor de retorn, el que fa
mà cap a mi.
Així que en aquest cas que ens ocupa, la galleda s'ha declarat a la part superior, però
defineix, també conegut com aplicar, a la part inferior.
Així que ara anem a tornar aquí i torneu-la a.
Així que ara seguirem endavant i tornar a executar make, torneu a executar increment.
I ara sembla estar funcionant molt bé.
Així que ara podem seguir endavant i factoritzar una mena de
cervesa exemple en aquesta quarta versió.
Així que em baixi aquí.
I noti quin tipus de prendre seriosament aquesta lliçó ara.
El fet que jo estava cantant la mateixa estrofa una i altra
una i altra vegada, la línia de cor en la cançó mateixa, es va sentir
Com per què no ho faig factor que en una funció?
I de fet, aquesta ha de ser una de les motivacions.
A més del fet que una altra persona al món que desitgi
utilitzar una funció de cub -
aquesta és una bona raó per factoritzar una mica i escriure el seu
funció personalitzada -
si hi ha un tros de codi en el seu programa que només fa
sentit conceptual, quin tipus de necessitat de donar un
nom - com en aquest cas, chorus -
llavors vostè pot escriure de manera similar que com una funció separada.
No ha d'escriure tot en principal si només
se sent més net per separar i donar-li un nom.
>> Així que en aquest cas aquí, fixa't que tinc un comentari sobre
aquesta funció que només canta sobre el
números especificats d'ampolles.
Noteu aquí que no cal trucar a aquests
coses d'entrada i sortida.
De fet, aquesta vegada m'acaba de trucar la meva entrada B per ampolla.
I fixin-aquí, nul · suggereix què?
Aquest cor -
AUDIÈNCIA: No l'hi torni.
DAVID J. Malan: No es troba cap valor.
I, en efecte, les funcions no han de tornar valors.
Ells només poden fer alguna cosa.
Ells poden tenir el que es denominen efectes secundaris, que en aquest
cas és només un munt d'impressió a la pantalla.
Així notar que aquest codi aquí, literalment va robar a
l'exemple anterior.
L'única diferència és que en lloc d'utilitzar com el meu
variable, ara ho estic fent servir b com el meu variable.
Així que tinc aquí baix b, b tinc aquí, tinc b
menys 1 aquí baix.
Però el codi és exactament el mateix.
Però a mostrar ara com podem utilitzar això, deixa anar
endavant i canviar realment es tracta d'un bucle for.
for (int i = n; i> n; i -).
>> Així que he robat que a partir del nostre exemple anterior.
Anteriorment, està en la línia 37, que hauria començat
cantant aquesta cançó molest.
Però en canvi, jo només vaig a trucar ara cor de i.
Fet.
Així que ara a cada iteració d'aquest bucle, dic a aquest altre
funció, cor, que es va ocórrer escriure.
No va ser escrit per algú més anys.
Però cor, per la seva banda, utilitza printf per imprimir
a terme aquestes quatre línies.
Però el fet, sóc a cor una i altra vegada en una
bucle significa que vaig a aconseguir, al final, el
cançó exactament igual que tinc fins ara.
Així que en resum, ara si miro cap enrere en el meu codi, tot i que
funcionalment és equivalent adonar que és
començant a arribar encara més llegible.
Jo no sé exactament com getInt
s'implementa.
Francament, no sé com s'implementa cor.
Però no m'importa.
No m'importa, perquè ara puc ordenar de, com a ésser humà, llegir
aquest fons de dalt.
I pel fet que les funcions es denominen d'acord amb el que
fer, el meu codi és cada vegada més fàcil de llegir.
I com els nostres programes d'aconseguir molt més complex -
a finals del semestre, se li escrivint centenars de línies
de codi en llenguatges com PHP i JavaScript i similars -
trobareu que és molt més fàcil de fer un seguiment de
el que has fet.
I quan comenci a col · laborar amb amics o
socis o companys de treball, vostè serà capaç d'escriure molt més
programes massius de començar a fer exercici aquests bàsics
blocs de construcció.
>> Així que amb això dit, per què no en diuen un dia?
I ens veiem el dimecres.
[Aplaudiments]