DAVID J Malan: Totes dreta, de manera que aquest és CS50. I això és clarament un divendres. I aquest és el final de la primera setmana. Així que vostè pot recordar que el deixem, l'última vegada, amb un cliffhanger de classes. Pel qual exposem aquesta mentida, que no importa el que t'han ensenyat creixent dalt, 1 dividit per 10 no és, en De fet, 0,1 o 0,100 o 0,10000. De fet, si compilem aquest programa, com ho vam fer ahir, amb, fer imprecisió, i després fer punt, ratlla vertical, imprecisió, ens assabentem que això és el que hi ha 1 dividit per 10 és en realitat. Així que això no és realment el cas. Però això no fa al·lusió a algun limitació fonamental de les computadores. I, de fet, entre els coses que van a fer avui és fer una ullada a per què això té succeït, quines implicacions que això té, com la humanitat ha fracassat comprendre això en alguns molt situacions-greu el resultat de la qual ha estat força tràgica i expensive-- i també fer una ullada a la forma en què en realitat pot defensar contra aquests tipus de limitacions. Així que de manera intuïtiva, potser, per això es 1 dividit per 10, d'acord al meu equip aquí, no només 1.10, 0.10? Sí. Què penses? MEMBRE DE L'AUDIÈNCIA: L'arrel és diferent? DAVID J Malan: El que és? Oh, l'arrel és diferent? Així que no del tot. En realitat és més fonamental per al maquinari. Altres pensaments? Sí. MEMBRE DE L'AUDIÈNCIA: Ells representar els nombres de manera diferent? DAVID J Malan: Així ells-- Dret. Ells representen nombres diferent. Inexacta, pel que sembla. Així que és-- Bé, diferent al que? O de qui? De nosaltres? MEMBRE DE L'AUDIÈNCIA: Sí. No utilitzen el decimal sistema per [inaudible]. DAVID J Malan: OK. Així que en cert sentit, no ho fan utilitzar el sistema decimal. Sota el capó, tot el que és, de fet, binari, i això és relacionat, de fet. Però és encara més simple explicació que això. Sí. MEMBRE DE L'AUDIÈNCIA: Ells només tenen tants bits. Només poden emmagatzemar fins a un cert mesura, igual que amb els decimals. DAVID J Malan: Sí. Això és el que realment està aconseguint en ella. Resulta que els ordinadors generalment, sempre ho farà només utilitzar una quantitat finita d'informació per representar alguna cosa. Oi? Després de tot, només tenim un fix quantitat d'espai en disc dur. Només tenim una quantitat fixa de RAM, o memòria de l'ordinador. I si només té un quantitat fixa d'alguna cosa, Segurament vostè no pot realment comptar fins fins a l'infinit o qualsevol nombre que desitgi. Vostè, classe de, ha de escollir i triar quin rang dels valors que van a donar suport. I així, per exemple, una o dues setmanes enrere, quan parlem d'ASCII, I parlem de 8 bits o un byte, per així dir-ho, el major nombre que vam poder representar amb 8 bits va ser què? 255. I podem representar 256 valors totals però no si passem a un d'ells en 0-- Bé, però si passar un d'ells en 0, llavors el major nombre és, per descomptat, 255. Així que resulta, que això és el cas també, en aquest context. Comencem a parlar, l'última vegada, sobre els números de punt flotant, que són diferents de nombres enters, en que tenen un punt decimal i, amb sort, alguns números després d'això, però són massa. Un ordinador és només normalment va per utilitzar 32 bits, potser 64 bits per representar un valor de punt flotant. Així que, encara que hem crescut aprenentatge de les matemàtiques i el coneixement que pot tenir absolutament un nombre infinit de nombres després del punt decimal, no si té memòria finita. Vostè, classe de, ha de arrodonir, o triar quin nombres que representaran. I pel que es pugui imaginar, en cert sentit, sent aquest de l'ordinador més propera aproximació al valor que desè que pot aconseguir, amb tan sols 32 o menys bits. I no és només un dècim. Per exemple, si canvi això 03.01, que creiem que és encara més simple. Així que 1 dividit per 3. Déjame desar el fitxer. Déjame anar per davant i recompilar. I permetin-me tornar a executar-lo. També en aquest cas, pel que sembla, un terç no és 0.3 i després un nombre infinit de 3 de a partir de llavors. Vostè té aquesta imprecisió al final. Així que nosaltres, els humans són correctes, i què que va aprendre és, de fet, correcta, però estem xocant contra algunes limitacions. I el que jo pensava faríem avui, està comencem examinat, francament, el tràgiques conseqüències d'aquesta de vegades, quan la humanitat no acaba de posar en pràctica d'aquesta realitat i d'aquestes limitacions. I anem a veure una sèrie de vinyetes des del canal de la història que es porta a Una mirada a com les coses han anat malament. Es tracta de 8 minuts de durada, i anem a tornar després d'aquest i fer una ullada a exactament Què més pot anar malament. Si poguéssim atenuar la lights-- [REPRODUCCIÓ DE VÍDEO] -Informàtica, Tots hem arribat a acceptar els problemes sovint frustrants que anar amb ells. Errors, virus i programari errors són preus petits a pagar per la comoditat. Però en l'alta tecnologia i d'alta velocitat aplicacions militars i programa espacial, el problema més petit possible magnificar en el desastre. El 4 de juny de 1996, els científics van preparar per llançar un coet Ariane 5 no tripulat. Portava científica satèl·lits dissenyats establir amb precisió com el Interactua del camp magnètic de la Terra amb vents solars. El coet va ser construït per l'Agència Espacial Europea i va enlairar de la seva instal·lació a la costa de la Guaiana Francesa. -I Uns 30 segons en el vol, primer alguna cosa notat anava malament. Que els filtres es giratori d'una manera que realment no hauria. Al voltant de 40 segons de vol, clarament el vehicle estava en problemes, i això és quan van fer la decisió de destruir-ho. Un oficial de seguretat Sèrie composta enormes budells pressiona el botó, explotar el coet abans que pogués convertir-se en un perill per a la seguretat pública. -Aquesta Era la donzella viatge de l'Ariane 5, i la seva destrucció es va portar lloc a causa d'un defecte integrat en el programari del coet. -El Problema de la Ariane va ser que no era un nombre que requereix 64 bits per expressar, i ell volia convertir a un nombre de 16 bits. Van assumir que el nombre Mai seria molt gran, que la majoria d'aquests dígits a el nombre de 64 bits eren de 0. Estaven equivocats. -La Incapacitat d'un sol programa de programari per acceptar el tipus de nombre generat per un altre era a l'arrel de la falla. El desenvolupament de programari s'havia convertit en un molt costós part de la nova tecnologia. El Ariane 4 coet havia estat molt èxit, pel que gran part del programari creat per a ella era també utilitzat en el Ariane 5. -El Problema bàsic era que l'Ariane 5 era més ràpid, més ràpid accelerat. I el programari no tenia representar per això. -La Destrucció del coet va ser un gran desastre financer, tot es deu a un error de programari minuts. Però aquest no va ser el primer problemes de conversió de dades de temps havia plagat la tecnologia moderna de coets. -En 1991, amb l'inici de la primera guerra del Golf, el míssil Patriot experimentat una classe similar problema de la conversió de nombre. Com a resultat, 28 persones, 28 soldats nord-americans van morir i al voltant Altres 100 van resultar ferides, quan el Patriot, que se suposava per protegir contra Scuds entrants, deixat de disparar un míssil. -Quan Iraq va envair Kuwait i Amèrica llançat Tempesta del Desert a principis de 1991, Bateries de míssils Patriot van ser desplegats per protegir Aràbia Saudita i Israel dels atacs iraquians míssils Scud. El Patriot és un nord-americà, de mitjà abast terra-aire del sistema fabricat per l'empresa Raytheon. -El Mida de l'interceptor Patriota, sí, es tracta de, aproximadament 20 peus de llarg. I pesa al voltant de 2,000 lliures. I porta una ogiva de sobre-- Crec que és més o menys 150 lliures. I l'ogiva, en si, és un potent explosiu, que té fragments del voltant d'ell. La carcassa de l'ogiva és dissenyat per actuar com perdigons. -Els Míssils són portat, 4 per contenidor, i són transportats per un semiremolc. -El Sistema de defensa antimíssils Patriot es remunta almenys 20 anys. Va ser dissenyat originalment com un míssil de defensa aèria per enderrocar avions enemics. A la primera guerra del Golf, quan la guerra va arribar, l'Exèrcit volia utilitzar-lo per enderrocar míssils Scud, no aeroplans. La Força iraquiana no era tant d'un problema, però l'Exèrcit estava preocupat sobre Scuds. I pel que van tractar de actualitzar el Patriot. -Intercepting Un enemic míssil que viatja a mach de cinc que anava a ser un repte suficient. Però quan el Patriot va ser traslladat d'urgència en servei, l'Exèrcit no estava al tant d'un Modificació iraquià que va fer seus Scuds gairebé impossible de colpejar. -Què Va passar, és que els Scuds van anar entrant, eren inestables, van ser desplaçament. La raó d'això, era que els iraquians, per tal per arribar a 600 quilòmetres de una gamma de míssils 300 quilòmetres, portar el pes de l'ogiva davantera i l'ogiva fet més lleuger. Així que ara, el patriota de tractar d'arribar al Scud, i la majoria de les vegades, l'aclaparadora majoria de la temps, seria simplement volar per l'Scud. -Una Vegada que els operadors del sistema Patriot va adonar de la Patriot no va aconseguir el seu objectiu, detonar ogiva del Patriota, per evitar possibles baixes si es va deixar caure a terra. -Això Va ser el que van veure a la majoria de la gent, aquestes grans boles de foc al cel, i incomprès com intercepcions de ogives Scud. Encara que en la nit cels, Patriotes aparèixer per ser èxit destruint Scuds, en Dhahran, no podia haver error sobre el seu acompliment. Allà, sistema de radar de la Patriot perdut el rastre d'un Scud entrant, i mai posat en marxa, a causa d'un defecte de programari. Van ser els israelians que primer va descobrir que com més temps el sistema estava en marxa, com més gran és la discrepància de temps es va convertir, a causa d'un rellotge incrustat a l'ordinador del sistema. -sobre De 2 setmanes abans la tragèdia en Dhahran, els israelians van informar a el Departament de Defensa, que el sistema estava perdent el temps, que després d'aproximadament 8 hores de funcionament, es van adonar que el sistema era que es vegi amb menys precisa. El Departament de Defensa va respondre comptant totes les bateries Patriot per no deixar els sistemes durant molt de temps. Mai van dir el que era molt de temps. 8 hores? 10 hores? 1000 hores? Ningú sabia. -La Bateria Patriot destinat a la caserna en Dhahran, i la seva deficient interna rellotge, havia estat en més de 100 hores en la nit del 25 de febrer. -És Rastrejats temps amb una precisió d'aproximadament 1/10 d'un segon. Ara 1/10 de segon és un nombre interessant perquè no pot ser expressat en binari, exactament. El que vol dir, no pot expressar-se, exactament, en qualsevol ordinador digital moderna. És difícil de creure, però utilitzar això com un exemple. Prenguem el nombre, la tercera. 1/3 no pot ser expressat en decimal, exactament. 01/03 és 0.333 passant per l'infinit. No hi ha manera de fer això, amb precisió absoluta, en decimal. Aquest és exactament el mateix tipus de problema que va succeir al Patriot. Com més temps el sistema va funcionar, el pitjor es va convertir en l'error de temps. -Després De 100 hores de funcionament, l'error en el temps només al voltant de 1/3 de segon era. Però en termes de l'orientació d'un míssil que viatja a Mach 5, que va donar lloc a un seguiment d'error de més de 600 metres. Seria un error fatal per als soldats en Dhahran. -Què Va passar, és el llançament d'un Scud era detectat pels satèl·lits d'alerta primerenca, i nous que el Scud era venint en la seva direcció general. Ells no sabien d'on venia. -Va Ser Ara fins al radar component del sistema Patriot, defensa de Dhahran, per localitzar i mantenir pista del míssil enemic entrant. -El Radar era molt intel·ligent. En realitat, seria realitzar un seguiment la posició del Scud i després predir on probablement seria, la propera vegada, la radar envia un pols a terme. Això es deia a la porta rang. -Llavors, Una vegada que el Patriot decideix suficient temps té va passar a tornar enrere i comprovar la següent ubicació per a aquest objecte detectat, que es remunta. Així que quan es va tornar al mal lloc, a continuació, no veu cap objecte i decideix que no hi havia objecte, es tractava d'una falsa detecció, i deixa caure la pista. El Scud entrant desaparèixer des de la pantalla de radar, i segons més tard, es es va estavellar contra la caserna. El Scud va matar a 28 i va ser l'últim es van disparar durant la primera guerra del Golf. Tràgicament, el programari actualitzat arribat a Dhahran el dia següent. La falla de programari tenia estat fix, tanca un capítol en l'atribolat història dels míssils Patriot. [FI DE REPRODUCCIÓ] DAVID J Malan: Així que anem a fer una ullada a algunes limitacions similars en només una mica. Però primer, anem a transició a uns pocs FYI és. Així un-- aquest cap de setmana, hi ha serà seccions súper, que estan destinats a suplantar seccions regulars, que posarà en marxa una setmana d'aquí. Fes una ullada a la pàgina web de l'CS50 per obtenir més informació al respecte. També seran filmats i streaming viure per a aquells que no puguin assistir-hi. Butlletí de problemes 1 està al la pàgina web del curs ja, i anem a fer una ullada a que en tan sols una mica. I les hores d'oficina també es portaran a col·locar aquest dilluns a dijous. Així que aquest era el més canònica programa vam veure per última vegada. És com el més simple programa que pot escriure en C, i fins i tot això és una mica d'una afirmació audaç. Oi? Perquè hi ha un munt de aparent complexitat a això. Així que anem a fer una ullada ràpida a el que alguns d'aquests elements eren i després tractar de proporcionar un model mental de com aquestes més simple de programes Treballem, i després anem a començar veure les coses cada vegada més complex. Així que aquesta línia d'aquí, ha destacat avui, en groc, ho vam dir, l'última vegada, que aquest fa per nosaltres? Quin és el propòsit a què serveix? Qualsevol persona de més enrere? Sí. MEMBRE DE L'AUDIÈNCIA: [inaudible] DAVID J Malan: Good. Pel que li dóna accés als comandos, o deixar de cridar a funcions, que algú més va escriure, que es va declarar, per així dir-ho, en algun altre arxiu. Així que anem a veure exactament el que un arxiu .h és enfront d'un arxiu .c, amb el temps. Però, per ara, només sé printf que, per exemple, és una de les funcions que han estat declarada en algun altre arxiu, en algun lloc més en el disc dur del núvol que ens permet accedir a printf i fem servir sense haver de reinventar que roda a nosaltres mateixos. Mentrestant, el principal. Quin va ser l'anàleg de la principal, la setmana passada? Sí. MEMBRE DE L'AUDIÈNCIA: Bandera verda es fa clic. DAVID J Malan: Sí. Scratch, quan es fa clic a bandera verda. És com la peça del trencaclosques que trepitja les coses. I així la mateixa manera, va fer el món va decidir fa uns anys que a C, i un munt d'altres llengües, si vols escriure un programa, seva primera funció ha de ser cridat, principal. I ha de tenir aquest aspecte. Però anem a tornar, una altra vegada, al que, int, i, nul·la, significa en aquest context. Per ara, les claus són amables de la mateixa forma de peça de trencaclosques de Scratch que encapsula un nombre de línies. I entre en les línies aquí, és aquest d'aquí. printf és una funció el propòsit en la vida és imprimir una cadena amb format. I per formatada, vull dir que pot endollar en els valors de marcador de posició, i vostè pot especificar el nombre de decimals punts, la quantitat de nombres per imprimir després d'un punt decimal i similars. I printf, per descomptat, es necessita un o més arguments o paràmetres, si no conegut, més simplement, com entrades. Així printf, com un munt de funcions, pren entrades. I aquestes entrades es van abraçar pels dos parèntesis aquí. I dins dels quals és una entrada. És una cadena, com ho hem anomenat, que és només una seqüència de caràcters, com una paraula o una frase, o en el seu conjunt assaig, fins i tot, entre cometes dobles. I això és el que influirà en el comportament de printf perquè, és clar, és només una funció d'impressió genèrica. No va a saber el que per imprimir, llevat que vostè li indiqui. I després, algunes minúcies. El que vam dir aquesta estranya seqüència de símbols és? Sí. MEMBRE DE L'AUDIÈNCIA: Nova línia. DAVID J Malan: Nova línia. Així que resulta, que no només pot colpejar, entrar, quan estàs escrivint el programa. En general, el compilador es posarà una mica confós pel que fa al que et refereixes. Més aviat, el que has de literalment dir, dóna'm una nova línia aquí. I així / n és el que generalment trucar a un caràcter d'escapament. Així que n, per a la nova línia. I el compilador sap que quan es veu / n, que en realitat hauria d'induir a l'ordinador, en última instància, o printf, en aquest cas, per imprimir un nou reial línia, com colpejar el, entrar, tecla del teclat. I finalment, el que va fer que diem aquesta peça de la sintaxi és per? Què representa? Sí. MEMBRE DE L'AUDIÈNCIA: [inaudible] DAVID J Malan: És només el final de la línia. És el final de la declaració. I adonem que no ho fem posar-los a tot arreu. Per descomptat, no els vam posar en els extrems de cada línia. Per exemple, no n'hi ha cap al primera línia, no hi ha res a la línia amb, principal, no hi ha cap després de les claus, però vostè començarà a veure i obtenir familiaritzar-se amb el lloc on es crida a. I és gairebé sempre després d'una funció trucar o una declaració, una mica d'acció que en realitat estàs prenent. I saber ara, especialment si entre els menys còmode, aquests són el tipus de coses estúpides que vostè va a acabar colpejant accidentalment el seu cap contra la paret altra vegada. Perquè podràs lògicament confiança en alguns problemes has resolt per un problema conjunt, i la maleïda cosa simplement no compilarà o fins i tot córrer. I tan sovint, des del principi, que va ser degut a que s'ha perdut un parèntesi, o s'ha perdut un punt i coma. I pel que només tenir en compte d'aquest tipus de coses, i tractar de no quedar frustrat per perquè ho fa molt ràpidament aquest convertit en vell barret. Però és molt fàcil d'aconseguir frustrat des del principi, com a resultat. Així que ara, anem a fer una ullada a com aquesta línia és en realitat treballant i després mirar una mica una més complicat. Així que tenim per aquí, la capacitat de dibuixar a la pantalla. I suposem que aquest és el meu pantalla d'ordinador, però estic escrivint la, hola programa, i no he implementat, printf. Algú més ha posat en marxa, printf. Qui vol reclamar a han posat en marxa, printf? Si pot? Molt bé, quin és el teu nom? ESTUDIANT 1: [? Copal. ?] DAVID J Malan: Copal, anem cap amunt. Anem cap amunt. Tot bé. Així que tenim, aquí, algunes etiquetes de nom, ja que farem un petit joc d'aquest. I nosaltres et diem, printf. I si vols venir aquí, el que acabo he dibuixat a la pantalla, és, senzillament, no sóc jo, això. Molt bé, així que, hola el meu nom és, printf, si desitja posar això en. Tot bé. I si es pot anar suport per la pantalla de l'ordinador com si vostè és la funció que va arribar amb aquest sistema informàtic. I el seu propòsit a la vida és imprimir realment alguna cosa. Però igual que el programa que només tenia a la pantalla, aquí, anem a haver de en realitat li donarà alguna entrada. I així, si la meva entrada, aquí, és pel que sembla, el que es passa a printf, anem a tipus de burlen d'ella d'aquesta manera. Vaig a escriure literalment en un tros de paper, "hola, món" barra invertida N. I perquè quedi clar, el que Jo només he dibuixat en aquest tros de paper, són aquestes. Així que quan va executar aquest programa, i això línia groga de codi és executat, és com si jo, el programa hola, estic lliurant alguna entrada fora a una funció que algú més va escriure. I si, amb el dit, podia en realitat, amb el dit, dibuixar a la pantalla el que sigui és que ha estat lliurat, l'efecte, en última instància, és veure exactament que, a la pantalla. I un cas cantonada mica aquí. I bé, no cal veure la, nova línia, en aquest punt. Seria incorrecte per a vostè cridar explícitament la nova línia. Però si seguim escrivint paraules en la pantalla, que acabaria per sota d'això. Així que moltes gràcies, però s'adhereixen per aquí per només un moment. Ara necessitem un altre voluntari, si poguéssim, això va a haver de jugar el paper de-- És úniques persones en l'orquestra ara mateix. Com sobre-- acord. Aquí mateix. Anem cap amunt. Com et dius? ESTUDIANT 2: [? Ivay. ?] DAVID J Malan: Ho sento? ESTUDIANT 2: [? Ivay. ?] DAVID J Malan: Ethan, anem cap amunt. No? ¿Vaig obtenir que mal, fins i tot després que vostè ho ha dit dues vegades? Anem cap amunt. És difícil escoltar aquí. D'ACORD. I ho sento, quin és el teu nom? ESTUDIANT 2: [? Ivay. ?] [? DAVID J Malan: Ivay. ?] D'ACORD. Per ara, si no ho fa ment, vostè està GetString. ESTUDIANT 2: OK. Fresc. DAVID J Malan: Així que si vol a ser aquí per un moment, anem a fer una ullada a una mica programa més complex, que ara compta amb tres línies de codi. Així que tenim, un, digui el seu nom utilitzant printf; dues, una crida a GetString, seguit d'una assignació a una variable anomenada, cadena s, o truca s; i després una altra crida a, printf, però aquesta vegada amb dues entrades. Estat Així que ja hem fet el seu nom, o millor dit, tenim ha fet una crida printf. Així que vaig a escriure, digui el seu nom. I així, el que vaig a passar, printf, en un moment, és, senzillament, això. Així que si vols seguir endavant i treure aquesta a la pantalla, aquesta és la teva entrada ara. Tot bé. I oblida't de cordes, ara tenim la nostra pròpia línia de codi aquí. Així que en, GetString, necessitem cridar realitat, GetString. Així que el seu propòsit a la vida és simplement caminar sortir a l'orquestra, si pogués, i obtenir el nom d'algú. Però anem a donar-li cosa que la va posar. Si vols, veu endavant i obtenir una cadena, obtenir el nom d'algú en aquesta tros de paper, si pogués. Tot bé. I anem a veure, en un moment, el nom estem rebent. Mentrestant, el que vaig a té llest, és un full en blanc de paper, en el qual, em vaig per emmagatzemar qualsevol valor que es és que GetString està tornant a mi, Jo, sent una variable de cadena trucada, s. Tot bé. Llavors, què tenim aquí? Nik. Tot bé. Així que tenim el nom de Nik aquí. Així que això és el que, literalment, s'ha tornat a mi, per així dir-ho, per GetString. Jo, ara, vaig a executar la banda esquerra d'aquesta expressió, en què simplement copiar cap avall, a l'efecte de l'actualitat, Nik. Així que ara, tinc una variable trucada, s, emmagatzemar el nom de Nik. Ja he vaig lliurar printf, un argument anterior. Però en la nostra tercera i última línia de codi, que en realitat ha de printf mà cosa una mica diferent-- "hola,% s," barra invertida n. I així, l'última línia em vaig a send-- l'últim que estic va a escriure ara, és això. Així que les dues línies de codi, o en lloc de l'última línia de codi, trucades per a dos inputs-- un, aquest, i dos, això. Així que si la nostra funció printf Ara pot prendre aquests com a entrada, m'ho dius a mi esborrar la pantalla per a vostè. En realitat no, vostè pot seguir endavant. Deixarem cap amunt, ja que està en el mateix programa. Hem de veure, hola, Nik. Tot bé. Així que aquest era un bon nombre cèrcols per saltar a través, simplement escriure, indiqui el seu nomenar i, hola, Nik. Però aquesta simple idea de pas de missatges, de pas d'entrada i de sortida de recepció, és exactament el model que tindrem fins i tot per a les funcions més complexes. Així que moltes gràcies a tots dos. Tenim un estrès encantadora bola aquí per a vostè. I gràcies al nostre GetString i voluntaris printf igual. Gràcies. Tot bé. Gràcies als dos. Així que hem estat parlant fins al moment, sobretot sobre les cadenes. I resulta que C pot de fet entendre alguns tipus de dades diferents. De fet, anem a prendre un cop d'ull a aquestes aquí. Així C, i una gran quantitat d'idiomes, entendre les coses anomenats caràcters. Un char és generalment una sol byte, o vuit bits. I representa un únic caràcter, com la lletra A, o la capital lletra A, o la lletra minúscula A, o un signe d'exclamació, o qualsevol caràcter que vostè pot escriure en el teclat, i de vegades fins i tot més. També arriben a veure carrosses. Un flotador és, en general, 01:00 32 bits de valor, o quatre bytes perquè, de nou, és un byte de vuit bits. Així que un flotador és un valor de punt flotant, alguna cosa amb un punt decimal. I de fet, això és el que la pel·lícula estava parlant sobre quan parlaven sobre flotant valors de punts, alguns nombre fix de bits s'utilitza per representar un nombre real. Però també hi ha coses anomenades dobles. Aquests existeixen en Java, si vostè ha pres APCS, i un doble, com el seu nom per sort suggereix, és dues vegades tan gran com un flotador. Encara és un nombre real, que només té més bits amb la qual ser cada vegada més precisa, o per emmagatzemar un nombre encara més gran. int és fàcil. Parlem de que l'última vegada. És només un sencer. I és en general 32 bits, o quatre bytes. I així, si vostè té, anem a veure ara, 32 bits-- i ho vam fer en la setmana 0, sempre tan briefly-- si vostè té 32 bits, el que és el més gran nombre que pot representar-se com un enter? Més o menys? És com 4 mil milions, i això és només si som que representa només números positius. Si vostè té 32 bits, i desitja representar nombres negatius, així, el seu abast és, essencialment, negatiu 2000000000 a positiu 2000000000. Però, en general, començarem a 0 pujar a 4 mil milions. No ha de saber amb precisió, però podem veure això, de fet, si només obrir una petita calculadora, aquí. Jo puc fer 2 al 32, i això és exactament el gran, quants valors pot representen, amb 32 bits. I és més o menys 4 mil milions. Així que seguirem veient aquest nombre en uns pocs llocs diferents. Però si vostè necessita més temps nombres que això, Resulta que hi ha de cosa que es diu molt de temps. I molt, molt és en general de 64 bits, els quals vol dir que és un ordre de magnitud fins i tot més gran que un int. Així que ni tan sols puc pronunciar el major nombre que pot representar, però és notablement més gran. Ara com un a part, històricament, si un int és de 32 bits, i molt, molt és de 64 bits, la forma gran és molt, no fa molt de temps? Es podria pensar que és més llarg que un int però potser menys llarg d'un llarg temps, però en realitat depèn. I així resulta que un sol de les frustracions també, amb l'escriptura de codi en certs sistemes, és que no tots aquests tipus de dades tenir valors predeterminats. A vegades és aquesta quantitat de bits. A vegades és que molts bits. Així que vostè realment ha de saber, de vegades, quin maquinari s'està executant el programari en. Afortunadament, altres idiomes i altres tipus de dades que hi ha actualment, permetrà ser més precís. Bé, vam veure corda, i vam veure bool, també, però resulta que els que vénen només amb la biblioteca CS50. Així que els que no estan construïts en C. Aquells lloc, arribat a aquest arxiu anomenat CS50.h, que finalment va pelar les capes de. Però, per ara, són només tipus de dades addicionals. Un bool és un veritable o fals, i un cadena és una seqüència de caràcters, com una paraula. Ara printf, que hem vist, ha marcadors de posició,% s és un. I és possible que pugui, ara, inferir d'aquests altres exemples, com vostè podria tenir un marcador de posició per a diferents tipus de dades. Per exemple, prendre una conjectura, si volgut imprimir una sola carbó utilitzant printf, el marcador de posició és probablement% c. I si voleu imprimir una sencer amb el marcador de posició,% i. % LLD és un valor decimal de llarg a llarg, però molt, molt, per la que s'assigna a això. I després% f per surar valor de punt o d'un doble, així que de vegades que estan re-utilitzada en diferents contextos. Així que anem a veure i utilitzar alguns dels més grans de temps. I printf i altres funcions també seqüències d'escapament de suport dels altres, i, de vegades, aquests són necessaris. Així barra invertida n és una nova línia. Barra invertida t, algú voler prendre una punyalada? MEMBRE DE L'AUDIÈNCIA: Tab. DAVID J Malan: Tab. Així que si vostè realment vol per imprimir una fitxa, no un nombre fix d'espais sinó una real caràcter de tabulació, que no va aconseguir el seu, pestanya, tecla del teclat, en general, que realment fan barra invertida t. Cita doble barra invertida, ¿Per què havia de voler això? Oi? Per què no puc poseu davant un cometes dobles en el meu teclat? MEMBRE DE L'AUDIÈNCIA: Perquè, en cas contrari, és pensarà que és la fi que la seva impressió [? text. ?] DAVID J Malan: Exactament. Recordeu, amb la nostra exemples printf, quan passaven a printf a l'entrada, a l'esquerra d'aquesta cadena d'entrada i sobre el dret d'aquesta entrada primavera, és clar, era una doble cotització. Si la seva pròpia entrada té un doble cita enmig d'això, l'equip podria potencialment confondre, ja que, fa aquesta doble cita pertànyer al mig? Pertany a l'esquerra? Pertany a la correcta? I així, si vols que sigui súper clar, ho fa barra invertida doble cita, de manera que ha escapat, per així dir-ho, i no és combinar per a una altra cosa. I hi ha alguns altres aquí, r barra invertida, cometes simples, 0, perquè vegem amb el temps, també. I ara, què passa amb les funcions? Així que les accions que podem prendre fins al moment en aquest idioma, C, així, que hem vist, printf, per descomptat, i tots dels altres a la pantalla, aquí, que utilitzarem per al primers només setmanes del curs, venir quan la biblioteca CS50. I fan que sigui molt més fàcil, en C, per aconseguir realment l'entrada de l'usuari. Resulta que en C, i francament en uns pocs idiomes, és un veritable mal al coll que fer alguna cosa simple, com a símbol de l'usuari per al teclat, per la seva entrada. I així, aquestes funcions fan que sigui més fàcil. I també té error comprovar en tot, de manera que, quan es recordar el dimecres, ens va veure el, reintentar, advertència, quan no cooperava, i he escrit una paraula, en lloc d'un nombre? Hem fet la feina pesat primerenca a assegurar-se que l'usuari coopera. Però aquests són només la formació rodes que ho farem amb el temps, i ràpidament, enlairar-se. Així que per recapitular, a continuació, anem a fer una ullada ràpida, de la mateixa manera que ho vam fer amb Scratch, en algunes construccions canòniques en C. Amb això es pretén, més o menys de, ser un viatge llampec, simplement perquè tingui una referència i que vostè ha vist les coses al principi. Però llavors veurem codificació real utilitzar alguns d'aquests blocs de construcció. Així que igual que en Scratch, quan havíem declaracions com, dir o, espera, en C, que tenim funcions, així, com printf. Si volem expressar una condició en C, que és similar en esperit, a aquesta peça del trencaclosques que semblava això en Scratch. Però en canvi, ens literalment a escriure, si. I després, entre parèntesis, posem una condició, on aquesta condició és el que anem a trucar, de nou, una expressió booleana. I de nou, això és una espècie de pseudocodi. I, de fet, la // és un comentari. Són només paraules en anglès a mi mateix. Però aquest és el general, estructura d'una, si, condició. Però ja veurem formigó exemples en un moment. Si vostè vol tenir un bidireccional forquilla a la carretera, de la mateixa manera que ho vam fer amb la nostra voluntària en Dimecres, vostè pot tenir una, més si. I si vostè vol tenir una tercera i condició final, o la situació per defecte, vostè pot tenir només una quadra més, allà. I de la mateixa manera, amb expressions booleanes, vostè pot, i, junts. I vam veure dimecres que no és un sol signe, és dues, per raons de nivell inferior que que amb el temps veiem i juguem amb. O-ing coses junts és de 2 barres verticals. En un teclat dels EUA, aquesta és generalment una clau amb la tecla de majúscules anterior clau de la tecla Retorn o Retorn. Després hi ha aquestes coses que farem servir potser una o dues vegades. Ells són funcionalment equivalents a el que pot fer amb una, si, més si, més si la resta, construir, però se'ls diu un interruptor. Es veuen molt diferents, però anem a veure en alguns del nostre codi de distribució, per a un conjunt problema futur, el més probable, que de vegades és només una més bonica manera d'expressar el seu conjunt manat de condicions, sense tenir una gran quantitat de claus i un munt de parèntesi i sangria. Però ells ens donen no més el poder del que ja tenim. I ara bucles. I aquest, veurem en una mica més lentament. Però llavors, anem a començar a utilitzar aquests, especialment per a aquells que ja estan familiaritzats. Aquesta és la forma canònica, si increïblement manera arcà, per escriure un bucle en C. Ara un bucle en Rasguño era bastant senzill. Vostè té una, per sempre, bloc. Vostè té una, repetir, bloc amb només un nombre que ha d'escriure. I amb el bucle for ,, pot posar en pràctica tant d'aquestes idees, però és una mica més tècnic. Però, francament, també és relativament simple. Un cop conegut l'ordre operacions, que, literalment, només es va a connectar en els valors i dir-li a l'ordinador què fer. Així que aquí està un exemple. Aquest és un bucle que, bastant simplement, compte d'un nombre fins a través d'un altre. I amb només fer una ullada de manera que, fins i tot si vostè té sense experiència prèvia amb aquest llenguatge, quin nombre no és probable que començar a comptar a? OK, 0. I suposo que és perquè veure que hi ha un int i un I, que és una variable. S'inicialitza a 0. I més tard, sembla que estem passant printf, un valor. I, de fet, vaig fer un petit error tipogràfic aquí. Però això és fàcilment fixat. Permetin-me afegir a, i aquí. Ara tenim ser printf passat aquest valor de marcador de posició. I el que va a explicar a través de? AUDIÈNCIA: 50. 50. 49. DAVID J Malan: 49. Així que 50, a primera vista, sembla correcte. Però això, resulta que serà la nostra condició que guardem xecs. I anem a deixar d'una vegada Ja no és menys de 50. Així que aquest bucle, per contra, ha de executar, sempre que i és menor que 50. Però tan aviat com tingui 50 o 51 anys, o pitjor encara, s'ha d'aturar automàticament. Tot bé. Així que el que realment passa aquí? Així que aquest és l'ordre de operacions per a un bucle. Un, vostè té l' la crida de inicialització. Aquest fragment ressaltat groc de codi que s'executa en primer lloc, i té l'efecte que, per Dimecres, probablement imaginar. Es crea una variable anomenada i i botigues en aquesta variable el valor 0. Així que i és 0 en aquest moment de la història. La següent cosa que que succeeix en aquest constructe, és que la condició es comprova. Així que puc comprovar immediatament, és i menys de 50? I, per descomptat, la resposta per ara és, sens dubte, sí. Sí, perquè i és 0, i això és sens dubte menys de 50. Llavors el que passa, és que aquesta línia de codi és executat. I de fet, si hi ha múltiples línies de codi en aquestes claus, tots ells s'executen un rere l'altre. I en l'efecte aquí, és pel que sembla, per imprimir el nombre i, que es va a ser 0, i després 1, i després 2. Però perquè? Per què obtenir incrementa? Bé, la quarta cosa que que passa és que aquesta sintaxi és executat, després del punt i coma. i ++ és una forma abreujada de dir; prendre el valor d'i, i afegir 1 a la mateixa; i després la propera vegada, afegir 1 a la mateixa; i la propera vegada, afegir 1 a la mateixa. Així que si seguim endavant, el que va a succeir El següent és que no vaig a inicialitzar i mai més. Si seguia inicialitzar i a 0, aquest exemple mai acabaria, perquè i estaria enganxat a 0. Però el que va a succeir és que la condició es comprovarà, la línia de codi aconseguirà executat, la i s'incrementarà, condició es comprova, codi aconseguirà executat. I va seguir amb bicicleta de nou, i una altra, i una altra, fins i ++ indueix un valor de 50. La condició després diu: és de 50 a menys de 50? La resposta, per descomptat, és que no, i de manera que tot el codi deixa de executar-se. I si vostè té més codi a la pantalla baix, això és el que passa després. Se surt d'aquestes claus i continua imprimir més després d'això. Així que una broma ara, des del foxtrot, que vostè potser ara entens. Sempre és divertit. És com els riures tipus de filtrar, i després t'adones que no hauria estar rient d'humor com aquest. Però hi ha alguna cosa de menjar per emportar aquí, pedagògicament, també. Així que resulta que sóc falta una peça de la sintaxi, o foxtrot de perdre un tros de sintaxi aquí. El que falta, que hem tingut en qualsevol altre exemple, fins al moment? Retorn, és allà, així això és una altra cosa, que anem a tornar al poc temps. El que falta, però? Sí. MEMBRE DE L'AUDIÈNCIA: El inicialització de [inaudible]. DAVID J Malan: OK. Així que si. Així que en realitat, això és-- Bé, i el recompte s'inicialitza amunt, o més aviat, declarada per sobre. Així que aquesta és una altra manera de fer-ho. Però no en una línia que és vàlida però. Què hi ha aquí? MEMBRE DEL PÚBLIC: És de les claus? DAVID J Malan: Sí. Així que les claus estan desapareguts. Però aquest codi, vull dir, al seu crèdit, és, en realitat, sintàcticament vàlida. Resulta, no ho fa necessitarà les claus si només té una línia de codi que voleu executar dins del bucle. Ara estem sempre, a classe i en tot el nostre codi de distribució, incloure les claus de tota manera, només pel bé de la claredat. Però adonar-se que els llibres de text i els exemples en línia, vostè pot veure molt bé arrissat els suports que falten en algun moment. I això està bé, si el que han sagnat i destinats és només una sola línia de codi, i no múltiples línies de codi, potencialment. Tot bé. Així relacionat amb el tema de la imprecisió, és un problema de desbordament, en el sentit que, de manera similar, no sencers tenen límits a ells de la mateixa manera que els valors de punt flotant? En el món d'un punt flotant valors, que només poden ser tan precisa, després de la qual cosa, de vegades coses dolentes poden succeir, i els nostres programes poden ser buggy i error. Ara, fins i tot amb nombres enters, pots tenir problemes. Ara un nombre enter no té una punt o números després es decimal. És només un nombre natural, generalment. Llavors, què podria sortir malament amb un int? Si estic fent servir un int a comptar, el que podria sortir malament? Sembla molt més simple. Sí. MEMBRE DE L'AUDIÈNCIA: Si el nombre aconsegueix [inaudible] DAVID J Malan: Sí. El que si es compta tan alta, que no pot expressar aquest nombre realment gran. Oi? En algun moment, vas per excedir els límits d'un valor de 32 bits o un valor de 64 bits. Ara, de nou, no estic segur de com pronunciar un valor de 64 bits, però sé que amb un enter de 32 bits, el valor més gran que pot ser, si és només positiu valors, és més o menys 4 mil milions. Així que si intento comptar fins a 5 mil milions, alguna cosa ha de passar. Però vegem el que, de fet, pot succeir. En el món de nombre sencer desbordament, en el qual, en cert sentit, desbordar la capacitat d'una nombre sencer, el que podria passar? Així que aquí està un nombre binari, és un retrocés a 0. És tots els 1 de, i els marcadors de posició allà, són potències de 2, així que això és binari. Així que aquests són 8, 1 bits a la pantalla. I si vostè recorda, o que ràpidament fan els comptes, quin valor està sent representat aquí amb aquests vuit bits d'1? 255. I encara que no estava molt segur de les matemàtiques, es pot fer a terme. O vostè podria tipus de la raó a través d'ell, Espera un minut, si estic el que representa un valor de 8 bits, i tinc 256 valors possibles, però el primer dels quals és 0, Només sé que la major serà 255, i això és el que podria ser aquest. Així que suposo que intento afegir 1 a aquest valor. Què faria vostè en el grau l'escola quan s'afegeix un 1, i en realitat no encaixar perquè vostè ha de portar l'1? Què és aquest nombre va per convertir-se en quan s'agrega 1? Serà 0. Oi? Perquè si tingués més bits-- i vaig a tractar de, classe de, escriviu a terme aquí-- si tinguéssim més bits, el que podria fer aquí és afegir l'1, i després ens anàvem a això. Vaja. Tindríem un bit 1 tot el camí fins aquí. Però si es tracta d'un finit valor, és només 8 bits, i això és predeterminat per l'ordinador, que 1 és efectivament no existeix. És només una mica cau d'un penya-segat. I així, si s'agrega 1-255, el que Valor és el que sembla obté? 0. I així, els números accidentalment, i potser, sense voler, acaben embolicant així. Llavors, quin pot ser la implicació d'això? Bé, hi ha un parell de coses diferents. Així que un, no acaben buscant com 0, involuntàriament, però pots tipus de veure, fins i tot en el món real, per bé o per mal, manifestacions d'aquesta idea d'un límit. Per exemple, qualsevol de vostès que han jugat alguna vegada Lego Star Wars, ¿Algú passi saber el nombre màxim de monedes pot obtenir en Lego Star Wars? Prengui una conjectura basada en preguntes principals de l'actualitat. És més gran que 256 o 255. És 4000000000. Així que resulta, i hi ha algunes persones-- alguns googlejar confirmat última nit-- han aconseguit 4000000000 de monedes d'or, o el que sigui, en Lego Star Wars. Encara que sembla, no hi ha una manera d'enganyar al joc, hi ha un error o una característica, que permet simplement acumular munts i munts de punts. Però el més gran possible valor, d'acord a aquesta captura de pantalla d'algú que trobar en línia, és de fet, 4 mil milions. Ara per què és això? És, precisament, 4 mil milions, la probablement perquè algú va decidir, que estava escrivint aquest joc, que podien fer 4000000000, alguna cosa, alguna cosa, alguna cosa, com el valor Vaig posar amb la calculadora abans, però que és només una mica més net per als éssers humans dir el nombre màxim de coins-- o espàrrecs, com en diuen ells-- que pot recollir és de 4 milions de dòlars. I així, per què és això? Com és el joc de LEGO l'aplicació del comptador això és fer el seguiment de la nombre de monedes que té? Estan usant què? MEMBRE DEL PÚBLIC: S'atura comptant després de 4 mil milions. DAVID J Malan: Atura comptant després de les 4 milions de dòlars, que significa pot inferir, com a programador, que són, probablement, utilitzant un enter de 32 bits. Igual que el programador literalment només amb tipus, int, en el seu codi, i aquest és el tipus de variable que que estan usant per emmagatzemar el codi d'algú. Així que hi ha altres manifestacions d'aquests tipus de límits. Així que no he jugat aquest game-- i jo estava llegint sobre la història per confirmar com molt-- però en el versió original de la civilització, on que pel que sembla interactua amb cadascun una altra i pot fer la guerra o la pau, Gandhi se suposa que és un els personatges més pacífics, com jo entendre-ho, a la primera versió de Civilization. I de fet, en una escala d'1 a 10, seva agressivitat era només un 1. Així sempre tan lleugerament agressiu, pel que sembla. Però en algun moment, pot semblar instal·lar la democràcia en la seva geografia. I si instal la democràcia en la seva versió del joc, llavors el seu nivell d'agressivitat disminueix. És una bona cosa. La gent està més tranquil·la pel que sembla, en aquesta situació. Però, segons sembla, algú ho va fer Encara no tens una, si, condició en la versió original del codi. Així nivell d'agressió de Gandhi va passar de positiu 1, menys 2, a negatiu 1, però el joc no ho fa entendre els números negatius. Així que el que va succeir va ser l'agressió de Gandhi nivell va passar d'1, 0, 1 a negatiu, que va tenir l'efecte de embolicar al voltant per a ser el caràcter més agressiu en el joc, en un valor de 255, en una escala d'1 a 10. I des d'aleshores, hi ha hagut més encarnacions d'aquest joc, i s'han mantingut com una mena d'ou de Pasqua, que Gandhi és aparentment tan terriblement agressiu. Però va ser el resultat d'un error de programació molt simple en aquesta versió molt primerenca del joc. Ara més preocupant, més Recentment, el Boeing 787 va ser documentat com tenint una bug, no el tipus de dispositiu que sobretot vol tenir un error. I els símptomes, que llegiré aquí, d'un article en línia, Va ser aquest, un model d'avió 787 que s'ha alimentat de forma contínua per 248 dies pot perdre tot corrent altern, AC, energia elèctrica, a causa de les unitats de control del generador, GCU, simultàniament entrar en mode a prova de fallades. Així que això era una advertència emesa quan es va descobrir aquest problema. Aquesta condició és causada per un comptador de programari, intern a la GCU, per la qual un nombre enter o una variable, que es desborden voluntat després de 248 dies de potència contínua. Boeing està en el procés de el desenvolupament d'una actualització de programari que GCU remeiarà la situació d'inseguretat. Tant com el míssil escenari, en el qual que tenien algun tipus de variables que comptava, i comptant, i comptant, però desbordant gradualment els límits de la seva capacitat, igualment ho va fer el maleït avió tenir un desbordament de variable de després de força temps d'execució. I així el camí llengua a la galta de treballar al voltant d'aquest tema és veritat, reinici, el seu avió cada 247 dies, perquè la memòria es va eixugar i la variable es remunta a 0. Però s'adonen, aquesta és una molt gran encarnació de programari, però sobretot perquè hem sentit parlar d'Apple els sistemes operatius d'entrar en els cotxes, i cotxes d'auto-conducció de Google, i qualsevol nombre de encarnacions de programari En la nostra vida diària, TV i rellotges, i més, adonar-van ser envoltats pel programari, tot això està escrit per nosaltres els éssers humans. I com tots anem aviat descobrim, és molt fàcil i molt típic a cometre errors a l'escriure programari. I si no agafar ells, algunes coses dolentes poden succeir. Ara, de vegades, alguns coses divertides que pot succeir, o almenys de vegades saber per esperar alguna maldat. Així 0 dividit per 0, des del grau escola, generalment és una mala cosa. És indefinit. I resulta fora-- i anem a veure si el meu micròfon pot recollir aquest up-- que Apple tenia una mica de diversió amb aquest recentment. Així que tinc un iPhone aquí. Vaig a parlar amb Siri i preguntar per donar-me la resposta a 0 dividit per 0. Què és 0 dividit per 0? SIRI: Imagina que tens 0 galetes, i vostè els dividits en parts iguals entre 0 amics. Quantes galetes posa cada persona? Veus? No té sentit. I Cookie Monster és trist que no hi ha galetes. I vostè és trist que no tens amics. DAVID J Malan: És una mica desagradable. Així que això és el que acaba de dir no. És indeterminat, no està definit, i de fet, molts llenguatges de programació o, en realitat, compiladors detectar quan, en un programa, tractar de dividir a 0 per 0. Més divertit que això, però, és que, segons sembla, Cookie Monster és a Twitter aquests dies. I ell va respondre a aquesta, amb això, que és absolutament adorable. Però donem una ullada ràpida a un parell d'altres construccions, i després posar una mica d'això codi usar, en les bones maneres. Així que resulta, a més de per als bucles, hi ha cosa que es diu un bucle while, que es veu diferent i s'implementa una mica differently-- i que amb el temps veiem examples-- però en cert sentit, és més senzill perquè no li permet inicialitzar i actualitzar dins dels límits del bucle. Vostè encara pot implementar-lo. Així que vostè pot fer exactament les mateixes coses amb un bucle while, com amb un bucle for, però la seva sintaxi, ultimately-- Com veurem amb el temps veure- serà diferent. Fins i tot hi ha un do while, que en realitat és una mica diferent, en que mentre que un bucle for i un bucle while sempre comprovar la seva condició de primera, si llegeix aquesta cosa de dalt a baix, que poc sembla que va a comprovar que la pròpia condició última perquè és veritablement l'última línia de codi. I de fet, això va a ser útil en certs programes que escrivim, si vostè vol fer cegament alguna cosa i, finalment, comprovar l'estat. Això no és necessàriament una cosa dolenta. Si volem que les variables, podem fer en un parell de maneres diferents. I vam veure en el foxtrot de dibuixos animats, una forma de fer-ho, on es declara la variable, com int comptador punt i coma, i després tarda- potser la següent línia, potser 10 línies tarda- en realitat s'inicialitzi. Així que aquestes 2 línies de codi declarar una variable de tipus int i en diuen taulell, per la qual cosa dóna em suficients bits per mantenir un int. I després, finalment, posa el valor 0 en aquesta variable. Arregla els anys de 0 i 1 en un patró, que sabem de la setmana passada, representa el nombre que coneixem com a 0. O, francament, es pot fer això molt més més succintament, igual que aquest. Ara també tenim la capacitat per trucar a funcions. I de fet, aquí hi ha una línia 2 programa, o un extracte, que ens permet en realitat escriure alguna cosa de codi que per crear una cadena de la user-- molt com el nostre voluntari un moment ago-- emmagatzemant el resultat en una variable anomenada nom, i llavors-- molt semblant amb la nostra voluntària amb estampats printf-- fora aquests valors passant en dos arguments, el cadena, seguit de la variable trucada, nom, sí. Així que anem a fer una ullada, abans tornem a Mario allà, en un parell d'ara, exemples d'això. Vaig a seguir endavant i obert fins, diguem, la funció-0.c. I com sempre, aquest codi és disponible a la pàgina web del curs, perquè pugui jugar al costat de casa i mirar-ho més tard. Però aquí està el programa en què és essència, de la línia 17 a 22. El programa principal és on el programa sempre va a començar. Aquest programa, segons sembla, es va per imprimir el seu nom, de còlon. És llavors va a cridar GetString, de la mateixa manera que vam fer amb els nostres voluntaris. I després, això és interessant, que va a cridar PrintName. Resulta que, durant tot aquest temps, no sembla ser una funció anomenada PrintName. Que imprimeix el nom d'algú. Nosaltres no necessitem usar printf de antany, hi ha PrintName. Però això és enganyosa perquè PrintName no ho fa vénen amb C. La gent no ho va fer inventar fa uns 40 o 50 anys, Ho vaig fer, al seu lloc. I de fet, si em desplaço encara més, previ avís com puc escriure el meu propi funcions en C que amb el temps Expliquem per què seguim dient: buit, en alguns llocs, però per ara, anem a només cal veure el nom. En la línia 24, si vols crear la seva pròpia funció, que, literalment, escriu el nom de la funció. Vaig triar PrintName. Entre parèntesi, es a continuació, especifiqueu quin tipus d'insums, i quants vol aquesta funció per prendre. En aquest cas, vull prendre 1 variable anomenada, nom, i que serà de tipus, corda, així que va d'haver alguna seqüència de caràcters. I llavors, aquest program-- igual que en Scratch, vostè pot tenir trencaclosques personalitzat pieces-- va a tenir aquest comportament personalitzat. Es va a trucar a printf passant, hola, marcador de posició, i després es va a connectar en el que l'usuari anomenat. Així que aquest és un exemple del un informàtic faria abstracció trucada o funcional descomposició, els quals són només formes de fantasia de dient-- és si t'agrada aquesta idea d'alt nivell, com vull funcionalitat que gravats el nom d'algú, absolutament li pot escriure literalment printf i després Va esdevenir en els arguments que desitja, i el programa funcionarà, com ho ha fet des de dimecres. Però vostè pot començar a abstreure la noció de la impressió d'un nom. Pot donar-li un nom, com PrintName, i això és aquesta idea de capes des de la setmana 0. D'ara en endavant, jo i vostè no ha de saber ni li importa com s'implementa PrintName. Sí fa servir printf, potser no ho fa, ¿qui sap el fa servir? A qui l'importa? Ara estic parlant aquí, en comptes d'aquí. I, en efecte, com els nostres programes reben més avançat i sofisticat, seguirem prenent per fet l'existència de les peces del trencaclosques de nivell inferior. A causa que els escrivim o algú més ho va fer, per la qual cosa que llavors podem construir sobre ells. Fem una ullada a aquest variant, funció One. Així que aquest és una mica més avançat, però resulta que a la biblioteca de CS50, només hi ha una funció getInt. No pensem, fa anys, a implementar una funció GetPositiveInt. I això és una mica molest perquè si vostès estan escrivint un programa en què vol aconseguir un resultat positiu nombre enter d'usuari, absolutament pot utilitzar getInt. I malgrat tot pot comprovar amb la condició i pot ser un bucle si és més gran que int que 0 i cridar en l'usuari si ell o ella no dóna que un nombre positiu. Però anem a construir aquest el bloc buit a nosaltres mateixos, a, peça esgarrinxada d'encàrrec, si es vol. Vaig a tenir un programa aquí que en última instància, I vull ser capaç de cridar a GetPositiveInt, i jo vull ser capaç d'imprimir el que int és. Però això s'abstreu lluny ara. S'ha acaba de donar un alt nivell nom que diu el que fa, que és meravellós perquè és molt intuïtiu ara a llegir. I si m'importa el que hi ha sota el capó, deixa desplaceu-vos cap avall. I és una mica intimidatori al principi, especialment si aquest és el seu primer programa, però anem a fer una ullada. Jo ja no estic dient, nul·la, perquè resulta que les funcions, de la mateixa manera que GetString, pot retornar un valor per a mi. Ells no només tenen imprimir a la pantalla, que en realitat pot lliurar jo alguna cosa a canvi. I mentre que abans PrintName, Jo no necessito res. Necessitava l'efecte secundari de alguna cosa a aparèixer a la pantalla, però jo no necessitava un ésser humà a donar-me alguna cosa a canvi. Aquí, amb GetPositiveInt, igual que amb getInt, Vull ser lliurat alguna cosa a canvi. Així que estic dient no, nul·la, en la línia 23, però int, que diu, aquesta funció que estic escrivint, crida GetPositiveInt va Em retornar un enter, no res, no nul·la. Mentrestant, es prendrà cap entrades, així que he, classe de, inverteixen la mateixa. Jo no vaig a donar cap GetPositiveInt d'entrada, vull que em doni la seva sortida. I llavors, què passa ara? Així que aquí és com puc declarar una variable. Ho he fet fora del bucle, per raons que anem finalment veiem, però això només dóna em 32 bits anomenat, n, i he predeterminar els permet emmagatzemar nombre enter. I aquí cal fer mentre constructe, i és per això que és útil. Literalment això, mentre que n és menor que 1. Així que anem a veure què passa. Imprimeixo, si us plau dóna'm un int positiu. Després em poso un int, utilitzant CS50 de funcionar i emmagatzemada en n. I llavors, ¿quina línia de codi, probablement, és executat següent, lògicament? Què recta numèrica? Sí, així que 31. Vostè no sap això fins que hagi ha dit o tipus d'inferir que, però això és cert. Es va de dalt a baix i després segueix repetint. Així que si he escrit en, diguem, el nombre 1 negatiu, és n menys d'1 negatiu? Sí. A causa negatiu gener és menor que 1. Llavors, què ha de passar? Vaig a fer això mentre que n és menor que 1, així que em vaig a anar de nou a la línia 28. I cada temps-- i anem a córrer esto-- fer la funció de l'1 al compilar, i ara dot funció 1 slash. Si escric negatiu 1, és seguirà cridant-me fins que jo coopero pel fet que cada de les meves entrades és menor que 1 i si és inferior a 1, mentre que, Vaig a seguir fent això. Si, finalment, li dono un nombre com 50, per sort, diu, gràcies pel 50. Per què? A causa de que tan aviat com n no és inferior a 1, deixo de quedar encallat en aquest bucle, i aquesta nova paraula clau avui en dia, A canvi, literalment, fa això. Així que he implementat, en un sentit, l'equivalent de GetString, on sóc retornant a el que m'està fent servir, algun valor. No ha de ser una cadena, que és un int. Així que una simple, ràpida exemple, però que aviat veure una mica més sofisticada versions fixes. De fet, anem a fer una ullada a una 01:00 numèric que es diu return.c. I aquest és en realitat una mica més simple. Així que el propòsit d'aquest programa en vida-- anem a compilar i executar ell, així que retorn, dot slash, avís return-- el programa simplement cubica el valor 2. És bastant estúpid, és difícil codi, no es necessita cap entrada, però demostra una altra funció que jo mateix he escrit. Així que aquí, he declarat 1 variable anomenada x, de tipus int, igual al nombre 2, completament arbitrària. Aquesta és només una impressió suau i esponjosa. Diu x és ara, tal tals, cubicació dot dot dot. I la màgia és pel que sembla en la línia 21. Vaig a cridar a una funció anomenada, cub, Estic lliurant un full de paper amb el número 2 escrit en ell, i quin valor, matemàticament, Què vull sortir-ne? Així com una comprovació de validesa? 8. Oi? Vull 2 ​​Cubed esquena, 2 a el poder de 3, de manera que el 8 de tornada. Llavors, on s'implementa cub? Bé, l'avís s'implementa aquí. I igual que abans, lògicament, tot i que la sintaxi és probablement molt nou per a molts de vostès, Vull aquesta funció per a mi tornar un full de paper amb un int en ell. Així que tinc un int, el nom és arbitrària, però convenientment anomenat cub. L'entrada a la mateixa, és de n tipus sencer, així que això és com em pot passar en el nombre 2 en un full de paper. I després resulta que C suports matemàtiques, de manera que no tenen els x per als temps, només ha d'utilitzar l'asterisc per a la multiplicació. I això torna n vegades n vegades n, que és simplement un valor en galledes. Llavors, on anem amb tot això? Això és definitivament un viatge llampec, pot estar segur, que en les seccions súper i en el conjunt de problemes 1, se li entrem per tot això encara més. I en un problema conjunt 1, anem a la transició des del món de la gràfica de Scratch a una mica més de línia d'ordres en C. Però ens vam inspirar d'aquest joc aquí d'antany, en el qual usant C i l'edició estàndard del p conjunt que posarà en pràctica la piràmide de Mario. I en l'edició pirata del p conjunt, si així ho desitja per triar, vostè implementarà una mica més desafiant piràmide amb dos pics. També implementa una algoritme, un algoritme cobdiciós. Resulta que hi ha una mica de lògica interessant darrere del procés de corrent estació de caixer i de fet el lliurament algú canvi del darrere. Hi ha un algoritme que és bastant senzill, que podria fins i tot copsar intuïtivament la primera vegada que llegeixes it-- adonar-se que és el que he sempre fet alguna vegada m'he donat a algú alguna part posterior-- diners que li permet sempre minimitzar el nombre de notes de paper o monedes metàl·liques que està tornant a l'usuari. I això, per descomptat, és convincent perquè si vas a CVS o el que sigui, no vol estar sola mà un munt dels o un munt de monedes d'un cèntim. Vostè vol que el menor nombre monedes, probablement, possible. Finalment, també serà desafiat a incursionar al món de l'aigua i en realitat obtenir una apreciació per a un mapatge entre les taxes de flux, de rebre, l'aigua a la dutxa, quina quantitat d'aigua s'utilitza. I l'al·lusió al mateix, serà aquest clip aquí, que anem a acabar per només 60 segons, que pinta un quadre de capçals de dutxa de baix flux. [REPRODUCCIÓ DE VÍDEO] -Tot bé. Tinc tot aquí. Em va donar la Sèrie F Cicló, Hydra, Jetflow, Estocolm SuperSteam, el que sigui. -I Què em recomana? -Què estàs buscant? Home -Font. Poder. -Com Silkwood. -Això És per la radiació. -Això És cert. -Ara Què és això? -Això És el Comando 450. Jo no venc aquest. -Però Això és el que volem. És una ordre 450. -No Em creuen. Només s'utilitza en el circ. Això és per als elefants. -Vaig A pagar res. -Què Sobre Jerry? -Ell No podia manejar això. Ell és delicada. Oh si. [FI DE REPRODUCCIÓ] DAVID J Malan: D'acord. Això si per CS50. Ens veiem la setmana que ve. ALTAVEU 1: [? Scully?] [? Ian ,?] pel que aquest projecte outro, ¿Què has nois arribar a? ALTAVEU 2: Bé, li hem donat és una varietat del pensament, i creiem que la millor manera A-- ALTAVEU 3: Puc? ALTAVEU 2: Sí. Per tots els mitjans, en realitat. ALTAVEU 3: Així que crec podem resumir la nostra idea per als outros amb un sol res paraula--. DAVID J Malan: ¿Res? ALTAVEU 3: Res. DAVID J Malan: Què significa això? ALTAVEU 3: Els outros són nous. ALTAVEU 2: Bé, vull dir, a la filosofia, Vull dir, res és sempre alguna cosa. ALTAVEU 1: Així what's-- ¿Quina és la premissa? ALTAVEU 3: Així és com la vida. D'ACORD. Què has fet avui? DAVID J Malan: em vaig aixecar, tenia esmorzar, i va arribar a treballar. ALTAVEU 3: Aquesta és una outro. ALTAVEU 2: Però, vull dir, no ha alguna cosa li passi a ell en ell-- ALTAVEU 3: No, no, no, no. No passa res. ALTAVEU 1: Així que per què estem veient? ALTAVEU 3: Perquè és un outro per CS50. DAVID J Malan: Encara no.