[MUZIKO ludi] DAVID J Malan: Bone, bonvenigas reen al CS50. Ĉi tiu estas la komenco de semajno du. Vorto de unu el niaj amikoj sur campus - se vi interesiĝas, eble, ĉu nun aŭ en iu futura termino inkluzive, unufoje pli komforta, instruado meza lernejo lernantoj iom ion pri komputiko, do kapo por ke URL. Ili estas en aparta bezono nun el instruistoj, aparte se vi havas havis iun ekspozicion al komputiko. Do memoru ke lasta fojo, ni enkondukis kelkaj datumtipoj en C, kaj vi eble jam komencis ricevi manoj malpuraj kun ĉi tiuj ĝis nun en problemo starigis unu. Kaj ni havis char. Do iom teknika terminoj, kion Estas char kiel vi scias ĝin hodiaŭ? Do ĝi estas karaktero, sed ni esti pli preciza nun. Kion ni celas per karaktero aŭ individuaj char? Ne-nombra karaktero - tial ne nepre. Rezultas, ke eĉ nombroj, eĉ interpunkcio kaj leteroj estas reprezentitaj kun ĉi datumoj tajpi konata kiel char. Do ĝi ne estas nepre alfabeta. Jes? Do ĝi estas Askio karaktero. Do, se vi opinias reen al semajno nulo, kiam ni havis nian bajto de volontuloj venu, kaj ĉu teni siajn manojn supren aŭ ne ĉiuj, ili reprezentis bitoj. Sed kolektive kiel grupo de ok, ili reprezentis bajto. Kaj ni enkondukis la nocion de Askio en tiu prelego, kiu simple estas surĵeto inter numeroj kaj literoj. Kaj ASCII uzojn, kiel tiuj homoj implicita, ok bitoj por reprezenti karaktero. Do laŭe, se ok bitoj povas ĉiu prenos sur unu el du valoroj - nulo aŭ unu - tio signifas estis du ebloj por tiu persono - nulo aŭ unu - du por tiu persono, du por tiu persono, du por ĉi tiu. Do tuta de du fojojn du fojoj du fojojn du fojojn du - tial du la oka en entute. Do tie estas tuteca nombro de gravuloj 256 ebla ke vi povas reprezenti kun ok bitoj. Nun, tiuj el vi, kiuj parolas Azia lingvoj sciu, ke ekzistas pli karakteroj en la mondo ol nur Kiel kaj Bs kaj Cs kaj Ds. Kaj efektive, ASCII ne suficxos, multe da lingvoj de la mondo. Sed pli sur tiu alia tempo. Por nun, sciu ke en C, se vi volas por reprezenti leteron, peco de interpunkcio, aŭ simple ion karaktero en la naturo, ni uzas char. Kaj estas unu bajto aŭ ok bitoj. Kion pri int? Nu, oni int estas entjero. Kiom da bitoj, se vi memoras, Estis entjero tipe? Ĉiu revokon? Do estas tipe 32. Ĝi fakte dependas de la komputilo ke vi uzas. Sed en la aparato, kaj en multaj komputiloj, estas 32 bitoj aŭ kvar bajtoj - ok fojoj kvar. Kaj ints estas nur uzita por stoki nombroj, aŭ negativa, pozitiva, aŭ nulo. Kaj se vi havas 32 bitojn kaj vi nur zorgo pri pozitivaj nombroj, povas iu stadio kiom ebla entjeroj a komputilo povas reprezenti de nulo plu supren? Do ĝi estus du al la 32, kiu estas proksimume kvar mil milionoj. Do tiuj potencoj de du tuj estos _recurring_ temoj en komputiko. Kiel ni vidos, ili estas tute konvena labori kun eĉ se ĝi ne estas sufiĉe facile fari la matematiko en ies kapon. Do ni diru proksimume kvar mil milionoj. Nun, longa tempo - vi povas speco de konjekton. Ĝi estas pli longa ol int. Kiom da bitoj? Do 64 bitoj aŭ ok bajtoj. Tiu signifas nur ke oni povas reprezenti eĉ pli grandaj nombroj, pli granda pozitiva aŭ pli granda negativaj nombroj. Kaj kion pri flosi? Tio estas glitpunktaj valoro de 32 bitoj. Ĉi tio estas nur reela nombro, iu kun dekuma punkto. Sed se vi anstataŭ bezonas pli da lokoj post la dekuma punkto aŭ vi volas reprezenti pli granda nombro kun iuj frakcio post ĝi, vi povas uzi duobla, kiu estas 64 bitoj. Sed estas interesa takeaway tie. Do se ints estas limigitaj de 32 bitoj kaj eĉ longe sopiras estas limigitaj de 64 bitoj, ke ia petegas la demando, kion se vi efektive volas rakonti pli alta ol 4 miliardoj por int? Nu, simple uzu longa longa. Sed kion se vi volas rakonti pli altaj ol du al la 64-a, donu aŭ preni? Nun, tio estas grandega nombro. Sed eventuale, vi povus reale zorgas pri tiuj specoj de valoroj, speciale se vi uzas datumbazon kaj komencas kolekti partoj kaj multaj kaj multe da datumoj kaj atribuante unika nombroj al ĉiu peco de tiu datumo. Do ni ia havas problemon. Kaj simile, kun flosanta punkto valoroj - flosas aŭ duobloj - se vi nur atingis finia nombro de bitoj, kiom da tutaj nombroj vi povis eble reprezentas? Nu, estas malpli klara, kiam vi engaĝi dekuma punkto. Sed estas certe finia. Se vi havas finia nombro de bitoj, finia nombro de homoj, finia numeron de ampoloj, verŝajne vi povas nur reprezentas finia nombro de glitpunktaj valoroj. Sed kiel multaj reelaj nombroj estas ilia en la mondo? Tie estas malfinia. Do jen speco de problemo ĉar ni ne havas malfinian kvanton de memoro aŭ RAM ene de niaj komputiloj. Do iuj defia aferoj povas okazi. Do ni iru antaŭen kaj provu por esprimi ĉi tie. Lasu min kaj malfermu gedit. Mi tuj iros antaŭen kaj konservi dosieron nomita "floats0.c" nur esti konsekvenca kun ekzemplo, kiu estas disponebla en linio, se vi ŝatus. Kaj mi tuj iros antaŭen kaj difinas jene - Mi tuj iros antaŭen kaj diru, int ĉefa malplena, kiel ni ofte faras. Kaj tiam en tiu programo, mi tuj deklaras min kaleŝego, do ĉirkaŭ 32 bitoj variablo nomis f, arbitre. Kaj poste mi iros por stoki en ĝi Mi ne scias, unu dekono, do 0,1. Do mi iros por esprimi ke kiel unu dividita per 10, kiu estas perfekte legitima en C. Kaj poste sur la dua linio, mi simple volas elprinti tiun valoron. Do memoru, ke ni povas uzi la familiara printf. Ni ne volas uzi% i por int. Ni volas uzi% f por kaleŝego. Kaj poste mi iros fari backslash n, proksime citaĵo, komo, f, punktokomo. Do jen mia programo. Ekzistas jam unu cimon. Ĉu iu por kiu ĉi klakis jam volas atentigi almenaŭ unu cimon mi faris? Jes? Jes. Mi forgesis "# include" en la supro, ili simptomo ke se mi penas kompili tiun tuj esti, ke la tradukilo tuj krias al mi, dirante nedefinita simbolo aŭ ion pri tio. Ĝi ne komprenas ion ŝatas printf. Do mi tuj faru "# include ", Savu la dosieron. Kaj nun ĝi estas en pli bona formo. Sed mi ankaŭ tuj atentigi el unu novan detalon hodiaŭ. Krom preciziganta loko posedantoj kiel% f% i% s, vi povas foje influas la konduton de tiu lokokupilo. Ekzemple, en la kazo de flosanta punkto valoron, se mi nur volas por montri unu decimala loko post la periodo, mi efektive povas fari 0.1f. Do alivorte, mi disigi la f kaj la procento signo kun 0.1, nur dirante al printf, vi eble havas tutajn faskon da numeroj post la dekuma atentigi min. Sed mi nur volas vidi unu el ili. Do mi tuj iros antaŭen nun kaj savos tiun programon, iru en mian stacio fenestro, kaj mi iros por antaŭeniri kaj tipon fari float 0, eniru. Mi vidas ke iom kamufla linio kiu komencos fari pli sentita kiel ni turmentus ĝi apartigas tiun semajnon kaj apud. Nun mi tuj iros antaŭen kaj kuri float nulo. Kaj, malbenita. Do tie estas alia cimo tie ial. Mi sufiĉe certas, ke unu deka, aŭ unu dividite per 10, ne estas 0.0. Eble mi simple ne rigardis ĉe sufiĉe ciferoj. Do kial ne mi diras du .2 vidi du decimalaj anstataŭ nur unu. Lasu min reiri al mia fina fenestro tie kaj batis supren kelkaj fojoj vidi mian historion. Ĉu fari flosi nulo denove, kaj poste supren denove. Kaj nun eniri. Kaj nun mi sufiĉe certas ke tiu estas malbone. Kaj mi povis fari tri kaj kvar, kaj mi estas probable tuj daŭre vidas nuloj. Do kie estas la cimo? Unu dividite per 10 devus esti 0.1. Iu volas preni ponardi je kio la fundamenta demando estas? Jes? Ili ambaŭ estas entjeroj. Do kio? Do kun unu dividite per 10, kiu estas kion mi faras en aritmetiko. Kaj mi alvenas 0.1. Jes. Kaj tiel estas ĝuste tiu temo. Kiam vi prenos entjero en komputilo kaj vi dividu per alia entjero, la komputilo defaŭlte tuj supozu ke vi volas entjero. La problemo kvankam, kompreneble, estas ke 0,1 ne estas entjero. Estas vera nombro. Kaj do kion la komputilo faras por implicite estas nur ĵetas for ĉion post la dekuma punkto. Ĝi ne rondigi malsupren aŭ supren per si mem. Ĝi simple ĵetas for ĉio post la dekuma punkto. Kaj nun, ke havas sencon. Ĉar nun ni estas klare maldekstra kun nulo. Sed atendu momenton. Mi ne vidante int nulo. Mi reale vidi 0.00. Do kiel mi repacigi ĉi nun? Se unu dividite per 10 estas nulo, sed mi vidante 0.00, kie ĝi ricevas konvertiĝis al reela nombro? Jes. Ekzakte. Do ĝis ĉi tie en linio kvin, kiam mi vere stoki ke 0,1, kiu estas tiam Senpintigita al nulo, ene de kaleŝego, tio estas efektive ekvivalenta al stoki ĝin ne kiel int sed, ja, kiel flosas. Cetere, mi tiam uzanta printf al eksplicite presi tiu numero du decimalaj kvankam tie eble ne vere esti ajna. Do ĉi tiu speco de sucks, ĉu ne? Ŝajne vi ne povas fari matematikon, almenaŭ je tiu nivelo de precizeco, en komputilo. Sed certe ekzistas solvo. Kio estas la plej simpla fix ni povus eble fari, eĉ nur intuicie tie solvi tion? Jes? Turnu la entjeroj en - yeah. Eĉ se mi ne tute certa kio estas vere okazas tie, se tio fundamente devas vidi per tiuj ambaŭ esti ints, bone, kial ne mi fari ke 10.0, farante tiun 1.0, resave la dosiero. Lasu min reiri malsupren al la fundo kaj recompilar. Permesu al mi rerun. Kaj tie - nun, mi havas mian unu dekono reprezentita kiel 0.10. Ĉio bone. Do tio ne estas malbona. Kaj lasu min atentigi unu alia maniero Ni povis esti solvita ĉi. Permesu al mi efektive ruliĝas en la tempo al kiam ni havis tiun kiel unu deka antaŭ momento. Kaj lasu min antaŭeniri kaj resave tiun dosieron kiel malsama dosiero nomo, nur por havi iom kontrolpunkto. Do kiu estis versio unu. Kaj nun lasu min iri antaŭen kaj fari pli versio. Ni nomas tiun versio du nulo indeksita. Kaj mi tuj anstataŭ fari tio - vi scias kion? Aldonante skalara nulo laboras en tiu kazo. Sed supozu unu estis variablo. Supozita 10 estis variablo. En aliaj vortoj, supozu, ke mi ne povis nur malmola-kodo .0 fine de tiu aritmetika esprimo. Nu, mi povas vere ion fari en krampoj nomata malplenigita. Mi povas jxeti ke entjero 10 al kaleŝego, kaj mi povas jxeti ke entjero unu al flosi, tiel. Tiam la math ke tuj farenda estas efektive 1.0 dividita de 10.0, la rezulto de kiu eliras en f kiel antaŭe. Do se mi recompilar tion kiel fari flosas 2, kaj nun flosas 2, mi ricevas la saman respondi, ankaŭ. Do ĉi tiu estas sufiĉe elpensita ekzemplo, por solvi tiun problemon per prezentanta fandon. Sed ĝenerale, fandon Iĝos potencan aferon, aparte por problemo starigis du en semajna tempo, kiam vi volas konverti unu datumtipo al alia ke fine de la tago estas reprezentitaj en la sama maniero. Je la fino de la tago, ĉiu unuopa kion ni parolis pri tiel for estas nur ints sub la kapuĉo. Aŭ se tio estas tro malalta nivelo por vi, ili estas nur nombroj sub la kapuĉo. Eĉ karakteroj, denove, rememoran de semajno nulo, estas la numeroj sub la kapuĉo. Kiuj estas, ni povas konverti inter malsamaj tipoj de nombroj se ili estas simple bitoj. Ni povas konverti inter nombroj kaj literoj se ili estas nur bitoj, kaj inverse. Kaj malplenigita en ĉi tiu maniero estas mekanismo en programado kiu permesas perforte ŝanĝi unu datumtipo al alia. Bedaŭrinde, ĉi tiu ne estas tiel simpla kiel mi povus ŝatis. Mi tuj iros returne en flosoj 1, kiu estis la pli simplaj, pli simpla kun .0 Aldonataj al ĉiu. Kaj ĝuste kiel rapida aktualigo, lasu min antaŭeniri kaj recompilar tiu, fari flosas 2 - sorry, ĉi tiu estas fari flosas 1. Kaj nun ni kuras flosas 1. Kaj en la fundo, rimarki ke mi ja ricevas 0,1. Do, problemo solvita. Sed ankoraŭ ne. Mi nun tuj akiri iom stranga, kaj mi tuj reiri en mian printf deklaron kaj diru, vi scias kion? Mi ŝatus konfirmi ke tiu Estas vere unu dekono. Kaj mi tuj volas vidi ĉi al, ni diru, kvin dekumaj lokoj. Tio ne estas problemo. Mi ŝanĝas la du al kvin, Mi recompilar kun fari. Mi rerun ĝin kiel flosas 1. Looking sufiĉe bone. Mia prudento ĉekojn povus fini tie, sed Mi ricevas iom pli aventuremaj. Mi tuj ŝanĝos 0,5 al 0,10. Mi volas vidi 10 ciferoj post la dekuma loko. Kaj mi tuj iros antaŭen kaj recompilar ĉi tio kaj rerun flosas 1. Mi specon de bedaŭro esti provita ĉi plu ĉar mia math ne estas tiel korekti plu, ĝi similas. Sed atendu momenton, eble ke estas nur hazardo. Eble la komputilo agas iomete stranga. Lasu min antaŭeniri kaj fari 20 dekumaj punktoj kaj trankviligi min, ke mi scias kiel fari math. Mi scipovas plani. Faru flosas 1, recompilar kaj damn it. Tio estas vere, vere atingi for de la marko. Do kio okazas ĉi tie? Intuicie, bazita sur niaj supozoj pli frue pri la grandeco de datumtipoj, kio devas esti okazas ĉi tie sub la kapuĉo? Jes? Ekzakte. Se vi volas ĉi multan precizecon, kaj tio estas heck de multe da precizeco - 20 numeroj post la dekuma punkto. Vi ne povas eble reprezentas arbitran numeron krom se vi havas arbitra nombro de bitoj. Sed ni ne faras. Por kaleŝego, ni nur havas 32 bitojn. Do, se 32 bitoj nur povas permutita en maniero - nur kiel niaj homoj en, etapo manojn supren aŭ malsupren - en finia nombro de manieroj, estas nur finia nombro de reelaj nombroj povas reprezenti kun tiuj bitoj. Kaj tial la komputilo finfine tuj devas komenci tranĉante anguloj. La komputilo povas kaŝi tiuj detaloj de ni por iomete da tempo. Sed se ni komencos ŝovas en la numeroj kaj rigardante pli kaj pli en la trenante nombroj en la tuta nombro, tiam ni komencas vidi, ke ĝi estas fakte aproksimanta la ideo de deka. Kaj tiel rezultas, tragike, estas malfinia nombro de nombroj ni ne povas reprezenti ĝuste en komputilo, almenaŭ kun finia nombro de bitoj, finia kvanto de RAM. Nun bedaŭrinde, ĉi foje havas en reala mondo konsekvencoj. Se homoj ne sufiĉe estimi tiun aŭ speco de preni por donita la fakto ke ilia komputilo nur faru kion ili diros ĝin fari kaj ne komprenu tiujn suba reprezento detaloj - kiu, sincere, en iuj lingvoj estas kaŝita de la uzanto, kontraste en C - iuj malbonaj aferoj povas okazi. Kaj kion mi pensis ke ni farus estas doni retropaŝon. Kaj jen estas proksimume ok-minuta video. Ĝi elsendis kelkajn jarojn antaŭe, kaj ĝi donas enrigardojn en fakte kio povas iri erara kiam oni sub-taksi tiujn specojn de detaloj en la tre ĉiuj tro reala mondo. Se ni povus dim la lumoj dum kelkaj minutoj. Parolanto 1: Ni nun revenu al inĝenierio katastrofoj en Moderna Mirindaĵoj. World - ni ĉiuj venas por akcepti la ofte frustra problemoj kiu iras kun ili. Cimojn, virusoj, kaj programaro glitches estas malgrandaj prezoj por pagi la komforto. Sed en alta teknologio kaj alta rapido milita kaj spaca programo aplikoj, la plej malgranda problemo povas glorata en katastrofo. 4 de junio de 1996, sciencistoj pretas ĵeti senpilotaj Ariane 5 raketo. Ĝi portis sciencaj satelitoj desegnita por establi precize kiel la tera magneta kampo interagas kun sunaj ventoj. La raketo estis konstruita por la Eŭropa Spaca Agentejo kaj levis el inter lia facileco sur la marbordon de Franca Gviano. JACK GANSSLE: Je ĉirkaŭ 37 duaj en la flugo, ili unue rimarkis io iris malbone. La cigaredingoj estis swiveling en maniero ili vere ne devus. Ĉirkaŭ 40 sekundoj en la flugo, klare la veturilo estis en premo. Kaj tio estas, kiam ili faris decido por gxin pereigi. La gamo sekureco oficiro, kun terura intestoj, premis la butonon, eksplodigis la raketo antaŭ ol ĝi povis igi danĝeron por publika sekureco. Parolanto 1: Ĉi tiu estis la unua vojaĝo de la Ariane 5, kaj lia detruo okazis pro difekto enigita en la raketo de programaro. JACK GANSSLE: La problemo de la Ariane estis, ke tie estis numero kiu postulis 64 bitojn por esprimi. Kaj ili volis igi al 16-bita nombro. Ili supozis, ke la nombro neniam estis tuj estos tre granda, ke la plimulto de tiuj ciferoj en la 64-bitan nombro estis nuloj. Ili estis erara. Parolanto 1: La nekapablo de programaro programo por akcepti la speco de numeron generitaj per alia estis ĉe la radiko de la fiasko. Softvaro disvolviĝo fariĝis tre peniga parto de nova teknologio. La Ariane 4 raketo estis tre sukcesa, tiel de la programaro kreis por ĝi estis ankaŭ uzata en la Ariane 5. Philip Coyle: La baza problemo estis ke la Ariane 5 estis pli rapida, akcelis pli rapida. Kaj la programaro ne havis konsistigis tion. Parolanto 1: La detruo de la raketo estis granda financa katastrofo, ĉiuj pro minuto programaro eraro. Sed tio ne estis la unua fojo datumoj konvertiĝo problemoj estis plagita moderna raketo teknologio. JACK GANSSLE: En 1991, kun la komenco de la Golf-Milito, la Patriot misilon spertis similan speco de nombro konvertiĝo problemo. Kiel rezulto, la 28 usonaj soldatoj estis mortigitaj kaj ĉirkaŭ 100 aliaj vunditaj kiam la Patriot, kiu estis supozita protekti kontraŭ venonta scuds, malsukcesa pafi misilo. Parolanto 1: Kiam Irako invadis Kuvajton kaj Ameriko ĵetis Dezerta Ŝtormo en frua 1991, Patriot misilon piloj estis deplojitaj por protekti Saŭda Arabio kaj Israelo de iraka Scud misilon atakoj. The Patriot estas usona duona atingo surfaco-sistemo de aero fabrikita de la Raytheon kompanio. Theodore POSTOL: La grandeco de la Patriot interceptor mem estas krude 20-metrojn longa. Kaj pezas ĉirkaŭ 2000 funtojn. Kaj portas kapon de ĉirkaŭ - Mi kredas ke estas proksimume 150 funtoj. Kaj la kapo sin estas alta eksploda kiu havas fragmentoj ĉirkaŭ ĝi. La envolvaĵo de la kapo estas desegnita agi kiel Buckshot. Parolanto 1: La misiloj estas plenumataj kvar po ujo kaj estas transportitaj per duone trailer. Philip Coyle: The Patriot kontraŭ misiloj Sistemo superas almenaŭ 20 jaroj. Ĝi estis origine desegnita kiel aera defendo misilon al malkonstrui malamiko aviadiloj. En la unua Milito de la Golfo, kiam tiu milito venis kune, la Armeo volis uzi ĝin pafi malsupren scuds, ne aviadiloj. La iraka aerarmeo ne estis tiel de problemo. Sed la armeo estis maltrankviligita scuds. Kaj tiel ili provis ĝisdatigi la Patriot. Parolanto 1: Interceptor malamiko misilon vojaĝante al mach kvin estis tuj estos defiante sufiĉas. Sed kiam la Patriot estis enkuris servo, la armeo ne estis konscia de Iraka modifo kiun faris lia Scuds preskaŭ neeble por bati. Theodore POSTOL: Kio okazis estas la scuds kiuj estis venon estis malstabila. Ili estis wobbling. La kialo de ĉi tiu estis la irakanoj, en Por akiri 600 kilometroj el 300-kilometro atingo misilo, prenis pezo de la antaŭa kapo. Ili faris la kapo pli malpeza. Do nun la Patriot estas klopodi veni en la Scud. Kaj la plejparto de la tempo, la blindiga plimulto de la tempo, ĝi estus nur flugi por la Scud. Parolanto 1: Kiam la Patriot sistemo operatoroj realigis la Patriot missed lia celo, ili detonado la Patriotoj kapon por eviti eblajn viktimojn se ĝi estis permesita fali al la tero. Theodore POSTOL: Tio estis kio plej popolo vidis tiel grandaj buloj de fajro en la ĉielo kaj miskomprenita kiel haltig survoje de Scud kapoj. Parolanto 1: Kvankam en la nokto ĉielojn Patriotoj ŝajnis esti sukcese detruante scuds, ĉe Dhahran tie povus esti eraro pri ĝia agado. Tie, la Patriota la radaro sistemo perdis spuri de venontaj Scud kaj neniam lanĉita pro programaro difekto. Ĝi estis la israelanoj kiuj unue malkovrita ke la pli longa la sistemo estis, des pli granda la tempo diferenco igis pro horloĝo enigita en la sistemo de komputilo. JACK GANSSLE: Pri du semajnoj antaŭ la tragedio en Dhahran, la israelanoj raportis al la defendo Fako ke la sistemo estis perdi tempon. Post ĉirkaŭ ok horoj de kuri, Ili rimarkis, ke la sistemo estas igante rimarkinde malpli preciza. La defendo Fako Respondis dirante al ĉiuj de la Patriot piloj por ne lasi la sistemoj on por longa tempo. Ili neniam diris kio longa tempo estis. Ok horojn? 10 horoj? 1.000 horoj? Neniu sciis. Parolanto 1: The Patriot pilo lokitaj en la kazerno ĉe Dhahran kaj lia misa interna horloĝo estis sur pli ol 100 horojn en la nokto de Februaro 25a. JACK GANSSLE: Ĝi spuris tempo al precizeco de ĉirkaŭ dekono de sekundo. Nun, dekono de sekundo estas interesa nombro ĉar ĝi ne povas esti esprimita en duuma precize, kion signifas ĝi ne povas esti esprimita akurate en ajna moderna cifereca komputilo. Estas malfacile kredi, sed uzi tion kiel ekzemplon. Ni prenu la numero unu triono. Unu triono ne povas esti esprimita en dekuma ĝuste. Tria estas 0,333 irante on por malfinio. Ne estas maniero por fari tion kun absoluta precizeco en dekuma. Tio estas ĝuste la sama tipo de problemo kiu pasis en la Patriot. Ju pli longe la sistemo kuris, la plej malbona la tempo eraro fariĝis. Parolanto 1: Post 100 horoj de funkciado, la eraron en la tempo estis nur ĉirkaŭ triono de sekundo. Sed en terminoj de celado misilon vojaĝante al mach kvin, ĝi rezultigis de spuras eraro de pli ol 600 metroj. Estus fatala eraro por la soldatoj ĉe Dhahran. Theodore POSTOL: Kio okazis estas Scud ĵeto estis detektita de frua averto satelitoj. Kaj ili eksciis, ke la Scud venis en lia ĝenerala direkto. Ili ne scias, kie ĝi venas. Parolanto 1: Nun estis ĝis la radaro komponanto de la Patriot sistemo defendi Dhahran lokalizi kaj observu spuri de la venonta malamiko misilo. JACK GANSSLE: La radaro estis tre inteligenta. Estus vere spuri la pozicio de la Scud kaj poste antaŭdiri kie probable estus la proksima fojo la radaro sendis premas eksteren. Kiu nomis la gamo pordego. Theodore POSTOL: Tiam tuj la Patriot decidas sufiĉa tempo pasis iri apogi kaj kontroli la venonta loko por ĉi detektita objekto, ĝi superas. Do kiam reiris al la malĝusta loko, do ne vidas objekto. Kaj decidas ke ne estis objekto, ĝi estis falsa detekto, kaj delasas la relo. Parolanto 1: La venonta Scud malaperis de la radaro ekrano, kaj sekundoj poste frapis en la fortikajxon. La Scud mortigis 28 kaj estis la lasta pafita dum la Golf-Milito. Tragike, la ĝisdatigita programaro alvenis ĉe Dhahran la sekva tago. La programaro difekto estis riparita, fermante unu ĉapitro en la tumulta historio de la Patriot misilo. Patriot estas fakte acrónimo por forigita array Spurado Interkapti De Target. DAVID J Malan: Bone, do aleccionadora Ekzemple, por esti certa. Kaj feliĉe, tiuj malsupera nivelo cimoj ne estas iu kiun ni instruos vin tipe devas estimi, certe Ne kun iuj de niaj plej fruaj de programoj. Pli ĝuste, la plimulto de la cimoj vi instruos vin renkonto estos logika en la naturo, sintaksa naturo per kiu la kodo simple ne funkcias bone. Kaj vi scias ĝin sufiĉe rapide. Sed aparte kiam ni atingos la Fine de la semestro, ĝi tuj fariĝis pli kaj pli de ebleco vere kredas forte pri la dezajno de viaj programoj kaj la suba prezento tie, ankaŭ, de la datumoj. Ekzemple, ni enkondukos MySQL, kiu estas populara datumbazo motoro ke vi povas uzi kun retejoj stoki datumoj sur la dorso fino. Kaj vi devos komenci decidi ĉe Fine de la semestro ne nur kion tipoj de datumoj laŭ ĉi tiuj linioj uzi sed ĝuste kiom da bitoj por uzi, ĉu aŭ ne vi volas konservi datoj kiel datoj kaj tempoj kiel fojojn, kaj ankaŭ aĵoj kiel kiom granda vi volas ke la unika IDs esti por, ni diru, la uzantoj en via datumbazo. Fakte, se iuj el vi havas havis Facebook reprezentas sufiĉe tempo, kaj vi scias kiel akiri aliron al viaj Vikipediisto ID - kiuj kelkfoje aperas en via profilon la URL-krom se vi elektis kromnomo por la URL, aŭ se vi havas uzita Facebook Diagramo API, la publike havebla API per kiu vi povas demandi Facebook por krudaj datumoj - vi povas vidi kion via numera ID estas. Kaj antaŭ kelkaj jaroj, Facebook esence devis ŝanĝi de uzo la ekvivalento de ints uzi longajn longa ĉar la tempo kiel uzantoj venas kaj iru kaj krei multajn kontoj kaj falsa kontoj, eĉ ili tre facile povis elĉerpi iu kiel 4 miliardoj ebla valoro kiel int. Do pli sur tiujn specojn de demandoj laŭ la vojo, kiel bone. Bone, tiel ke estis elpelanta. Tio estis imprecision. Paro de rapidaj anoncoj. Do sekcioj formale komencas ĉi venas Dimanĉo, lundo, mardo. Vi aŭdas per retpoŝto poste tiu semajno pri via sekcio farita. Kaj vi ankaŭ ĉi tie en tiu punkto kiel por ŝanĝi vian sekcio se via horaro nun ŝanĝis aŭ via komforto nivelo nun ŝanĝis. Dume P-aro kaj hacker unu estas pro ĉi ĵaŭdo kun la eblo etendi tiun limdato por la specifoj por vendredo en tipa maniero. Konscii, kiu inkludis la problemon aro specifoj estas instrukcioj kiel uzi la CS50 aparato, fari, tiel kiel iuj CS50 specifaj iloj kiel stilo 50, kiuj povas provizi vin kun sugestoj dinamike en la kvalito de via kodo stilo kaj ankaŭ kontrolu 50, kiuj povas provizi vin per dinamika sugestoj pri via kodo la korekteco. Pardonu, ke ni ankoraŭ gladi el kelkaj Kinks kun ĉeko 50. Kelkaj el viaj samklasanoj, kiuj ne komencos ĉirkaŭ kvar GMT vendredon nokto kiam la spec supreniris rimarkis tiam kelkaj bugs kiu ni laboras tra, kaj pardonpetoj por iu ajn kiu spertis tro frustroj. La kulpo estas mia. Sed ni sekvu sur la CS50 diskuti kiam tiu estas solvita. Do vorto sur partituroj sin. Do estos unu-du semajnoj antaŭ vi komencu akiri reagojn pri problemo aroj ĉar vi ankoraŭ ne havas instruanta ulo. Kaj eĉ tiam, ni komencos pritaksi la C problemo aroj antaŭ ol ni reiru kaj taksi nulo tiel ke vi akiras pli adekvataj sugestoj pli rapide. Sed ĝenerale por la Syllabus, CS50 problemo aroj estas taksitaj laŭ la post kvar aksoj - atingo, korekteco, dezajno, kaj stilo. Medio tuj esti nombro tipe inter nulo kaj kvin kiun kaptas kiom de la peco kiu vin mordis malproksime. Tipe, vi volas ĉi tion al esti kvin. Vi almenaŭ provis ĉion. Kaj rimarki ĝi estas multiplika faktoro tiel ke farante nur parto de la problemo aro ne estas la plej bona strategio. Dume, pli evidenta estas la gravecon de ĝusteco - nur estas via programo korekta kun respekti la specifo? Ĉi tio pezis intence pli forte ol la aliaj du aksoj de faktoro de tri ĉar ni rekonas kiu tipe vi tuj pasigi multe pli da tempo persekutante malsupren iujn cimojn, atingi vian kodon por labori, tiam vi estas blankaj kaj elekti taŭga variablo nomoj kaj la kiel, kio estas ĉe la alia fino de la spektro de stilo. Tio ne estas diri stilo ne estas grava, kaj ni prediki ĝin tempo ambaŭ en prelegoj kaj en sekcioj. Stilo raportas al la estetiko de via kodo. Ĉu vi elektis bone nomita variabloj ke estas mallonga sed iom priskriba? Ĉu via kodo dentado kiel vi vidis en prelego kaj en maniero konsekvenca kun stilo 50? Laste estas dezajno dekstra tie en la mezo. Dezajno estas la pli malfacila unu meti fingro sur ĉar ĝi estas multe pli subjektiva. Sed estas eble la plej grava de la tri aksoj en terminoj de pedagogia valoro tempo kaj ke ĉi tiu estos la instruado ulo la ŝancon provizi vin per kvalita sugestoj. Efektive, en CS50 eĉ kvankam ni ja havas ĉi tiuj formuloj kaj partiturojn, fine de la tago ĉi tiuj estas tre intence tre malgrandaj siteloj - punkto valoroj inter nul kaj tri kaj nulo kaj kvin. Ni ne provu desegni tre maldelikata linioj inter problemo aroj aŭ inter studentoj sed prefere enfokusigi tiel kiel ni povas sur kvalita, longhand sugestoj, aŭ tajpitaj aŭ parola de via aparta instruado ulo, vi konatiĝi sufiĉe bone. Sed ĝenerale, tiuj estas la pezoj ke la diversaj aksoj havos. Dume, ankaŭ, ĝi valoras tenanta en Forgesu tion vi ne devus supozi, ke tri el kvin estas 60% kaj do proksimume malsukcesi. Tri estas intence destinita al esti ia mezo de la vojo bona. Se vi fariĝas triope ĉe la komenco de la semestro, jen ja signifis esti bona meti komenci. Se vi fariĝas duope, foiroj, estas definitive iun laboron por pagi iom pli da atento, utiligi de sekcioj kaj oficejo horoj. Se vi fariĝas kvarpiede kaj Fives, granda. Sed vere, ni atendas vidi trajektorioj inter studentoj - tre individualizados po lernanto, sed startanta la semestro tie en ia la du al la tri gamo sed finante ĝis ĉi tie en la kvar al kvin gamo. Tio estas kion ni vere serĉas. Kaj ni memoru la delta ke vi eksponi inter semajno nulo kaj semajnon 12 kiam mi faras notoj. Ne gravas al ni absolute kiom vi ĝuste komence se via trajektorio estas ja supren kaj forta. Akademia honesteco - do mi metis sur mia pli serioza voĉo por nur momento. Do tiu kurso havas la distingon de sendi pli da studentoj ol iu ajn alia en la historio por la anonco tabulo, mi kredas. Ni havas ia perdis grafo en ĉi punkto de kiom ofte tio okazas. Kaj tio ne estas ĉar studentoj en 50 Estas neniu pli malhonesta ol iliaj samklasanoj aliloke. Sed realigi, ankaŭ, ke ni estas tre bona ĉe detekti ĉi tia afero. Kaj tiu estas la avantaĝo ke komputiko klaso havas en ni povas kaj ni komparu ĉiuj studentoj problemo aroj paro-saĝa kontraŭ ĉiu aliaj, ne nur ĉi tiu jaro sed ĉiuj antaŭaj jaroj. Ni havas la kapablecon, kiel studentoj en la klaso, al Google kaj trovi kodo en lokoj kiel GitHub kaj diskuto forumoj. Estas absolute solvojn al CS50 la p-aroj ŝvebantan tie. Sed se vi povas trovi ilin, ni povas trovi ilin. Kaj ĉio ĉi estas tre aŭtomatigita kaj facila kaj malĝoja por ni trovi. Sed mi volas substreki, ankaŭ, ke la Kompreneble la akademia honesteco politiko estas tre intencis esti tre la malo de tiu spirito. Fakte, ĉi tiu jaro ni _rephrased_ aĵoj en la Syllabus esti ĉi tio, punkto dot dot, kun pli detale en la Syllabus. Sed la komunajn temo en la kurso vere estas esti racia. Ni agnoskas ke ekzistas signifa kvanto de pedagogia valoro en kunlaborante, iugrade, kun samklasanoj, per kiu vi du aŭ vi tri aŭ vi estas pli staris blanka tabulo whiteboarding, por tiel paroli, viaj ideoj - skribo el _pseudocode_ en pentraĵoj, diagramming kio devus esti se Mario vi estis skribi ĝin unue en _pseudocode_. Kio devus la avida algoritmo - kial ĝi kondutas po problemo aroj unu? Kaj tiel rimarkas ke konduto ke ni kuraĝigas estas tre multe kune tiujn liniojn. Kaj en la Syllabus, vi vidos tutan faskon da kugloj sub racia kategorio kaj ne racia kategorio kiu helpas nin helpos vi enpaki vian menson ĉirkaŭ kie ni desegni tiun linion. Kaj ĝenerale, decan regulo de thumb estas ke se vi luktas por solvi iu cimo kaj via amiko aŭ samklasano sidas apud vi, estas racia por vi montros al li aŭ ŝi via kodo kaj diru, hej, vi povas helpi mi diveni kio okazas malĝusta ĉi tie? Ni ne tipe brakumi la kontraŭa flanko. Ĝi ne estas korekta respondo por via amiko aŭ samklasano tie diri, oh, nur rigardi mia kaj figuro ĝin el tiu. Tio estas speco de neracia. Sed havante iun alian, alia cerbo, alia paro de okuloj rigardu via ekrano aŭ rigardi vian kodo kaj diru, ĉu vi certas ke vi volas havi buklo tie? Aŭ ĉu vi certas ke vi volas ke punktokomo tie? Aŭ oh, ke erarmesaĝo signifas ĉi. Tiuj estas tre raciaj kaj kuraĝigis kondutoj. La kazoj, al kiu mi estis aludante antaŭaj boli malsupren al kiam studentoj estas malfrua nokto farante malriĉa juĝo decidoj kaj emailing sian kodon al iu alia aŭ simple dirante: ĉi tie, ĝi estas en Dropbox aŭ Googling malfrua nokto. Kaj tiel mi kuraĝigas kaj petegas de vi, se vi havas tiuj nepra momentoj de streso, vi batigxante supren kontraŭ la limdato, vi ne havas malfrue tago, de kiam ĝi estas jam vendredon en tiu punkto, retposxtu la kurso la kapojn aŭ min rekte. Diru, aŭskultu, mi estas ĉe mia rompi punkto ĉi tie. Ni havi konversacion kaj diveni ĝin. Recurriendo al la reto, aŭ iu alia ne racia konduto neniam estas la solvo, kaj tro da viaj samklasanoj ne plu estas ĉi tie kampuso pro tiu kompatinda juĝo. Sed ĝi estas tre facile jupo tiun linion. Kaj ĉi tie estas iom bildo por gajigi vin el Reddit tiel ke nun ĉiu estos bone. Tiel rapida recap do de kie ni lasis. Do pasintsemajne, memoru ke ni enkondukas kondiĉoj, ne en Scratch sed en C tiu tempo. Kaj estis iu nova sintakso sed vere neniu novajn ideojn per si mem. Ni havis Buleaj esprimoj, ke ni povus aŭ kune kun du vertikalaj stangoj aŭ kaj kune kun du ampersands, dirante, ke tiel la maldekstra kaj la rajto devas esti vera por ĉi ekzekuti. Tiam ni havis ŝaltiloj, kion ni rigardis ĉe mallonge, sed mi proponas estas vere nur malsama sintakso por atingi la sama speco de golo se vi konas en antaŭi kion via kazoj tuj estos. Ni rigardis maŝojn. A por buklo estas eble la plej ofta, aŭ almenaŭ kiu la homo tipe atingi por instinkte. Kvankam ĝi aspektas iom kripta, vi vidos multajn, multajn ekzemplojn de tiu antaŭ longe, kiel vi havas Jam fine de la pasinta semajno. Dum cikloj povas simile atingi la saman aferon. Sed se vi volas fari ajnan incrementation aŭ ĝisdatigon de variablo valoroj, vi devas fari ĝin pli permane ol la por buklo antaŭ permesas. Kaj tiam ekzistas la do-dum buklo, kiu permesas al ni fari ion, je almenaŭ unufoje dum ion alia estas vera. Kaj jen estas aparte bona por programoj aŭ por ludoj, kie vi volas instigi la uzanto por io almenaŭ unufoje. Kaj tiam se li aŭ ŝi ne kunlabori, vi eble volas fari ĝin denove kaj denove. Kun variabloj, dume, ni havis linioj de kodo kiel tiu, kiu povus esti du linioj. Vi povus deklari int nomata vendotablo, punktokomo. Aŭ vi povas simple deklari kaj difini ĝin, por tiel diri. Donu ĝin valoro al la sama tempo. Kaj poste laste, ni parolis pri funkcioj. Kaj tio estis bela ekzemplo en la senso kiu ilustras du tipoj de funkcioj. Unu estas GetString (), kiu, denove, gets ĉenon de la uzanto. Sed GetString () estas speco de interesa, Kiom ni uzis ĝin, ĉar ni ĉiam uzis ĝin kun iun sur la maldekstra flanko de egalsigno. Tio estas ke GetString () redonas valoron. Denove, kompreneble, cxeno. Kaj poste sur la maldekstra flanko, ni estas simple savante ke kordo ene de variablo vokis nomon. Tiu estas malsama, iusence, de printf ĉar printf, almenaŭ en nia uzado ĉi tie, ne revenas nenion. Kiel flanken, ĝi faras reveno ion. Ni nur ne gravas kion ĝi estas. Sed ĝi havas kio estas nomata flanko efekton. Kaj kio estas tiu flanko efekto en ĉiu kazo ni vidis tiel multe? Kion printf fari? Ĝi presas ion al la ekrano, ekranoj teksto aŭ nombroj aŭ iu en la ekrano. Kaj tio estas ĝuste konsiderata kromefikon ĉar ĝi ne vere disdonado ĝin al mi. Ne respondon ene de nigra skatolo, ke mi povas tiam atingi en kaj kroĉi. Ĝi simple fari ĝin sur ĝia propra, multe kiel Colton estis ŝtopita en tiun nigra skatolo pasintsemajne, kaj li iel magie estis desegni sur la tabulo sen mi vere implikitaj. Tio estus kromefikon. Sed se mi efektive devis atingi denove en ĉi tie kaj diru: Ho, jen estas la kordo de la uzanto, ke estus esti reveno valoro. Kaj ĝis nun ni uzas nur funkciojn ke aliaj homoj skribis. Sed ni povas efektive fari tiujn specojn de aĵoj ni mem. Do mi tuj iras en la CS50 aparato denove. Lasu min fermi la langeton ke ni estis malfermita antaŭ momento. Kaj lasu min antaŭeniri kaj krei novan dosieron. Kaj mi tuj iros antaŭen kaj nomas tiun unu positive.c. Do mi volas fari ion kun pozitivaj nombroj tie. Do mi tuj iros antaŭen kaj faru int - sorry - # Include. Ni ne faras tiun saman eraro kiel antaŭe. Int main (void), malfermita krispa streĉa, fermita krispa streĉa. Kaj nun mi volas fari la sekvajn. Mi volas skribi programon kiu insistas, ke la uzanto donas min pozitiva entjero. Do ne ekzistas GetPositiveInt funkcio en la CS50 biblioteko. Estas nur GetInt (). Sed tio estas okej ĉar mi havas la konstruoj kun kiu mi povas postuli iom pli limigo sur tiu valoro. Mi povus fari ion kiel ĉi tio. Do int n - kaj se vi tajpas kune, simple realigi Mi tuj iros tien kaj ŝanĝi iujn aĵojn en momento - tiel int n egalas GetInt (). Kaj tio tuj metos an int ene de n. Kaj lasu min esti pli priskriba. Permesu min diri ion kiel Mi postulas ke vi donu al mi pozitiva entjero. Ĉio bone. Do nur iom da instrukcioj. Kaj nun kion mi povas fari? Nu, mi jam scias de mia simpla kondiĉoj aŭ branĉoj, samkiel mi havis en Scratch, mi povus diri ion kiel se n estas malpli ol aŭ egala al nulo, tiam mi volas fari ion kiel, kiu ne estas pozitiva. Kaj tiam mi povus fari - Bone, sed mi vere volas ke int. Do mi povis iri tien kaj mi povis speco de kopio tiu kaj indent ĉi. Kaj tiam, OK. Do se n estas malpli ol aŭ egala al nulo fari ĉi tion. Nun, kio okazos se la uzanto ne kunlaboras? Nu, tiam mi tuj pruntepreni ĉi tie. Kaj poste mi iros tien kaj tie kaj tie. Do tiu estas klare ne la solvo, ĉu ne? Ĉar ne estas fino en vido. Se mi volas postuli ke la uzanto donas min pozitiva entjero, mi povas reale preni la int. Mi povas do kontroli, ke int. Sed tiam mi volas kontroli ĝin denove kaj kontroli ĝin denove kaj kontroli ĝin denove. Do evidente, kio estas la bona konstrui esti uzanta ĉi tie? Bone, do ia buklo. Do mi tuj forigi de preskaŭ ĉiuj ĉi. Kaj mi volas ricevas tiun int almenaŭ unufoje. Do mi intencis diri do - kaj mi revenos al la dum en nur momento - nun, faru kion? Mi tuj faros int n gets GetInt (). Akcepti. Por ke estas sufiĉe bona. Kaj nun kiom ofte faras Mi volas fari ĉi tion? Permesu al mi metis la printf ene de la ciklo do mi povas postuli denove kaj denove, se bezono esti. Kaj kion mi volas tiun dum kondiĉo por fari? Mi volas daŭre fari ĉi dum kio estas la kazo? Jes. N estas malpli ol aŭ egala al nulo. Do jam, ni signife purigis tiu kodo supren. Ni prunteprenis tre simpla konstrui - la do-dum buklo. Mi ŝtelis nur la gravaj linioj de kodo ke mi komencis kopiante kaj intergluajn, kio ne estis saĝa. Kaj tiel nun mi iros al reale algluota ĝin ĉi tie kaj nur faru tion unufoje. Kaj nun kion mi volas fari en la fino de tiu programo? Mi nur diras, iu simpla kiel, dankon pro la - kaj Mi tion faros% i por int - backslash n, komo, kaj poste kontaktŝtopilo en n, punktokomo. Ĉio bone. Do ni vidu kio okazas nun kiam mi kuros ĉi tiu programo. Mi tuj iros antaŭen kaj Kion fari pozitiva. Malbenita. Kelkaj eraroj. Do lasu min rulumi reen ĝis la unua. Ne funkcias tra ili malantaŭen. Labori per ili de supre malsupren por ke ili ne akvofalo kaj nur unu afero estu malbone. Implicitan deklaron de funkcio GetInt (). Jes. Do tio ne sufiĉas. Mi ia faris la saman eraron sed iom malsama ĉi tiu tempo. Mi bezonas ne nur inkluzivas stdio.h sed ankaŭ cs50.h, kiu inkludas la tn deklaroj de akiri int, kiu instrui la aparato, nek instruas C kion GetInt () estas. Do mi resave. Mi tuj ignori la aliaj eraroj ĉar mi tuj esperas, ke ili estas iel rilataj al la eraro Mi jam fiksita. Do lasu min antaŭeniri kaj recompilar kun fari pozitivan, Enter. Malbenita. Tri eraroj, silentu. Lasu min rulumi supren al la unua. Neuzataj variablo n. Ni ne vidis ĉi tion antaŭe. Kaj jen, ankaŭ, estas iom enigmaj. Ĉi tiu estas la eliro de la tradukilo. Kaj kion tio emfazita linio tie - positive.c :9:13 - diras, ĝi estas jene on line naŭ de positive.c, je la 13a karaktero, 13-a kolumno, vi faris tiun eraron. Kaj en aparta, ĝi estas diri mi neuzitaj variablo n. Do vidu - linio naŭ. Mi uzas n en la senco ke Mi donas al ĝi valoron. Sed kion la tradukilo ne ŝatas estas ke mi ne ŝajne uzante ĝin. Sed atendu momenton, mi uzas ĝin. En linio 11, Mi uzas ĝin ĉi tie. Sed se mi rulumas malsupren pli ĉe positive.c :11 - tiel ankaux en linio 11, karaktero 12, la tradukilo estas telling me, uzo de nedeklarita ensalutilo n. Do nedeklarita rimedoj mi devas ne specifita kiel variablo kun datumtipo. Sed atendu momenton. Mi faris ekzakte ke en linio naŭ. Do iu vere konfuzita tie. Ĝi estas ĉu mi aŭ la tradukilo ĉar en linio naŭ, denove, mi deklaras kun int n, kaj mi atribui al ĝi la redoni valoro de GetInt (). Tiam Mi uzas tiu variablo n en linio 11 kaj kontrolado se ĝia valoro estas malpli ol aŭ egala al nulo. Sed tio ŝajne estas malbona kaj rompitaj kial? Diru ĝin denove? Ha, mi devas deklari n antaŭ enirante la banton. Sed kial? Mi volas diri, ni nur proponis iom antaŭe ke ĝi estas bone por deklari variablojn ĉiuj laŭ unu linio, kaj poste atribui al ili iom da valoro. Tutmonda variablo - ni revenos al tiu ideo en nur momento. Kial vi volas, ke mi metis ĝin ekster la buklo? Ĝi estas. Ekzakte. Do, kvankam, iom _counterintuitive_, lasu min resumi. Kiam vi rakontos n ene de la do bloko tie - specife ene de tiuj buklaj krampoj - ke variablo n havas kio estas vokis medio - nerilataj al nia komentario sistemo en la Kompreneble - sed havas atingon tio limigita al tiuj buklaj krampoj. En aliaj vortoj, tipe se vi rakontos variablo ene aro de krispa krampoj, ke variablo nur ekzistas ene de tiuj buklaj krampoj. Do per tiu logiko sola, kvankam Mi jam deklaris n en linio naŭjaraĝa, esence malaperas de atingo, malaperas el la memoro, por tiel diri, por kiam mi batis linio 11. Ĉar linio 11, bedaŭrinde, estas ekstere de tiuj buklaj krampoj. Do mi bedaŭrinde ne povas fiksi tion per reiri al kion mi faris antaŭe. Vi povus unue fari ĉi tion. Sed kion vi nun ne fari cikle? Vi evidente ne alveni la int cikle. Do ni povas lasi la GetInt (), kaj ni devus lasi la GetInt () ene de la buklo ĉar tio kion ni volas Pester la uzanto por denove kaj denove. Sed ĝi sufiĉas iri ĝis linio, ni diru, ses. Int n, punktokomo. Ne donu al ĝi valoron ankoraŭ ĉar vi ne bezonas nur ankoraŭ. Sed nun ĉi tie, avizo - tio Estus tre facile erari. Mi ne volas ombro mia antaŭa deklaro de n. Mi volas uzi la n ke reale ekzistas. Kaj tiel nun en linio 10, Mi atribuas n valoron. Sed en linio ses, mi deklaras n. Ankaux mi aŭ mi povas ne uzas ĝin en la linio 12 nun? Mi ne povas ĉar inter kiuj krispa krampoj estas n deklaris nun? La unu ĝis ĉi tie sur linio kvin. Al unu tie sur linio 14. Do, se mi nun malzomi, krom cxi tiu dosiero, iru apogi en kaj kuri fari pozitivan, ĝi kompilis ĉi tiu tempo. Do jen jam progreso. Slash. . / Pozitiva, Enter. Mi postulas ke vi donu al mi pozitiva entjero. Negativaj 1. Negativaj 2. Negativaj 3. Nulo. Unu. Kaj dankon pro la unu estas kio nun presita. Lasu min provi ion alian, pro scivolemo. Mi lin diris al enigo entjero. Sed kion se mi anstataŭ entajpi ŝafido? Do vi nun vidas alian prompto - reprovi. Sed nenie en mia kodo mi ja skribis reprovi. Do kie, supozeble, estas ĉi reprovi instigas devenante, vi dirus? Jes, de GetInt () mem. Do unu el la aĵoj CS50 bastono de faras por vi, almenaŭ en tiuj unuaj kelkaj semajnoj, estas ni skribis kelkajn kvanto de eraro kontrolanta por certigi, ke se vi nomas GetInt (), vi volas almenaŭ reiri al int de la uzanto. Vi ne ricevos ĉenon. Vi ne akiros char. Vi ne ricevos ion alie tute. Vi ricevos la int. Nun, ĝi ne povus esti pozitiva. Ĝi povus ne esti negativa. Ni faru garantiojn ĉirkaŭ tiu. Sed ni Pester la uzanto reprovi, reprovi, reprovi ĝis li aŭ ŝi vere kunlaboru. Simile, se mi faras 1.23, kiu ne estas int. Sed se mi tajpas en, ekzemple, 50, kiu donas al mi la valoron kiun mi volis. Ĉio bone. Do ne estas malbona. Demandojn sur kio ni ĵus faris? La ŝlosilo takeaway esti, esti klara, ne tiel la banton, kiun ni vidis antaŭ ol eĉ se ni ne vere uzas ĝin, sed la demando de medio, kie variablojn nur povas nur povas uzi ene de iu specifa medio. Bone, lasu min alparoli la sugesto vi faris pli frue, tiu de malloka variablo. Kiel flanken, rezultas ke alia solvon al tiu problemo, sed tipe malĝusta solvo aŭ oni malbone desegnita solvo, estas deklari vian variablon kiel kio estas nomas tutmonda variablo. Nun mi estas speco de seksperforti mia difino de medio ĉar estas neniu krispa krampoj ĉe la plejsupro kaj la tre fundo de dosiero. Sed la implikaĵo de tiu estas, ke nun en linio kvar, n estas malloka variablo. Kaj kiel la nomo implicas, estas nur alirebla ĉie. Nulo vere havas tiujn. Se vi uzas variablon, eble vi memoras vi devis elekti se ĝi estas por ĉi sprite aŭ por ĉiuj spiritoj. Nu, ĉiuj spiritoj estas nur la pli klara maniero diri tutmonda. Jes? Ha, vere bona demando. Do memoru, ke en la unua versio de miaj kodon, kiam mi malĝuste deklaris kaj difinis n en linio naŭ - Mi deklaris ĝin kiel variablo kaj mi donis al ĝi valoron kun la atribuo operatoro - ĉi tiu donis al mi du erarojn. Unu, la fakto ke n ne estis uzata, kaj du, ke en linion 11 ĝi simple ne estis deklarita. Do la unua mi ne adreso de la epoko. Ĝi ne estas strikte eraron deklari variablo sed ne uzis ĝin. Sed unu el la aferoj ni faris en la CS50 aparato, intence, pedagogie, estas ni cranked ĝis la atendoj de la tradukilo fari certa, ke vi faras tion ne nur korekte sed vere ĝuste. Ĉar se vi deklari variablon kiel n kaj neniam uzas ĝin, aŭ uzante ĝin ĝuste, tiam kio Estas ĝi faras tie? Ĝi vere utilas sen celo. Kaj estas tre facila tra la tempo, se vi Ne agordi vian propran komputilon en tiel, ke vi nur devas kodon kiu havas iom restaĵoj tie, restoj tie. Kaj tiam monatojn poste vi retrorigardas kaj vi estas kiel, kial estas tiu linio de kodo tie? Kaj se ne estas bona kialo, ne profitigas vin aŭ vian kolegoj laŭ la vojo al devas falpusxigxos sur ĝi tiam. Kiel flanken, kie estas ke devenante? Nu, memoru, ke ĉiufoje kiam ni kompilos programo, ĉiuj ĉi aferoj estas esti presita. Do ni revenos al ĉi tio. Sed denove, fari estas ilo kiu aŭtomatigas la procezo de kompili per kurante la reala tradukilo vokis clang. Tiu afero, ni fine vidas, havas fari kun elpuriganta kun speciala programo nomata la erarserĉilo. Ĉi tio havas al fari kun optimizando la kodo - pli en kiuj en estonteco. Std = C99 - ĉi nur signifas uzi la version de 1999 C. C jam pasis ĉirkaŭ eĉ pli longa ol tio, sed ili faris iujn bela ŝanĝojn 10 plus jarojn. Kaj jen la koncerna ones. Ni diras fari ion antaŭe estus estinta averto eraro neebligante la lernanto el kompili. Kaj muro pere fari tion por tuta amaso de aferoj, ne nur rilate al variabloj. Kaj tiam mi rulumas al la fino de ĉi tiu linio. Kaj ĉi tio, tro, ni fine revenu al. Tio estas evidente la nomo de la dosieron mi kompili. Tiu memoras la nomon de la dosiero Mi elirigi kiel la nomo de miaj runnable programo. Ĉi-lcs50 nur signifas uzi la CS50 biblioteko, kaj ajna nuloj kaj ke la bastono, skribis kaj kompilis pli frua ĉi tiu jaro, ili integras ilin en mian programon. Kaj neniu scias kion-lm, estas? Ĝi estas la matematika biblioteko, kiu estas nur tie eĉ se vi estas ne fari ajnan math. Ĝi simple aŭtomate havigis al ni por fari. Nu, lasu min fari unu alia ekzemplo tie malfermante novan dosieron. Kaj lasu min savi ĉi tiu kiel string.c. Ĝi rezultas ke ni parolas pri datumoj tipoj hodiaŭ, estas eĉ pli okazas sub la kapuĉo ol ni vidis tiom. Do mi rapide faros rapidan programo. Inkluzivi stdio.h. Kaj mi savi. Kaj vi scias, mi ne faru la saman eraron denove kaj denove. Inkluzivi cs50.h. Kaj lasu min iri antaŭen nun kaj faru int main (void). Kaj nun mi simple volas fari programon kiu faras tion - deklarus ŝnureto vokis s kaj akiri kordo de la uzanto. Kaj lasu min fari iom instrukcioj tie - bonvolu doni al mi kordo - tiel la uzanto sciu, kion fari. Kaj tiam cxi tie sub tiu ĉi, Mi volas fari la sekvan - por int i ricevas nulo. Denove, komputikistoj tipe komenci rakonti je nulo, sed ni povus fari, ke oni se ni vere volis. Nun mi intencas fari i estas malpli ol la korda longeco de s. Do strlen - S-T-R-L-Kaj-N - denove, ĝi estas konciza ĉar ĝi estas pli facile tajpi, eĉ se ĝi estas iom kamufla. Tio estas funkcio ni ne uzas antaŭe sed laŭvorte faras tion - revenu al Mi numero kiu reprezentas la longo de la kordo ke la uzanto tajpas. Se ili enigis en saluton, denove kvin ĉar ekzistas kvin literojn en saluton. Tiam, je ĉiu ripeto de tiu buklo, i plus plus. Do denove, normo konstrui eĉ se vi ne estas tute tro komforta aŭ familiara kun ĝi ankoraŭ. Sed nun en ĉiu ripeto de tiu ciklo, rimarki kion mi faros. Mi volas iri antaŭen kaj presi el sola karaktero - tial% c backslash n sur nova linio. Kaj tiam, vi scias, kion mi volas fari? Sendepende de la vorto estas, ke la uzanto tajpas en, kiel saluton, mi volas printi H-Kaj-L-L-O, unu signo por linio. Alivorte, mi volas akiri en la individuaj karakteroj en cxeno, per kiu ĝis nun ĉeno havas nur estis vico de signoj. Kaj ĝi rezultas mi povas fari s, krampo, i, proksime krampo, fermi parentezo, punktokomo. Kaj mi devas fari pli aferon. Ĝi estas en dosiero nomata string.h ke strlen estas deklarita. Do se mi volas uzi tiun funkcion, Mi bezonas diri al la tradukilo, atendi por uzi ĝin. Nun lasu min antaŭeniri kaj realigi la programo nomita linio. Dot, oblikvo, kordoj. Bonvolu doni al mi kordo. Mi iros antaŭen kaj tajpi ĝin. Saluton, en ĉiuj kaskedoj, Enter. Kaj nun rimarkas mi presis tiun unu signo post la alia. Do la nova detalo estas, ke ĉeno, ĉe la fino de la tago, povas esti Montrita pere de liaj individuaj karakteroj por enkonduki la kvadrato krampo skribmaniero. Kaj tio estas ĉar ĉenon sube la kapuĉo ja estas vico de gravuloj. Sed kio estas neta pri ili estas en via komputilo RAM - Mac, PC, kia ajn ĝi estas - ili estas laŭvorte malantaŭo al malantaŭo al dorso - H-E-L-L-O - ĉe individuo, najbara bitokoj en memoro. Do se vi volas atingi la oka tiaj bitoko, kiu en ĉi buklo estus krampo nulo, krampo unu, krampo du, krampo tri, kvar krampo - ke estas nulo indeksita ĝis kvin - ke estos presi H-E-L-L-O sur ĝia propra linio. Nun, kiel teaser, lasu min montri al vi la klason de aĵoj vi eventuale esti povis kompreni, almenaŭ kun iuj proksimaj rigardante. Por unu, kion ni inkludis en la hodiaŭa ekzemploj, se vi ŝatus, estas fakte unu el la tre unua jailbreaks por la iPhone. Jailbreaking signifas krakas la telefono do vi povas reale uzi ĝin sur malsamaj portanto aŭ instalon vian propran programaron. Kaj vi rimarkos ĉi aspektas tute kripta, plej probabla. Sed rigardu tion ĉi. La iPhone estis ŝajne krakis kun a por ciklo, kun se kondiĉo, estas alia kondiĉo, faskon de funkcioj ni ne vidis. Kaj denove, vi ne faros en unua rigardo probable kompreni kiel tio funkcias. Sed ĉiu, ke ni ia prenu por donita en nia moderna vivo fakte emas redukti eĉ al iu de ĉi tiuj fundamentaj ni vizitis rigardante. Lasu min antaŭeniri kaj malfermu unu alia programo, holloway.c. Do tio, ankaŭ, estas io, kion vi ne vere scias. Eĉ neniu de la stabo aŭ mi povis probable kompreni tion ĉi oni rigardas ĉar ĉi tiu estis ies kodo kiu estis donita al kio historie konata kiel sekur C konkurso, kie vi skribos programon kiu kompilas kaj kuras sed estas tiel malbenita kamufla neniu homo povas kompreni kion ĝi tuj fari ĝis ili efektive ruli ĝin. Do ja, se vi rigardas tiun kodo, mi vidas ŝaltilon. Mi vidas ĉefa. Mi vidas tiujn kvadrataj krampoj implico ia tabelo. Ĉu iu volas diveni kion tiu programo efektive faras se mi kuros Holloway? Jes. Akcepti. Bonege. Do nur la bastonon kaj mi ne povas diveni el kio tion fari. Kaj nun laste, lasu min iri antaŭen kaj malfermu unu alia programo. Ĉi tiu - denove, ni faros la fontkodo havebla surlinia - ĉi tiu estas nur speco de belaspekta. Ĉiuj ili estas batis la spaco trinkejo sufiĉe. Sed tio estas reala kodo. Do, se vi pensas ke estas sufiĉe, se ni fakte kuri ĉi ĉe la prompto, eventuale vi vidos kiel ni povus fari tion kiel ĉi tio. Do ni lasos vin en tiu noto kaj vin vidos merkredon. [MUZIKO ludi] Speaker 2: En la sekvanta CS50, la TFS okazigi ribelon. Parolanto 3: Tie li estas. Get li! [MUZIKO ludi]