[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]