DAVID J Malan: Bone, do ĉi tiu estas CS50. Kaj tiu estas klare Vendredo. Kaj tiu estas la fino de semajno unu. Do vi eble memoras ke ni cxesis, lasta fojo, kun cliffhanger de specoj. Per kiu ni elmontri tiun mensogon, ke neniu gravi kion vi estis instruita kreskanta supren, 1 dividita per 10 ne estas, Fakte, 0.1 aŭ 0,100 aŭ 0,10000. Fakte, se ni kompili ĉi programo, kiel ni faris hieraŭ, kun, fari imprecision, kaj tiam fari streketo oblikvo, imprecision, ni lernis ke tio kio estas 1 dividita per 10 reale estas. Do tio ne estas vere sufiĉe la kazo. Sed ĉi faras aludon al iu fundamenta limigo de komputiloj. Kaj efektive, inter la aferojn ni tuj faros hodiaŭ estas preni rigardi kial ĉi havas okazis, kio implikaĵoj havas ĉi, kiom homaro malsukcesis ekteni tion en iu tre serioza situations-- la rezulto de la kiu estis sufiĉe tragedia kaj expensive-- kaj ankaŭ rigardu kiom ni povas reale defendas kontraŭ tiajn limigojn. Do intuicie, eble, kial 1 dividita per 10, laŭ mia komputilo tie, ne nur 1/10, 0.10? Yeah. Kion vi pensas? Spektantaro membro: La radix estas malsamaj? DAVID J Malan: La kio? Ho, la bazo estas malsamaj? Do ne tute. Ĝi estas fakte pli fundamenta por la aparataro. Aliaj pensoj? Yeah. Spektantaro membro: Ili reprezenti nombrojn malsame? DAVID J Malan: Do they-- Dekstra. Ili reprezentas numerojn malsame. Neĝuste, ŝajne. Por ke is-- Nu, alimaniere de kio? Aŭ de kiu? De ni? Spektantaro membro: Yeah. Ili ne uzas la dekuman sistemo al [inaudible]. DAVID J Malan: Bone. Do iusence, ili ne uzi la dekuma sistemo. Sub la kapuĉo, ĉio estas ja duuma, kaj tio estas rilatigitaj, fakte. Sed estas eĉ pli simpla klarigo ol tio. Yeah. Spektantaro membro: Ili nur havas tiom da bitoj. Ili povas nur stoki ĝis certa mezuro, kiel kun la glitpunktaj. DAVID J Malan: Yeah. Tiu estas kio vere atingi ĝin. Ĝi rezultas ke komputiloj tipe, volo ĉiam nur uzi finia kvanto de informo reprezenti ion. Dekstra? Post ĉiu, ni nur havas fiksan kvanto de malmola disko spaco. Ni nur havas fiksan kvanton de RAM, aŭ komputila memoro. Kaj se vi nur havas fiksa kvanto de io, Certe vi ne povas vere rakonti ĝis al malfinio aŭ ajna numero vi volas. Vi, ia, devi elekti kaj elekti kion gamo de valoroj vi tuj elportas. Do ekzemple, unu-du semajnoj antaŭlonge, kiam ni parolis pri ASCII, kaj ni parolis ĉirkaŭ 8 bitoj, aŭ bajto, por tiel diri, la plej granda nombro ni povis reprezenti kun 8 bitoj estis kio? 255. Kaj ni povas reprezenti 256 entute valoroj sed ne se ni pasigas unu el ili sur 0-- Nu, sed se ni pasigi unu el ili sur 0, tiam la plej granda nombro estas, kompreneble, 255. Do rezultas, ke tiu estas la kazo ankaŭ, en tiu kunteksto. Ni komencis paroli, lastafoje, pri flosantaj-punktaj nombroj, kiuj estas malsamaj de entjeroj, en ke ili havas dekuman punkto kaj, espereble, iuj nombroj post tio, sed ili estas tro. Komputilo estas nur tipe irante uzi 32 bitojn, eble 64 bitoj reprezenti glitpunktaj valoro. Do kvankam ni plenkreska lerni matematikon kaj sciante ke vi povas havi absolute senfinan nombron de ciferoj post la dekuma punkto, ne se vi havas finia memoro. Vi, ia, havas rondigi, aŭ elekti kaj elekti kion numerojn vi tuj reprezenti. Kaj do vi povas pensi, iasence, tio estante la komputilo proksimaj proksimuma kalkulado al la valoro ke 1/10 ĝi povas atingi, kun nur 32 aŭ tiel bitoj. Kaj ne nur 1/10. Ekzemple, se mi ŝanĝi tion al 1/3, kiujn ni opinias estas eĉ pli simpla. Do 1 dividita per 3. Lasu min savi la dosieron. Lasu min kaj rekompili ĝin. Kaj lasu min re-ruli ĝin. Ĉi tie ankaŭ, ŝajne, 1/3 ne 0.3 kaj tiam malfinia nombro de 3 la poste. Vi havas ĉi imprecision fine. Do ni homoj estas korekta, kaj kio vi lernis estas, fakte, ĝentila, sed ni ekfrapanta supren kontraŭ iuj limigoj. Kaj kion mi pensis ni volas fari hodiaŭ, estas komenci rigardante, sincere, la tragikajn konsekvencojn foje, kiam la homaro ne sufiĉe efektivigi por ĉi realo kaj tiuj limigoj. Kaj ni vidos serion de vinjetoj el la Historio Kanalo kiu prenas rigardu kiel aferoj iris malbone. Ĝi estas ĉirkaŭ 8 minutoj longaj, kaj ni revenos post ĉi kaj rigardu precize Kio alia povas iri malbone. Se ni povus malheligi la lights-- [VIDEO reprodukto] -Computers, Ni ĉiuj venos akcepti la ofte frustrante problemoj kiuj kuniris. Cimoj, virusoj, kaj programaro problemetoj estas malgrandaj prezoj pagi por la komforto. Sed en altteknologia kaj altrapida milita kaj spaca programo aplikojn, la plej malgranda problemo povas glorata en katastrofo. La 4an de junio 1996, sciencistoj preparitaj lanĉi senpilotan Ariane 5 raketo. Ĝi portis sciencajn satelitoj desegnita establi precize kiel la Geomagnetiko interagas kun sunaj ventoj. La raketo estis konstruita por la Eŭropa Spaca Agentejo kaj levita for de lia facileco sur la marbordo de Franca Gvajanio. -Kaj Pri 30 sekundoj en la flugo, ili unue rimarkis ion tuj erara. Ke la nozzles estis swiveling en maniero ili vere ne devus. Ĉirkaŭ 40 sekundoj en la flugon, klare la veturilo estis en mizero, kaj tio estas kiam ili faris la decidon detrui gxin. A Range Safety Officer kun terura intestoj premis la butonon, eksplodigis la raketo antaŭ ol ĝi povis fariĝis danĝero al publika sekureco. -Ĉi Estis la knabino vojaĝo de la Ariane 5, kaj lia detruo prenis meti pro difekto enigita en la raketo programaro. -La Problemo de la Ariane estis ke Estis kelkaj kiuj postulis 64 bitoj por esprimi, kaj li volis konverti ĝin al 16 bita nombro. Ili supozis ke la nombro neniam tuj estos tre granda, ke plejparto de tiuj ciferoj en la 64 bita nombro estis 0-a. Ili eraris. -La Nekapablo de unu programaro programo akcepti la speco de nombro generita per alia estis ĉe la radiko de la misfunkciado. Softvarigo fariĝis tre multekosta parto de nova teknologio. La Ariane 4 raketo estis tre sukcesa, tiel de la programaro kreis por ĝi estis ankaŭ uzata sur la Ariane 5. -La Baza problemo estis ke la Ariane 5 estis pli rapida, akcelis pli rapide. Kaj la programaro devis ne konsistigis tion. -La Detruo de la raketo Estis grandega financa katastrofo, ĉiuj pro minuto programaro eraro. Sed tiu ne estis la unua tempo datumoj konvertiĝo problemoj estis plagita moderna raketo teknologio. -En 1991, kun la komenco de la Unua Golfa Milito, la Patriot misilo spertis similan specon de numero konvertiĝo problemo. Kiel rezulto, 28 personoj, 28 usonaj soldatoj estis mortigitaj kaj ĉirkaŭ 100 aliaj vundis, kiam la Patriot, kiu estis supozita protekti kontraŭ venonta Scuds, malsukcesis pafi misilo. -Kiam Irako invadis Kuvajton kaj Usono lanĉis Dezerto Ŝtormo en frua 1991, Patriot misilon piloj estis deplojitaj protekti Saŭda Arabio kaj Israelo de irakaj Scud misilon atakoj. The Patriot estas usona, meza intervalo surfaco-sistemo de aero fabrikita de la Raytheon kompanio. -La Grandeco de la Patriot interceptor, mem, estas pri, malglate 20 metrojn longa. Kaj ĝi pezas proksimume 2000 funtoj. Kaj portas kapon de about-- Mi kredas ke estas krude 150 funtoj. Kaj la kapo, sin, Estas alta explosivo, kiu havas fragmentoj ĉirkaŭ ĝi. La carcasa de la kapo estas desegnita por agi kiel Buckshot. -La Misiloj estas portata 4 po ujo, kaj estas transportitaj per duone-trailer. -La Patriot anti misilo sistemo superas almenaŭ 20 jaroj nun. Ĝi estis origine desegnita kiel aero defendo misilon malkonstrui aviadiloj malamikoj. En la Unua Golfa Milito, kiam tiu milito venis kune, la Armeo volis uzi ĝin por malkonstrui Scuds, ne aviadiloj. La iraka forto ne estis tiom multe de problemo, sed la Armeo estis maltrankviligita Scuds. Kaj tiel ili provis ĝisdatigi la Patriot. -Intercepting Malamiko misilo vojaĝante al Mach kvin tuj estos defianta sufiĉas. Sed kiam la Patriot estis fulmtransportita en servon, la Armeo ne estis konscia de Iraka modifo kiun faris ilia Scuds preskaŭ neeble batis. -Kio Okazis, estas la Scuds ke estis eniranta, estis malstabilaj, ili wobbling. La kialo por tio ĉi, estis la irakanoj, kun la celo akiri 600 kilometroj el 300 kilometro gamo misilo, prenis pezo el la antaŭa kapo kaj faris la kapo pli malpeza. Do nun, la Patriot prov veni ĉe la Scud, kaj la plimulto de la tempo, la grandega plimulto de la tempo, ĝi estus nur flugas per la Scud. -Once La Patriot sistemo operatoroj realigis la Patriot missed lia celo, ili detonado la Patriot la kapo, eviti eblajn viktimojn se estis permesita fali al la grundo. -Tio Estis kion multaj homoj vidis, tiuj grandaj buloj de fajro en la ĉielo, kaj miskomprenita kiel interkaptas de Scud kapoj. Kvankam en la nokto ĉieloj, Patriotoj ŝajnis esti sukcese detruante Scuds, ĉe Dhahran, tie povus esti eraro pri ĝia efikeco. Tie, la Patriota la radaro sistemo miskalkulis venonta Scud, kaj neniam lanĉita, pro softvara difekto. Estis la israelanoj kiuj unue malkovris ke la pli longa la sistemo estis sur, La pli granda la tempo diferenco igis, pro horloĝo enigita en en la sistemo de komputilo. -About 2 semajnoj antaŭe la tragedio en Dhahran, la israelanoj raportoj la Defendo-Sekcio, ke la sistemo perdis tempon, ke post ĉirkaŭ 8 horoj de kurante, ili rimarkis ke la sistemo estis iĝante rimarkinde malpli precizaj. La Ministerio respondita rakontanta ĉiuj la Patriot pilojn por ne lasi la sistemoj dum longa tempo. Ili neniam diris kio longe estis. 8 horoj? 10 horoj? 1000 horoj? Neniu sciis. -La Patriot pilo postenigitaj ĉe la kazernoj ĉe Dhahran kaj lia misa interna horloĝo, estis sur super 100 horoj sur la nokto de februaro 25. -ĝi Spurita tempo al precizeco de ĉirkaŭ 1/10 de sekundo. Nun 1/10 de sekundo estas interesa numero ĉar ĝi ne povas esti esprimita en duuma, precize. Kio signifas, ĝi ne povas esprimus, ekzakte, en ajna moderna cifereca komputilo. Estas malfacile kredi, sed uzi tion kiel ekzemplon. Ni prenu la nombron, 1/3. 1/3 ne povas esti esprimita en dekuma, precize. 1/3 estas 0,333 okazas por malfinio. Ne estas maniero por fari tion, kun absoluta precizeco, en dekuma. Tio estas ekzakte la sama speco de problemo kiu okazis en la Patriot. Ju pli longe la sistemo kuris, la malbona la tempo eraro fariĝis. -After 100 horoj de funkciado, la eraro en tempo estis nur proksimume 1/3 el sekundo. Sed en terminoj de celado misilo vojaĝante al Mach 5, ĝi rezultis en sekvado eraro de super 600 metroj. Estus fatala eraro por la soldatoj ĉe Dhahran. -Kio Okazis, estas Scud ĵeto estis detektita de frua averto satelitoj-, kaj ili nova kiu la Scud estis venon ilia ĝenerala direkto. Ili ne sciis kie estis venanta. -ĝi Estis nun ĝis la radaro komponanto de la Patriot sistemo, defendanta Dhahran, por loki kaj konservi trako de la venonta malamiko misilo. -La Radaro estis tre inteligenta. Estus fakte spuri la pozicio de la Scud kaj tiam antaŭdiri kie ĝi verŝajne estus, la venontan fojon, La radaro sendis premas eksteren. Tio estis nomita la gamo pordego. -Then, Tuj la Patriot decidas sufiĉan tempon havas pasis reiri kaj kontroli la venonta loko por ĉi detektis objekto, ĝi superas. Do kiam reiris al la malĝusta loko, tiam ne vidas kontestas kaj ĝi decidas ke forestas objekton, ĝi estis falsa detekto, kaj delasas la spuro. La venonta Scud malaperis de la radaro ekrano, kaj duaj poste, ĝi brufermis en la fortikajxon. La Scud mortigis 28 kaj estis la lasta unu pafita dum la Unua Golfa Milito. Tragike, la ĝisdatigita programaro alvenis al Dhahran la sekva tago. La programaro difekto havis estis riparita, fermante unu ĉapitro en la tumulta historio de la Patriot misilo. [FINO reprodukto] DAVID J Malan: Do ni rigardu kelkaj similaj limigoj en nur iom. Sed unue, ni transiro al kelkaj FYI estas. Do one-- tiu semajnfino, ekzistas estos súper sekcioj, kiuj celas forpuŝi regule planitaj sekcioj, kiuj funkciigos semajne cxi tie. Rigardu la CS50 la paĝaro por pliaj informoj pri tiuj. Ili ankaŭ estos filmado kaj eksudita vivas por tiuj nekapablaj ĉeesti. Problemo aro 1 estas sur la kurso de afiŝinto jam, kaj ni rigardu ke en nur iomete. Kaj oficejo horoj ankaŭ prenos meti ĉi lundo ĵaŭdo. Do tio estis la plej kanona programo ni rigardis lasta tempo. Estas kiel la plej simpla programon vi povas skribi en C, kaj eĉ tio estas iom de aŭdaca aserto. Dekstra? Ĉar ekzistas multe de ŝajnante komplekseco al ĉi. Do ni prenu rapidan rigardon al kio iuj de ĉi tiuj elementoj estis kaj poste provi provizi mensan modelon por kiel tiujn simplajn programojn labori, kaj tiam ni komencos rigardas aferojn ĉiam pli kompleksa. Do tiu linio tie, elstarigita nun, en flava, kion ni diras, lastafoje, ke tio faras por ni? Kio estas la celo ĝi servas? Iu ajn el pli for reen? Yeah. Spektantaro membro: [inaudible] DAVID J Malan: Bonan. Do ĝi donas aliro al komandoj, aŭ ni nomu ilin funkcioj, ke iu alia skribis, ke estas deklarita, por tiel diri, en iuj aliaj dosieron. Do ni vidos precize kion .h dosieron Estas kontre a .c dosieron, eventuale. Sed nuntempe, nur scias ke printf, ekzemple, estas inter la funkcioj kiuj estis deklaris en iuj aliaj dosiero, ie alia sur la nubo malfacila stirado ke permesas al ni aliron printf kaj uzi ĝin sen devi reinventi ke rado mem. Dume, ĉefa. Kio estis la analoga de ĉefa, lasta semajno? Yeah. Spektantaro membro: Verda flago estas klakis. DAVID J Malan: Yeah. Scratch la, kiam verda flago clicked. Estas kiel la puzlo peco ke piedbatas aferojn ekstere. Kaj tiel simile, faris la mondon decidis antaŭ kelkaj jaroj ke en C, kaj faskon da aliaj lingvoj, se vi volas skribi programon, via unua funkcio devas esti nomata, ĉefa. Kaj ĝi devas aspekti ĉi. Sed ni revenos, alia tempo, por kio, int, kaj vakaj, signifas en tiu kunteksto. Nuntempe, la krispa krampoj estas speco de kiel Scratch la puzlo peco formo ke personigas iu nombro da linioj. Kaj inter la linioj tie, estas ĉi tie. printf estas funkcio kies celo en vivo estas presi formatan kordoj. Kaj apud formatita, mi volas diri al vi povas ŝtopi en lokokupilo valoroj, kaj vi povas specifi kiom dekuma poentoj, kiom da nombroj presi post dekuma punkto kaj similaj. Kaj printf, kompreneble, prenas unu aŭ pli argumentoj aŭ parametroj, alie konata, pli simple, kiel enigoj. Do printf, kiel multaj funkcioj, prenas enigoj. Kaj tiuj enigoj estas ampleksita per la du krampoj tie. Kaj ene de tiuj estas unu enigo. Estas kordoj, kiel ni nomas ĝin, kio estas nur vico de signoj, kiel vorto aŭ frazo, aŭ tutan eseo eĉ, en inter citiloj. Kaj tio estas kio okazas por influi la konduto de printf ĉar, kompreneble, ĝi estas nur genérico print funkcio. Oni ne tuj scii kion presi, se vi ne diros ĝin. Kaj poste, kelkaj minutiae. Kion ni diras tiun strangan sekvenco de simboloj estas? Yeah. Spektantaro membro: Nova linio. DAVID J Malan: Nova linio. Do rezultas, vi ne povas simple batis, eniri, kiam vi skribas la programo. Ĝenerale, la tradukilo tuj akiri iom konfuzita kiel al kio vi aludas. Prefere, vi devas laŭvorte diri, donu al mi novan linion tie. Kaj do / n estas kio ni ĝenerale voki ellasilo karaktero. Do n, por nova linio. Kaj la tradukilo scias ke kiam vidas / n, ĝi devus fakte indukti la komputilo, finfine, aŭ printf, ĉikaze, elprinti fakta nova linio, kiel bati la, eniri, klavon sur la klavaro. Kaj fine, kion faris ni diru tiu peco de sintakso estas por? Kion tio reprezentas? Yeah. Spektantaro membro: [inaudible] DAVID J Malan: Estas nur la fino de la linio. Estas la fino de la komunikaĵo. Kaj rimarki ke ni ne metis ilin ĉie. Ni certe ne metas ilin ĉe la finoj de ĉiu linio. Ekzemple, Tie estas neniu sur la unua linio, ekzistas neniu sur la linio kun, ĉefa, ekzistas neniu post la krispa krampoj, sed vi komencos vidi kaj akiri familiara kun kie ĝi nomiĝas por. Kaj ĝi estas preskaŭ ĉiam post funkcio voki aŭ deklaron, iu ago ke vi reale preni. Kaj scii nun, speciale se inter tiuj malpli komfortaj, tiuj estas la specoj de stultaj aferoj ke vi finas hazarde batante vian kapon kontraŭ la muro super. Ĉar vi estos logike certa en iu problemo vi jam solvita por problemo aro, kaj la malbenita afero nur ne kompili aŭ eĉ kuri. Kaj tiom ofte, frue, ĝi tuj ĉar vi maltrafis paréntesis, aŭ vi maltrafis punktokomo. Kaj tiel simple esti atenta de tiuj specoj de aferoj, kaj provu ne frustras per ilin ĉar tre rapide faras ĉi malnovigxis ĉapelo. Sed estas tre facile akiri frustritaj frue sur, kiel rezulto. Do nun, ni rigardu kiel tiu linio estas efektive laboranta kaj tiam rigardi iomete pli komplika. Do ni havas ĉi tie, la kapablon desegni sur tiu ekrano. Kaj ni supozu, ke tio estas mia komputila ekrano, sed mi skribas la, saluton programo, kaj mi ne plenumiĝis, printf. Iu alia implementado, printf. Kiu volus pretendi implementado, printf? Se ni rajtas? Bone, kio estas via nomo? Lernanto 1: [? Copal. ?] DAVID J Malan: Copal, venu supren. Venu supren. Bone. Do ni havas, tie, iu nomo etikedoj, ekde ni faros malgrandan ludon de tiu. Kaj ni vizitos vin, printf. Kaj se vi volas veni tien, kion mi ĵus tirita sur la ekrano, ĝi estas tute simple, estas mi tiu. Bone, do, saluton mia nomo estas, printf, se vi ŝatus enkalkulu en. Bone. Kaj se vi povas iri stando per la komputila ekrano kvazaŭ vi estas la funkcio kiu venis kun tiu komputila sistemo. Kaj via celo en vivo estas por fakte presi ion. Sed tre kiel la programo ni nur havis sur la ekrano, ĉi tie, ni tuj devas efektive donas vin kelkaj enigo. Kaj do, se mia enigo, tie, estas ŝajne, kio pasis al printf, ni ia moki ĝin tiel. Mi tuj laŭvorte skribi sur paperpeco, "saluton, mondo" backslash N. Kaj esti klaraj, kio Mi ĵus desegnita sur tiu peco de papero, aspektas jene. Do kiam mi kuros ĉi programo, kaj tiu flava linio de kodo gets ekzekutita, ĝi estas kvazaŭ mi, La saluton programo, am disdonanta iuj enigo for al funkcio ke iu alia skribis. Kaj se vi, kun via fingro, povis reale, kun via fingro, desegni sur la ekrano ajn ĝi estas vi estis enmanigis, la efiko, finfine, estas vidi ekzakte tion, sur la ekrano. Kaj iom angulo kazo ĉi tie. Kaj bone, ni ne vidos la, nova linio, ĉe tiu punkto. Estus malĝusta por vi eksplicite desegni la lino. Sed se ni restos skribas vortojn sur la ekrano, ili finus sub tiu. Do dankon, sed algluita ĉirkaŭ ĉi tie dum nur momento. Ni nun bezonas unu alia volontulo, se ni povus, ke tuj bezonos por ludi la rolon of-- Estas nuraj homoj en la orkestro nun. Kiel about-- OK. Dekstra tie. Venu supren. Kio estas via nomo? Lernanto 2: [? Ivay. ?] DAVID J Malan: Pardonu? Lernanto 2: [? Ivay. ?] DAVID J Malan: Etan, venu supren. Neniu? Ĉu mi akiras ke malpravas, eĉ post vi diris ĝin dufoje? Venu supren. Estas malfacile aŭdi tien. OK. Mi bedaŭras, kio estas via nomo? Lernanto 2: [? Ivay. ?] [? DAVID J Malan: Ivay. ?] OK. Nuntempe, se vi ne faras menso, Vi estas GetString. Lernanto 2: OK. Malvarmeta. DAVID J Malan: Do se vi ŝatus stari tie dum nur momento, ni rigardu iomete pli kompleksa programo, kiun nun havas tri linioj de kodo. Do ni havas unu, deklari vian nomon uzante printf; du, alvokon al GetString, sekvata de asigno al ŝanĝiĝema nomita, kordoj s aŭ nomita s; kaj poste alia alvoko al, printf, sed ĉi tiu fojo kun du eniroj. Do ni jam faris stato via nomo, aŭ pli ĝuste, ni havas jam faris printf alvoko. Do mi tuj skribos, Deklaru vian nomon. Kaj do, kion mi tuj pasi, printf, en nur momente, Estas sufiĉe simple, tiu. Do se vi volas antaŭeniri kaj tiros tiun sur la ekrano, tio estas via enigo nun. Bone. Kaj forgesu kordo, ni nun havas nia propra linio de kodo tie. Do, GetString, ni bezonas por fakte nomi, GetString. Do via celo en la vivo estas nur piediri eksteren en la orkestro, se vi povus, kaj akiri ies nomon. Sed ni donu al vi io por meti ĝin sur. Se vi volas, iru antaŭen kaj akiri kordoj, akiri ies nomon sur tiu peco de papero, se vi povus. Bone. Kaj ni vidos, en nur momente, kies nomo estas duumaj. Dume, kion mi tuj havas preta, estas sensigna peco el papero, en kiu, mi tuj stoki ajn valoro ĝi estas ke GetString revenas al mi, Mi, estante kordo variablo nomita, s. Bone. Do kion vi havas ĉi tie? Nik. Bone. Do ni havas Nik nomo tie. Do jen kion laŭvorte estis revenis al mi, por tiel diri, per GetString. Mi nun iras al ekzekuti la maldekstra flanko de tiu esprimo, kie mi simple kopii malsupren, por hodiaŭa celoj, Nik. Do nun, mi havas variablo nomita, s, stokante Nik nomo. Mi jam enmanigis al printf antaŭan argumenton. Sed en nia tria kaj lasta linio de kodo, mi fakte devas manon printf iu iom different-- "saluton,% s," backslash n. Kaj tiel la lasta linio mi iros al send-- la lasta afero mi estas verkos malsupreniros, estas tiu. Do la du linioj de kodo, aŭ prefere la lasta linio de kodo, alvokoj por du inputs-- unu, tiun, kaj du, ĉi. Do se nia printf funkcio nun povas preni tiujn kiel enigo, lasu min liberigi la ekrano por vi. Fakte ne, vi povas iri antaŭen. Ni lasos ĝin, ekde ĝi estas sur la sama programo. Ni devus vidi, saluton, Nik. Bone. Do tiu estis tre kelkajn aros salti tra, simple skribi, deklari vian nomo, kaj, saluton, Nik. Sed ĉi tiu simpla ideo de mesaĝo forpaso de enigo kaj eligo forpaso akcepto, Estas ekzakte la modelon ni tuj devas ĉar eĉ la plej kompleksaj funkcioj. Do dankon tiel por vi ambaŭ. Ni havas belan streso pilko tie por vi. Kaj dankon al nia GetString kaj printf volontuloj egale. Dankon. Bone. Dankon al vi ambaŭ. Do ni parolis pri ĝis nun, plejparte pri kordoj. Kaj ĝi rezultas ke C povas reale kompreni kelkaj malsamaj datumtipoj. Fakte, ni prenu Rigardu tiujn ĉi tie. Do C, kaj multajn lingvojn, kompreni aĵoj nomata signoj. A char estas ĝenerale sola bajto, aŭ ok bitoj. Kaj ĝi reprezentas ununuran karakteron, kiel la litero A, aŭ la ĉefurbo litero A, aŭ la minuskla litero A, aŭ ekkrion punkto, aŭ ajnan karakteron kiu vi povas tajpi sur via klavaro, kaj kelkfoje eĉ pli. Ni ankaŭ okazas vidi kaleŝegoj. Al kaleŝego estas, ĝenerale, 32-bita valoro, aŭ kvar bitokoj ĉar denove, unu bajto estas ok bitoj. Do kaleŝego estas glitpunktaj valoron, io kun dekuma punkto. Kaj efektive, jen kio la filmo estis parolanta pri kiam ili parolis pri flosantaj punkto valoroj, iu fiksita nombro da bitoj estanta uzita por reprezenti realan numeron. Sed estas ankaŭ aĵoj nomata duobloj. Tiuj ekzistas en Java, se vi prenis APCs, kaj duobla, kiel la nomo dankeme sugestas, estas duoble pli granda ol kaleŝego. Estas ankoraŭ realan numeron, ĝi simple havas pli bitoj kun kiu esti ĉiam pli precizaj, aŭ stoki eĉ pli grandaj nombroj. int estas facila. Ni parolis pri tiu lasta tempo. Estas nur entjero. Kaj ĝi estas ĝenerale 32 bitoj, aŭ kvar bitokoj. Kaj tiel, se vi havas, ni vidu nun, 32 bits-- kaj ni faris tiun en semajno 0, iam tiel briefly-- se vi havas 32 bitoj, kio estas la plej granda Nombro vi povas reprezenti kiel entjero? Donu aŭ preni? Estas kiel 4 miliardoj, kaj tio estas nur se ni estas reprezentanta pozitivaj nombroj nur. Se vi havas 32 bitoj, kaj vi volas reprezentas negativajn numerojn tiel, via atingo estas, esence, negativa 2 miliardo por pozitiva 2 miliardoj. Sed ĝenerale, ni komencos je 0 iri ĝis 4 miliardoj. Vi ne devas scii precize, sed ni povas vidi tiun, fakte, se mi nur malfermiĝi iom kalkulilo, ĉi tie. Mi povas fari 2 la 32, kaj tio estas ĝuste kiom granda, kiom valoroj povas reprezenti, kun 32 bitoj. Kaj estas proksimume 4 miliardoj. Do ni observu vidante ke nombro en kelkaj malsamaj lokoj. Sed se vi bezonas plu nombroj ol tio, rezultas ekzistas iu nomita longa longa. Kaj longa longa estas ĝenerale 64 bitoj, kiu signifas ĝi estas ordo de grando eĉ pli granda ol int. Do mi eĉ ne povas prononci la plej grandaj numero kiun vi povas reprezenti, sed estas notinde pli granda. Nun kiel flanken, historie, se int estas 32 bitoj, kaj longa longa estas 64 bitoj, kiel granda estas longa, ne longa tempo? Oni kredus ke ĝi estas pli longa ol int sed eble malpli longe ol longa longa, sed reale dependas. Kaj tiel rezultas unu de la frustraciones tro, kun skribanta kodo sur certaj sistemoj, estas ke ne ĉiuj el tiuj datumtipoj havas pre-determinita valoroj. Kelkfoje ĝi estas tio multaj bitoj. Foje estas ke multaj bitoj. Do vi vere devas scii, kelkfoje, kio aparataro ke vi uzas viajn programaro sur. Feliĉe, aliaj lingvoj kaj aliaj datumtipoj kiuj nun ekzistas, permesos vin esti pli preciza. Nu, ni ekvidis ĉenon, kaj ni vidis bool, tro, sed rezultu tiuj venas nur kun la CS50 biblioteko. Do tiuj ne konstruita en C. Tiuj anstataŭe, venas en tiu dosiero nomata CS50.h, ke ni eventuale senŝeligas reen la tavolojn de. Sed nuntempe, ili estas nur aldona datumtipoj. Bool estas vera aŭ malvera, kaj kordo estas vico de signoj, kiel vorto. Nun printf, ni vidis, havas anstataŭaĵojn,% s estas unu. Kaj eble vi povos, por nun, konkludi el tiuj aliaj ekzemploj, kiamaniere vi povus havi lokokupilo por malsamaj datumtipoj. Ekzemple, preni divenon, se vi volis presi ununuran char uzante printf, la lokokupilo estas probable% c. Kaj se vi volas printi la entjero kun la lokokupilo,% i. % LLD estas longa longa dekuma valoro, sed longa longa, tiel ke mapoj al tio. Kaj tiam% f por flosanta punkto valoro aŭ por duobla, do kelkfoje ili estas recikligita en malsamaj kuntekstoj. Do ni vidos kaj uzi kelkaj el tiuj super tempo. Kaj printf kaj aliajn funkciojn ankaŭ subteno alies eskapo sekvencoj, kaj kelkfoje tiuj estas necesaj. Do backslash n estas nova linio. Backslash t, ĉu iu volas preni ponardopiko? Spektantaro membro: Tab. DAVID J Malan: Tab. Do se vi vere volas elprinti pestaña, ne fiksita nombro de spacoj sed fakta langeton karaktero, vi ne trafis viajn, tab, ŝlosilo sur la klavaro, ĝenerale, vi efektive faras backslash t. Backslash citilon, kial mi iam volas ke? Dekstra? Kial mi ne povas simple tajpi citilon sur mia klavaro? Spektantaro membro: Ĉar, alikaze, tuj kredas ke estas la fino de kiel viaj presaĵo [? tekston. ?] DAVID J Malan: Ĝuste. Memoru, kun niaj printf ekzemploj, kiam ni estis pasante por printf en enigo, maldekstre de tiu enigo kordoj kaj sur la dekstra de tiu enigo printempo, kompreneble, estis duobla citaĵo. Se via propra enigo havas duoblan citaĵo en la mezo de tiu, la komputilo povus potenciale get konfuzita, kiel al, faras tiun citilon apartenas en la mezo? Ĉu ĝi apartenas kun la maldekstra? Ĉu ĝi apartenas de la gxusta? Kaj do, se vi volas fari ĝin super klara, vi faras backslash citilon, tiel ke ĝi eskapis, por tiel diri, kaj ĝi ne conflated por io alia. Kaj estas kelkaj aliaj tie, backslash r, unuopaj citiloj, 0, ke ni vidu la tempo, ankaŭ. Kaj nun, kio pri funkcioj? Do agoj kiujn ni povas preni tiel longe en tiu lingvo, C, nu, ni vidis, printf, kompreneble, kaj ĉiuj de la aliaj sur la ekrano, tie, ke ni uzos por la Kompreneble la unuaj kelkaj semajnoj nur, venas kiam la CS50 biblioteko. Kaj ili faras ĝin multe pli facila, en C, por fakte akiri uzanto enigo. Ĝi rezultas ke en C, kaj sincere en kelkaj lingvoj, ĝi estas vera doloro en la kolo por fari ion simplan, kiel prompto la uzanto por klavaro, pro ties enigo. Do, tiuj funkcioj plifaciligi. Kaj ĝi ankaŭ havas eraran kontrolanta ĉie, tiel ke, kiam vi rememori merkrede, ni vidis la, reprovi, averton, kiam mi ne kunlaboris, kaj mi tajpis vorton, anstataŭ nombro? Ni jam faris la peza levanta frua sur certigi la uzanto kunlaboras. Sed tiuj estas nur trejnado radoj kiuj ni eventuale, kaj rapide, demetu. Do por recap, tiam, ni prenu rapidan rigardon, multe kiel ni faris kun Scratch, ĉe kelkaj kanonaj konstrukciojn en C. Tiu celas, varo de, esti ventego ĝiras, nur por ke vi havas referencon kaj ke vi vidis aferoj unue. Sed poste ni rigardu fakta kodigon uzi iuj de ĉi tiuj konstruelementoj. Tiel kiel en Scratch, kiam ni estis deklaroj ŝatas: diri aŭ, atendu, en C, ni havi funkcioj tiel, kiel printf. Se ni volas esprimi kondiĉo en C, estas simila, en spirito, al tiu enigmo flikaĵo similis tiun en Scratch. Sed anstataŭe, ni laŭvorte simple skribu, se. Kaj tiam, en krampoj, ni metu kondiĉon, kie tiu kondiĉo estas kion ni nomas, denove, bulea esprimo. Kaj denove, ĉi tiu estas speco de _pseudocode_. Kaj, fakte, la // estas komenton. Estas nur anglaj vortoj ol mi mem. Sed tio estas la ĝenerala strukturo de, se, kondiĉe. Sed ni vidos konkretan ekzemploj en nur momento. Se vi volas havi dudirekta forko en la vojo, multe kiel ni faris kun niaj volontuloj sur Merkredo, vi povas havi, alie se. Kaj se vi volas havi trian kaj finan kondiĉon, aŭ defaŭlta situacio, vi povas havi nur alia bloko, ekzistas. Kaj simile, kun buleaj esprimoj, vi povas, kaj, ilin kune. Kaj ni vidis merkrede, kiuj ĝi estas ne unu-simbolo, estas du, por malsupra-nivelaj kialoj ke ni eventuale vidi kaj ludi kun. Aŭ-ing aferojn kune estas 2 vertikalaj strioj. Sur usona klavaro, tiu Estas ĝenerale ŝlosilo kun la klavo Shift supre via Eniga klavo aŭ Reiri ŝlosilo. Tiam ekzistas tiuj aferoj ni uzos eble unufoje aŭ dufoje. Ili estas funkcie ekvivalenta al kion vi povas fari kun, se, alie se, alie se alie, konstrui, sed ili estas nomita ŝaltilo. Ili aspektos tre malsamaj, sed ni vidi en iuj de niaj dissendo kodo, por estonta problemo aro, plej verŝajne, ke ĝi estas kelkfoje nur pli bela maniero esprimi tuto faskon da kondiĉoj, sen devi multajn buklaj krampoj kaj multajn parentezoj kaj deŝovon. Sed donu al ni pli potenco ol ni havas jam. Kaj nun cikloj. Kaj ĉi tiu, ni povos rigardi ĉe iom pli malrapide. Sed tiam, ni ekuzas tiujn, speciale por tiuj jam konataj. Jen la kanona maniero, se nekredeble arcano vojo, skribi buklo en C. Nun buklo en Scratch estis bela simpla. Vi havas, por ĉiam, bloko. Vi havas, ripeto, bloko kun nur nombro vi devas tajpi en. Kaj kun la, por ciklo, vi povas implementan ambaŭ de tiuj ideoj, sed ĝi estas iom pli teknika. Sed sincere, ĝi estas ankaŭ relative simpla. Unufoje vi scias la ordon de operacioj, vi laŭlitere estas ĝuste tuj konekti valoroj kaj diri al la komputilo, kion fari. Do jen ekzemplo. Jen buklo kiu, tute simple, ĝi rakontas de unu nombro supren tra alia. Kaj kun nur rigardante ĉe ĝi, eĉ se vi havas neniun antaŭan sperton kun tiu lingvo, kiu nombro ĝi probable komenci kalkulon je? OK, 0. Kaj mi konjektas ke estas ĉar vi vidu ke ekzistas int kaj i, kiuj estas variablo. Oni pravalorizitaj al 0. Kaj tiam poste, ĝi aspektas kiel ni pasante printf, valoro. Kaj, fakte, mi faris iom tajperaro tie. Sed tio estas facile riparita. Mi aldonu en, i tie. Ni nun havas printf estaĵo pasis ke lokokupilo valoro. Kaj kio okazas al kalkuli tra? Publiko: 50. 50. 49. DAVID J Malan: 49. Do 50, unuavide, ŝajnas ĝusta. Sed tio, verŝajne, tuj estos nia kondiĉo ke ni tenas kontrolanta. Kaj ni tuj halti iam Mi ne plu estas malpli ol 50. Do tiu buklo, male, devus ekzekuti, tiel longe kiel i estas malpli ol 50. Sed tuj kiam ĝi fariĝas 50, aŭ 51, aŭ pli malbone, ĝi devus halti aŭtomate. Bone. Do kio vere okazas tie? Do tiu estas la ordo de operacioj por buklo. Unu, vi havas la tn inicialización. Tiu flava elstarigita chunk de kodo estas ekzekutita unua, kaj ĝi havas la efikon ke, po Merkredo, vi probable imagi. Ĝi kreas variablo nomis i kaj i tendencas en tiu variablo la valoron 0. Do i estas 0 ĉe tiu punkto en la rakonto. La sekva afero, kiun okazas en tiu konstrukcio, estas ke la kondiĉo gets kontrolis. Do mi kontroli tuj, estas mi malpli ol 50? Kaj kompreneble, la respondo cxar nun, verŝajne, jes. Jes, ĉar mi estas 0, kaj tio certe malpli ol 50. Tiam kio okazas, estas ke tiu linio de kodo gets ekzekutita. Kaj fakte, se ekzistas multoblaj linioj de kodo en tiuj buklaj krampoj, ili ĉiuj aplikiĝas unu post alia. Kaj en la efekto ĉi tie, estas ŝajne, presi la nombro i, kiu tuj esti 0, kaj tiam 1, kaj tiam 2. Sed kial? Kial ĝi akiras incremented? Nu, la kvara afero okazas estas kiu ĉi sintakso gets ekzekutita post la punktokomo. Mi ++ estas pli rapida maniero por diri; preni la valoron de i, kaj aldoni 1 al ĝi; kaj tiam la venontan fojon ĉirkaŭe, aldoni 1 al ĝi; kaj la proksima fojo ĉirkaŭe, aldonu 1 al ĝi. Do se ni dauxre iros, kio okazos sekva estas Mi ne tuj pravalorizi i iam denove. Se mi observas la inicialización i al 0, ĉi ekzemplo neniam finos ĉar Mi estus senmoviĝita ĉe 0. Sed kio okazos estas ke la kondiĉo estos kontrolata, la linio de kodo estos get ekzekutita, la i estos incremented, kondiĉo estos kontrolata, kodo estos get ekzekutita. Kaj gxi havis biciklado denove, kaj denove, kaj denove, ĝis i ++ konkludas valoro de 50. La kondiĉo tiam diras, estas 50 malpli ol 50? La respondo, kompreneble, estas ne, kaj Kaj la dauxro kodo detenas ekzekuti. Kaj se vi havas pli kodo sur la ekrano malsupre, jen kio okazas poste. Ĝi krevas el tiuj buklaj krampoj kaj daŭre presi pli poste. Do ŝerco nun, el Foxtrot, ke vi eble nun komprenas. Ĉiam amuzaj. Estas kiel la sonoj ia percolate, kaj tiam vi rimarkas vi malakceptu esti priridas humuro ŝatas tion. Sed estas iuj takeaway tie, pedagogie, tro. Do rezultas ke mi estas mankanta peco de sintakso, aŭ Foxtrot la perdiĝanta peco de sintakso tie. Kio mankas, ke ni havis en ĉiu alia ekzemplo, ĝis nun? Reveno, estas tie, do tio estas io alia, ke ni revenos al antaŭ longe. Kio mankas, kvankam? Yeah. Spektantaro membro: La inicialización de [inaudible]. DAVID J Malan: Bone. Do jes. Do fakte, ĉi is-- Nu, kaj grafo inicializa supren supre aux prefere, deklarita super. Do tiu estas alia maniero fari ĝin. Sed ne en unu linio estas valida tamen. Kion pri ĉi tie? Spektantaro membro: Ĉu la krispa krampoj? DAVID J Malan: Yeah. Do la krispa krampoj mankas. Sed tiu kodo, mi volas diri, al ilia kredito, Estas vere, sintakse valida. Rezultas, vi ne bezonas la krispa krampoj se vi nur havas unu linion de kodo ke vi volas ekzekuti ene de la buklo. Nun ni ĉiam, en klaso kaj en ĉiuj niaj dissendo kodo, inkluzivas la krispa krampoj ĉiuokaze, simple por klareco, kalkaj. Sed rimarkas ke en lernolibroj Tio ekzemploj, Vi povas tre bone vidi krispa krampoj mankas iam. Kaj tio estas bone, se kion vi esti dentado kaj intencita estas nur unu linion de kodo, kaj ne multoblaj linioj de kodo, potenciale. Bone. Do rilatajn al la temo de imprecision, estas temo de overflow, en la senco ke, simile, ĉu entjeroj havas limojn al ili samkiel glitpunktaj valoroj? En la mondo glitpunkta valoroj, ni povas esti nur tiel preciza, post kiu, kelkfoje malbonaj aferoj povas okazi, kaj niaj programoj povas esti kalesxon kaj eraro. Nun eĉ kun entjeroj, vi povas kolizii problemojn. Nun entjero ne havas dekuma punkto aŭ nombroj post tio. Estas nur natura nombro, tipe. Do kio povus iri malbone kun int? Se mi uzas int al Grafo, kio povus iri malbone? Ŝajnas multe pli simpla. Yeah. Spektantaro membro: Se la numeron ricevas [inaudible] DAVID J Malan: Yeah. Kio se vi kalkulas tiel alta, ke vi ne povas esprimi, ke vere granda nombro. Dekstra? En iu punkto, vi tuj superi la limojn de 32-bita valoro aŭ 64-bita valoro. Nun denove mi ne certas kiom prononci 64-bita valoro, sed mi scias kun 32-bita entjero, la plej granda valoro ne povas esti, se ĝi estas nur pozitivaj valoroj, estas proksimume 4 miliardoj. Do se mi provas kalkuli 5 Miliardo, io tuj okazos. Sed ni vidu kio, fakte, povas okazi. En la mondo de entjero superfluaĵo, kie vi, iasence, inundos la kapablo de entjero, kio povus okazi? Do jen duuma nombro, ĝi estas retroturniĝo al 0. Estas ĉio 1-a, kaj la anstataŭiloj tie, estas potencoj de 2, do tiu estas duuma. Do tiuj estas 8, 1 bitoj sur la ekrano. Kaj se vi memoras aŭ vi rapide faros la math, kio valoro estas reprezentitaj tie kun tiuj ok 1 bitoj? 255. Kaj eĉ se vi ne estis tute certa de la matematiko, vi povus fari ĝin. Aŭ vi povus simple speco de racio tra ĝi, atendu momenton, se mi reprezentante 8 bita valoro, kaj mi havas 256 eblaj valoroj, sed la unua de kiuj estas 0, Mi nur scias ke la grandaj tuj estos 255, kaj tio estas kio ĉi tiu povus esti. Do supozu mi provas aldoni 1 al tiu valoro. Kion vi farus en lernojaro lernejo aldoninte 1, kaj ĝi ne vere taŭgas ĉar vi devos porti la 1? Kio estas tiu nombro iranta fariĝi kiam vi aldonas 1? Ĝi okazos al 0. Dekstra? Ĉar se vi havus pli bits-- kaj mi provu, ia, tajpu ĝin here-- se ni havis pli bitoj, kion ni povus fari tie estas aldoni la 1, kaj tiam ni akirus ĉi. Whoops. Ni havus 1 bito tuta vojo super tie. Sed se tiu estas finia valoro, ĝi estas nur 8 bitoj, kaj tio estas antaŭdestinita per la komputilo, ke 1 estas efektive ne ekzistas. Ĝi nur ia forfalas klifo. Kaj do se vi aldonas 1 al 255, kio valoro vi ŝajne ricevis? 0. Kaj tiel nombroj hazarde, kaj eble senintence, finos envolvado ĉirkaŭ ŝatas tion. Do kio povas esti la implico de tio? Nu, ekzistas kelkaj malsamaj aĵoj. Do unu, ĝi finas serĉante kiel 0, senintence, sed vi povas ia vidi, eĉ en la reala mondo, por bone aŭ por malbone, demonstracioj de ĉi tiu ideo de limigo. Ekzemple, neniu el vi kiuj iam ludis Lego Star Wars, ĉu iu hazarde scias la maksimuma nombro da moneroj vi povas kolekti en Lego Star Wars? Prenu diveno bazita sur hodiaŭa gvida demandojn. Ĝi estas pli granda ol 256 aŭ 255. Ĝi estas 4 miliardoj. Do rezultas, kaj ekzistas iuj people-- iuj googling konfirmis lasta night-- akiris 4 miliardoj ormonerojn, aŭ whatnot, en Lego Star Wars. Kvankam ŝajne, ekzistas maniero trompi la ludo, ekzistas cimo aŭ trajto, kiu ebligas nur accrue partoj kaj multaj punktoj. Sed la plej granda ebla valoro, laŭ al tiu ekrankopio de iu mi trovis rete, estas ja, 4 miliardoj. Nun kial estas tio? Estas precize 4 miliardoj, probable ĉar iu decidis, kiu skribis ĉi ludo, ke ili povus fari 4 miliardoj, ion, ion, ion, kiel la valoro mi arangxis kun la kalkulilo pli frue, sed ĝi estas nur iom pli pura por homoj diri la maksimuma nombro de coins-- aŭ enkrustajxoj, kiel ili nomas them-- ke vi povas kolekti estas 4 miliardoj. Kaj do, kial estas tio? Kiom estas la LEGO ludo efektiviganta la vendotablo kiu estas konservanta trako de la numeron de moneroj vi havas? Ili uzas kio? Spektantaro membro: Ĉesas kalkulante post 4 miliardoj. DAVID J Malan: Ĉesas kalkulante post 4 miliardoj, kio signifas ke vi povas konkludi, kiel programisto, ke ili estas probable uzante 32 bita entjero. Kiel la programisto laŭvorte nur tajpita, int, en lia aŭ ŝia kodo, kaj tio estas la tipo de variablo kiu ili uzas por stoki ies kodon. Do ekzistas aliaj demonstracioj de tiuj specoj de limoj. Do mi ne ludis tiun game-- kaj mi legis sur la historio konfirmi kiel much-- sed en la originala versio de Civilizacio, kie vi ŝajne interagas kun ĉiu aliaj kaj povas militi aŭ havi pacon, Gandhi estis supozita esti unu el la plej paca karakteroj, kiel mi kompreni, en la unua versio de Civilizacio. Kaj fakte, en skalo de 1 al 10, lia agresividad estis nur 1. Do iam tiel milde agresema, ŝajne. Sed en iu momento, vi povas ŝajne instali demokration en via geografio. Kaj se vi instalas demokratio en via versio de la ludo, tiam via agreso nivelo iras malsupren. Ĝi estas bona afero. Homoj estas pli trankvila ŝajne, en tiu situacio. Sed ŝajne, iu faris ne havas, se, kondiĉe en la originala versio de la kodo. Do Gandhi agreso nivelo iradis de pozitivaj 1, minus 2, al negativa 1, sed la ludo ne kompreni negativaj nombroj. Do kio okazis estis Gandhi agreso nivelo eliris el la 1 al 0, al negativa 1, kiu havis la efikon de envolvado ĉirkaŭ esti la plej agresema karaktero en la ludo, ĉe valoro de 255, sur skalo de 1 ĝis 10. Kaj de tiam, tie jam pli personigoj de ĉi tiu ludo, kaj ili tenis ŝin kiel ia Paska ovo, ke Gandhi estas ŝajne tiel terure agresema. Sed estis la rezulto de tre simpla programado eraro Kaj en tiu frua versio de la ludo. Nun pli disturbingly, pli ĵus, la Boeing 787 estis dokumentitaj kiel havante cimo, ne tia aparato vi aparte volas havi cimon. Kaj la simptomoj, kiujn mi legos tie, el artikolo rete, estis tiu, modelo 787 aviadilo kiu estis funkciigita ade por 248 tagoj povas perdi ĉiuj alterna fluo, alterna, elektra potenco, pro la generatoro kontrolo unuoj, GCUs, samtempe iro en Fail-sekura reĝimo. Do tiu estis averto eldonis kiam tiu problemo estis malkovrita. Tiu kondiĉo estas kaŭzita softvaron vendotablo, interna al la GCUs, do entjero aŭ variablon, ke volo superabundas post 248 tagoj de kontinua potenco. Boeing estas en la procezo de disvolvante GCU programaro upgrade ke estos remediar la nesekura kondiĉo. Tiel kiel la misilo scenaro, kien ili havis iun specon de variablo kiu rakonti, kaj kalkulante, kaj rakontante, sed laŭgrade disversxigxinta la limoj de lia kapablo, Simile faris la malbenita aviadilo havas variablo superfluaĵo post sufiĉa tempo de kurado. Kaj tial la lang-en-vanga maniero labori ĉirkaŭ tiu temo Estas vere, reboot, via ebeno ĉiun 247 tagoj, tiel ke la memoro gets viŝis kaj la variablo superas al 0. Sed realigi, tio estas tre granda personigo de programaro, sed precipe kiel ni aŭdas pri Apple operaciumoj iranta en aŭtoj, kaj mem-veturanta aŭtoj de Google, kaj ajn da enkarniĝoj de programaro en nia ĉiutaga vivo, televidoj kaj horloĝoj, kaj pli, realigi ĉirkaŭitajn de programaro, Ĉiuj de kiu estas skribita de ni homoj. Kaj kiel ni ĉiuj baldaŭ malkovros, ĝi estas tre facila kaj tre tipa fari erarojn kiam skribante softvaron. Kaj se vi ne kaptas ilin, kelkaj malbonaj aferoj povas okazi. Nun kelkfoje, iuj amuza aferoj povas okazi, aŭ almenaŭ foje ni scii atendi iuj malboneco. Do 0 dividitaj per 0, de grado lernejo, estas ĝenerale malbona afero. Ĝi estas nedefinita. Kaj ĝi rezultas fjordon kaj vidu se miaj mic povas elekti ĉi up-- ke Apple havis iun amuzon kun tiu ĵus. Do mi havas iPhone tie. Mi tuj parolos al Siri kaj petu ŝian doni al mi la respondon al 0 dividitaj per 0. Kio 0 dividitaj per 0? Siri: Imagu ke vi havas 0 kuketojn, kaj vi fendi ilin pare inter 0 amikoj. Kiom da kuketoj does ĉiu persono ricevas? Vidu? Ĝi ne havas sencon. Kaj Cookie Monster estas malĝoja ke estas neniuj kuketojn. Kaj vi estas malĝoja ke vi ne havas amikojn. DAVID J Malan: Estas speco de malnormala. Do jen kion ĵus diris tie. Ĝi estas nedeterminita, ĝi ne estas difinita, kaj efektive, multaj programlingvoj aŭ, vere, kompililoj volo detekti kiam vi, en programo, provu dividi 0 per 0. Pli amuze ol ĉi tamen, estas kiu ŝajne, Cookie Monster estas sur Pepi tiuj tagoj. Kaj li respondis al tiu, kun tiu, kiu estas absolute adorable. Sed ni prenu rapidan rigardon al kelkaj aliaj konstruoj, kaj surmetu iom el tiu kodo por uzi, en bonaj manieroj. Do rezultas, krom por bukloj, ekzistas iu nomita dum buklo, ke aspektas malsamaj kaj estas implementado iom differently-- kaj ni eventuale vidi examples-- sed iusence, ĝi estas simpla ĉar ĝi ne permesas vin al pravalorizi kaj ĝisdatigi ene la limoj de la buklo. Vi povas ankoraŭ efektivigi ĝin. Do vi povas fari la ĝustan saman aferoj kun dum ciklo, kiel kun por ciklo, sed via sintakso, ultimately-- kiel ni eventuale Konsideru tuj estos malsama. Ekzistas eĉ fari dum buklo, kiu estas fakte iom malsama, en tiu dum kiu por buklo kaj dum buklo ĉiam kontroli lian kondiĉon unua, se vi legu tion supre sube, Ĉio aspektas kiel ĝi tuj kontrolu ĝia kondiĉo lasta ĉar ĝi estas vere la lasta linio de kodo. Kaj efektive, ke tuj estos utila en iuj programoj kiuj ni skribas, se vi volas simple blinde fari ion kaj eventuale kontroli la kondiĉo. Tio ne nepre estas malbona afero. Se ni volas variabloj, ni povas fari ĝin en paro de malsamaj manieroj. Kaj ni vidis en la Foxtrot karikaturo, unu maniero fari ĝin, kie vi deklari vian variablon, kiel int counter punktokomo, kaj tiam later-- eble la venontan linio, eble 10 linioj later-- vi fakte pravalorizi ĝin. Do tiuj 2 linioj de kodo deklari variablon de tipo int kaj nomas ĝin vendotablo, do ĝi donas min sufiĉe bitoj teni int. Kaj tiam poste, ĝi metas la valoro 0 en tiu variablo. Ĝi disponas la 0-aj kaj 1-oj en mastro, ke ni scias el pasintsemajne, reprezentas la numeron ni konas 0. Aŭ sincere, vi povas fari tion multe pli koncize, simple ŝatas tion. Nun ni havas ankaŭ la kapablo nomi funkcioj. Kaj fakte, ĉi tie estas 2 linio programo, aŭ ekstrakto gxiajn kiu nin permesas reale skribi iun kodon kiu ricevas cxeno el la user-- multe kiel nia volontulo momenton ago-- stokante la rezulton en ŝanĝiĝema nomita nomo, kaj then-- multe kiel kun nia volontulo kun printf-- presaĵoj el tiuj valoroj per pasante en du argumentoj, la kordo, sekvita de la variablo nomita, nomo, mem. Do ni rigardu, antaŭ ni revenos al Mario tie, ĉe kelkaj nun, ekzemploj de tio. Mi tuj iros antaŭen kaj malfermi ĝis, ni diru, funkcio-0.c. Kaj kiel ĉiam, tiu kodo estas havebla sur la kurson de afiŝinto, do vi povas ludi kune ĉe hejmo kaj rigardu ĝin poste. Sed jen la programo en ĝi estas esenco, de linio 17 al 22. La ĉefa programo estas kie la programo estas ĉiam tuj komenci. Tiu programo, ŝajne, tuj presi vian nomon, dupunkto. Ĝi estas tiam tuj nomas GetString, same kiel ni faris kun niaj volontuloj. Kaj tiam, tiu estas interesa, ĝi tuj nomas PrintName. Rezultas, ĉiuj ĉi tempo, ŝajnas esti funkcio nomita PrintName. Kiu presas ies nomon. Ni ne bezonas uzi printf el pasintaj tempoj, ekzistas PrintName. Sed tio estas iluzia ĉar PrintName ne venas kun C. popolo nenion elpensi ĝin iuj 40 aŭ 50 jaroj, Mi faris, anstataŭe. Kaj fakte, se mi rulumu malsupren plui, avizo kiel mi povas skribi mian propran funkcioj en C. ni eventuale ekspliki kial ni tenas diranta, malplenon, en kelkaj lokoj, Sed por hodiaŭ, ni nur rigardas la nomo. On line 24, se vi volas krei vian propran funkcion, vi laŭvorte skribi la nomo de la funkcio. Mi elektis PrintName. En krampoj, vi tiam specifi kion specoj de enigoj, kaj kiom da vi volas tiun funkcion por preni. En tiu kazo, mi volas preni 1 variablo nomita, nomo, kaj ĝi tuj estu tipo, kordoj, tiel estas tuj esti iu vico de karakteroj. Kaj tiam, tiu program-- multe kiel en Scratch, vi povas havi kutimon enigmo pieces-- tuj havos ĉi kutimo konduto. Ĝi tuj nomas printf pasante en, saluton, lokokupilo, kaj tiam tuj ŝtopi en kio ajn la uzanto nomita. Do tiu estas ekzemplo de kio komputila sciencisto alvoko abstraktado aŭ funkcia malkomponaĵo, kiu estas nur fancy manierojn saying-- Ĉu se vi ŝatas tiun altan nivelon ideo, kiel mi volas funcionalidad kiu presas ies nomon, absolute vin povas laŭvorte skribi printf kaj poste En la argumentoj vi volas, kaj la programo funkcios, kiel ĝi havas ekde merkredo. Sed vi povas komenci al abstrakta for la nocio de presado nomon. Vi povas doni al ĝi nomon, kiel PrintName kaj ĉi estas tiu ideo de layering de semajno 0. Nun, mi kaj vi ne devas scii aŭ zorgas kiom PrintName estas implementado. Jes uzas printf, eble ne, kiu scias kion uzas? Kiu zorgas? Nun mi parolas ĉi tien, anstataŭ malsupren tie. Kaj efektive, kiel niaj programoj akiri pli progresintaj kaj kompleksaj, ni tuj daŭre prenante por donita ke malalta nivelo enigmo pecoj ekzistas. Ĉar ni skribis ilin aŭ iu alia, tiel ke ni povas tiam konstrui supre sur ili. Ni rigardu tiun Varianto, funkcii unu. Do ĉi tiu estas iom pli progresintaj, sed tio rezultas ke en CS50 la biblioteko, ekzistas nur GetInt funkcio. Ni ne pensas, jaroj, al praktikigi GetPositiveInt funkcio. Kaj tio estas iom ĝena ĉar se you guys skribanta programon kien vi volas ricevi pozitivan entjero de la uzanto, vi povas absolute uzi GetInt. Kaj vi povas absolute kontroli kun la kondiĉo kaj eble buklo se tiu estas pli granda int ol 0 kaj krias al la uzanto se li aŭ ŝi ne donu vi pozitiva nombro. Sed ni konstruu tiun konstruaĵo blokas nin, a, kutimo Scratch peco, se vi volas. Mi tuj havi programon tie ke finfine, mi volas povi nomi GetPositiveInt, kaj mi volas esti povis presi kio ajn ke int estas. Sed tiu estas distrita for nun. Ĝi simple estis donita altan nivelon nomo kiu diras kion ĝi faras, mirinda estas ĉar ĝi estas tre intuicia nun legi. Kaj se mi faras zorgas kio estas sube la kapuĉo, lasu min rulumi malsupren. Kaj ĝi estas iom timiga komence, speciale se tio ĉi estas via unua programo, sed ni rigardu. Mi ne plu dirante, malplenon, ĉar ĝi rezultas funkcioj, multe kiel GetString, povas resendas valoron por mi. Ili ne nur devas presi al la ekrano, ili povas reale transdoni mi ion reen. Kaj ke antaŭe PrintName, Mi ne bezonas ion reen. Mi bezonis la kromefikon de io aperanta sur la ekrano, sed mi ne bezonis homan transdoni al mi ion reen. Tie, kun GetPositiveInt, kiel kun GetInt, Mi volas esti enmanigis ion reen. Do mi diras ne, malplenon, sur linio 23, sed int, kiu diras, ĉi tiu funkcio ke mi estas skribanta, nomata GetPositiveInt tuj transdonu min denove entjero, nenio, Ne malplena. Dume, ĝi estas tuj prenos neniu enigoj, tiel mi, ia, inversigis ĝin. Mi ne donante GetPositiveInt ajnan enigo, mi volas ĝin doni al mi sian produktadon. Kaj tiam kio okazas nun? Do jen kiel mi povas deklari variablon. Mi jam faris ekster la buklo, pro kialoj ni eventuale vidi, sed ĉi nur donas mi 32 bitoj nomis, n, kaj mi jam antaŭ- determinanta ili stoki entjero. Kaj jen tio, do dum konstrukcio, kaj tio estas kial ĝi estas utila. Laŭvorte fari tion, dum n estas malpli ol 1. Do ni vidu kio okazas. Mi presi, bonvolu donu al mi pozitiva int. Mi tiam ricevas int, uzante CS50 funkcii kaj stokitaj en n. Kaj tiam, kion linio de kodo probable gets ekzekutita sekva, logike? Kiun linion nombro? Jes, do 31. Vi ne scias tion ĝis vi Oni diris aux ia konkludi ĝin, sed tio estas vera. Ĝi iras supre sube kaj tiam tenas ripetante. Do se mi tajpis en ekzemple, la nombro negativa 1, estas n malpli ol 1 negativaj? Yeah. Ĉar negativa 1 estas malpli ol 1. Do kio estos? Mi tuj faros tiun dum n estas malpli ol 1, do mi tuj reiri al linio 28. Kaj ĉiu time-- kaj ni kuros this-- faras funkcio 1 kompili ĝin, kaj nun dot oblikvo funkcio 1. Se mi tajpas negativa 1, estas tuj daŭre kriante al mi ĝis mi kunlaboras ĉar ĉiu de miaj enigoj estas malpli ol 1 kaj se ĝi estas dum malpli ol 1, Mi tuj daŭre fari tion. Se mi fine doni nombro kiel 50, dankeme, ĝi diras, dankon pro la 50. Kial? Ĉar kiam n estas ne malpli ol 1, ĉesas akiranta senmoviĝita en tiu ciklo, kaj tiu nova ŝlosilvorto hodiaŭ, reveno, laŭvorte faras tion. Do mi ĵus implementado, en senco, la ekvivalento de GetString, kie mi disdonanta al kiu uzas min, iu valoro. Ĝi ne devas esti kordo, ĝi estas int. Do simpla, rapida ekzemple, sed ni baldaŭ vidi iujn pli malnaiva versioj ankoraŭ. Fakte, ni prenu rigardu numera unu, nomata return.c. Kaj ĉi tiu estas reale iom simpla. Do tiu programo la celon en vivon, ni kompilos kaj kuras ĝi, Tiel faro reveno, punktas oblikvo, return-- avizo la programo simple kuboj la valoro 2. Ĝi estas sufiĉe stulta, estas malfacile kodo, ĝi ne prenas ajnan enigoj, sed jes pruvi alian funkcion kiu mi skribis mem. Do jen, mi deklaris al variablo, nomita x, de tipo int, egala al la numero 2, tute arbitra. Tio estas nur kelkaj lanugaj printado. Ĝi diras x estas nun, tia kaj tia, cubing dot dot dot. Kaj la magio estas ŝajne en linio 21. Mi vokas funkcio nomita, kubo, Mi transdonis gxin paperfolion kun la numero 2 skribita sur ĝi, kaj kio valoro, matematike, mi volas eliri el ĝi? Kiel prudento ĉeko? 8. Dekstra? Mi volas 2 Cubed reen, 2 al la potenco de 3, do 8 reen. Do kie estas kubo implementado? Nu, rimarki ĝi estas implementado tie. Kaj samkiel antaŭe, logike, kvankam la sintakso estas probable tre nova por multaj de vi, Mi volas tiun funkcion transdoni al mi reen folio de papero kun int sur ĝi. Do mi havas int, la nomo estas arbitre, sed oportune nomita kubo. La enigo al ĝi, estas n de tajpi entjero, do tio estas kiel mi povas pasi en la kvanto 2 sur paperfolion. Kaj tiam ĝi rezultas C apogoj math, tial vi ne devas x-ojn por tempoj, vi nur uzu la asterisko por multipliko. Kaj tiu revenas n × n fojojn n, kiu estas simple Cubed valoro. Do kie ni iras kun ĉio ĉi? Tiu estas definitive ventego turneo, ripozi certigita, ke en la super sekcioj kaj en problemo starigis 1, vi estos promenis tra ĉiuj ĉi des pli. Kaj en problemo starigis 1, ni transiro el la grafika mondo de Scratch al io pli komandlinio en C. Sed ni inspiriĝi de ĉi tie ludo el pasintaj tempoj, kio uzante C kaj la normeldono de la p aro vi efektivigu Mario piramido. Kaj en la hacker eldono de la p aro, se vi tiel elektas elektito, vi efektivigos iom pli defianta piramido kun du pintoj. Vi ankaŭ implementar algoritmo, avida algoritmo. Ĝi rezultas tie estas iuj interesaj logiko malantaŭ la procezo de kuranta kasisto stacio kaj fakte disdonanta iu reen ŝanĝo. Tie estas algoritmo kiu estas sufiĉe simpla, ke vi eble eĉ kompreni intuicie kiam vi unue legi it-- rimarki ke pri tio mi ĉiam farita iam mi donis iun iuj mono back-- kiu permesas ĉiam minimumigi la nombron de papero notoj aŭ metalaj moneroj ke vi disdonanta reen al la uzanto. Kaj tio, kompreneble, estas konvinka ĉar se vi iros al CVS aŭ whatnot, vi ne volas esti handed tuta amaso de aĵoj aŭ tutan faskon da pencoj. Vi volas la plej malmultaj moneroj, probable, ebla. Fine, vi ankaŭ esti defiita dabble en la mondo de akvo kaj reale preni dankeco por surĵeto inter tarifoj de fluo, de ŝati, akvo en duŝejo, nur kiom akvo estas uzata. Kaj la aludo en ĝi, Estos ĉi klipo tie, kiun ni finos dum nur 60 sekundoj, kiuj pentras portreton de malalta fluo duŝo kapojn. [VIDEO reprodukto] -All Pravas. Mi ĉion ĉi tie. Mi ekhavis la Ciklono F Serio, Hydra, Jetflow, Stokholmo Supersteam, io ajn. -Kaj Kion vi rekomendas? -Kion Vi serĉas? -Power Viro. Potenco. Komenius Silkwood. -Tio Estas por radiado. -Tio Pravas. -Now Kio estas tio? -Tio Estas la Comando 450. Mi ne vendos tiu. -Sed Tio estas kion ni volas. Estas comando 450. -No Kredi min. Ĝi estas uzata nur en la cirko. Ĝi estas por elefantoj. -I'll Pagi nenion. -Kio Pri Jerry? -Li Ne povis manipuli tion. Li estas dorlotata. Oh yeah. [FINO reprodukto] DAVID J Malan: Bone. Tio se por CS50. Ni vidos vin proksima semajno. Parolanto 1: [? Scully?], [? Ian,?] ĝis ĉi outro projekto, Kion vi uloj elpensi? Parolanto 2: Nu, ni donita ĝi vario de penso, kaj ni pensas ke la plej bona maniero to-- Parolanto 3: May I? Parolanto 2: Yeah. Por supozita, fakte. Parolanto 3: Do mi pensas Ni povas resumi nia ideo por la outros kun unu word-- nenion. DAVID J Malan: Nenio? Parolanto 3: Nenio. DAVID J Malan: Kion tio signifas? Parolanto 3: La outros cxirkauxas nenion. Parolanto 2: Nu, mi volas diri, en filozofio, Mi volas diri, nenio estas ĉiam io. Parolanto 1: Do what's-- kio estas la premiso? Parolanto 3: Do estas kiel vivo. OK. Kion vi faris hodiaŭ? DAVID J Malan: mi leviĝis, devis matenmanĝon, kaj venis labori. Parolanto 3: Tio estas outro. Parolanto 2: Sed, mi volas diri, ĉu ne io okazus al li sur the-- Parolanto 3: Ne, ne, ne, ne. Nenio okazas. Parolanto 1: Do kial ni rigardas? Parolanto 3: Pro ĝi estas outro por CS50. DAVID J Malan: Ankoraŭ ne.