[Musiikki soi] DAVID J. MALAN: Okei. Tämä on CS50, ja tämä on alku viikolla kaksi. Olkaamme siis aloittaa tänään bugi. Bug, on tietenkin virhe ohjelmassa, ja saat hyvin tuttu käsite jos et ole koskaan ohjelmoitu ennen. pset0 ja nyt pset1. Mutta katsotaanpa harkita jotain hieman yksinkertainen aluksi. Tämä ohjelma täällä, että minä heitti yhdessä etukäteen, ja Väitän, että tämän pitäisi tulostaa 10 tähteä ruudulle käyttämällä printf, mutta se on ilmeisesti viallisista jollakin tavalla. Koska määritys, joka se pitäisi tulostaa 10 tähteä, mutta se ei ilmeisesti, mitä olisi väität on bugi? Joo? Joten se on pois yksi virhe, ja mitä tarkoitat sillä? OK. Erinomainen. Joten olemme määritetty aloittaa nolla i, ja olemme määriteltyjen n arvo on 10, mutta olemme käyttäneet vähemmän tai yhtä suuri kuin. Ja syystä, että tämä on kahden merkkejä eikä vain yksi symboli, kuten matematiikan kirjan, on, että sinulla ei ole tapa ilmaista yksi merkki vastaava. Niin se tarkoittaa alle, mutta jos alkaa laskea nollaan, mutta voit laskea koko matkan läpi ja yhtä suuri kuin 10, olet tietysti menossa laskea 11 asiat yhteensä. Ja niin aiot tulostaa 11 tähteä. Joten mikä voisi olla korjata tämän? Joo? Joten säätää alle tai yhtä suuri kuin vain olla pienempi kuin, ja siellä, väitän, ehkä Toinen ratkaisu myös. Mikä voisi muuta voit tehdä? Joo? Niin alkaa vastaten sen 1, ja jätä pienempi kuin tai yhtä suuri kuin. Ja suoraan sanottuna mielestäni sanoa , että tyypillisellä ihmisellä, tämä on luultavasti enemmän suoraviivaista. Alkaa laskea 1 ja laskea läpi 10. Pohjimmiltaan mitä tarkoitat. Mutta todellisuus on ohjelmointi, kuten olemme nähneet, tietotekniikan tutkijoita ja ohjelmoijat eivät yleensä alkaa laskea nollaan. Ja niin se on hieno kerran tottuu siihen. Vointisi on yleensä olla jotain alle. Niin yksinkertaisesti looginen virhe, että voisimme nyt korjata ja lopulta uudelleenkääntää tämä ja saada vain 10. No miten tästä ongelmasta täällä? Tässäkin Väitän, että minulla on tavoitteena tulostus 10 stars-- yksi per rivi tällä kertaa, mutta se ei ole. Ennen ehdotamme mitä korjaus on, mitä tämä tulostaa visuaalisesti jos olisin koota ja suorita tämä ohjelma luulet? Joo? Star. Joten kaikki tähdet Sama linja on mitä kuulin, ja sitten uusi rivi merkki. Joten kokeile sitä. Joten buginen-1, kirjoita, ja näen kalahtaa komento että puhuimme viime kerralla. ./buggy-1, ja todellakin näen kaikki 10 tähteä samalla linjalla, vaikka väitän minun selityksessä vain kommentin huipulla koodin että aioin tehdä yksi per linja. Mutta tämä näyttää oikealta. Nyt linja 15 se näyttää olen tulostus tähti, ja sitten linja 16 se näyttää Olen tulostus Uusi linja hahmo, ja he molemmat sisennetty niin Olen lenkin sisältä selvästi. Joten ei kannata tehdä tähti, uusi rivi, tähti, uusi rivi, tähti, uusi linja? Kyllä? Joo, toisin kuin kieli kuten Python, jos olet perehtynyt, sisennys ei väliä tietokoneeseen. Se vain on merkitystä ihmisen. Joten taas täällä olen keksinyt linjat 15 ja 16-- että näyttää kauniilta, mutta tietokone ei välitä. Tietokone välittää todella ottaa aaltosulkeita noin nämä riviä koodia. Niin, että se on clear-- aivan kuten Scratch-- että nämä kaksi riviä koodia tulisi suorittaa. Kuin yksi niistä keltainen Scratch palapeli kappaletta uudestaan ​​ja uudestaan ​​ja uudestaan. Joten jos nyt ajaa uudelleen tämän program-- ./buggy-2-- Hm. Minulla on virhe nyt. Mitä unohdan tehdä? Joo, joten en kääntää sen. Joten buginen-2. Tiedostoa koska en itse koota toinen versio. Joten nyt mielenkiintoinen Pimeän variable-- ei 2. Meillä menee 1. Tee buginen-1-- ./buggy-1-- ja nyt kukin niistä on samalla linjalla. Nyt on poikkeus tämä oletettu väite kaivoksen että tarvitset näitä aaltosulkeita. Milloin se on todella OK-- jos olet huomannut jaksossa tai textbooks-- jättää aaltosulkeita? Joo? Täsmälleen. Kun on vain yksi rivi koodia, että olet haluavat liittyä silmukka kuten meidän ensimmäisessä esimerkissä. On täysin oikeutettua jättää aaltosulkeita aivan kuten eräänlainen mukavuutta alkaen kääntäjä sinulle. Joo? Hyvä kysymys. Olisiko harkittava tyyli virhe? Olisimme promote-- kuin CS50 tyyli opas, URL, joka on pset1--, että aina Käytä aaltosulkumerkkien. Varmasti jos olet uusi ohjelmointi. Todellisuus on, ettemme ole aio kieltää sinua tekemästä nämä mukavuudet. Mutta jos olet vasta vauhtiin asioita, ehdottomasti vain aina kihara henkselit kunnes saat roikkua sitä. Hyvä kysymys. Kunnossa. Niin että sitten oli bugi. Ainakin jotain melko yksinkertaista. Ja vielä luulisi tämän on melko alkeellinen, eikö? Tämä on tavallaan ensimmäinen viikko tarkastella kieltä kuten, katso bugeja siinä. Mutta todellisuus nämä ovat tosiasiallisesti edustava joitakin melko pelottavia ongelmia joita voi syntyä todellisessa maailmassa. Joten jotkut teistä saattavat muistaa jos noudatat teknologian uutisia, tai ehkä jopa kiinni tuuli tämän helmikuussa Tämän kuluneen vuoden aikana, että Apple oli tehty hieman virhe molemmissa iOS, käyttöjärjestelmä puhelimeensa, ja myös Mac OS, käyttöjärjestelmä niiden työasemia ja kannettavia tietokoneita. Ja näit kuten otsikoita kuten tämä. Ja sen jälkeen, Apple lupasi korjata tämän vian, ja hyvin nopeasti teki korjata sen iOS, mutta sitten lopulta korjasi Mac OS samoin. Nyt mikään näistä otsikoista yksin todella paljastaa, mitä perimmäinen ongelma oli, mutta vika oli lopulta alennettu vian SSL, Secure Sockets Layer. Ja pitkä tarina lyhyt, tämä on ohjelmiston että selaimet ja muut ohjelmistoja käytetään tekemään mitä? Jos sanoisin, että SSL on mukana, aina kun käydä URL, joka alkaa HTTPS, mitä sitten voisi SSL liittyä? Salausta. Joten me puhumme Tässä lähipäivinä. Salaus, taidetta muokkaamisella tiedot. Mutta pitkä tarina lyhyt, Apple joskus sitten oli tehnyt virheen niiden täytäntöönpanossa SSL, ohjelmisto, joka lopulta toteuttaa URL-osoitteet, kuten HTTPS tai max yhteyksiä sielläkin. Seurauksena on, että yhteyksiä voisi mahdollisesti siepata. Ja yhteydet olivat ei välttämättä ole salattu jos sinulla on ollut huonoja kaveri välillä sinä ja määränpää sivusto, joka osasivat hyödyntää tätä. Nyt Apple lopulta lähetetty korjata tämän lopuksi, ja kuvaus niiden korjaus oli tämä. Turvallinen kuljetus ei vahvista aitouden yhteyden. Asiaa käsitellyt palauttaminen puuttuu validointivaiheet. Joten tämä on erittäin käsi aaltoileva selitys yksinkertaisesti sanomalla, että me mokasin. On kirjaimellisesti yksi riviä koodia, joka oli buginen niiden täytäntöönpanossa SSL, ja jos mennä verkossa ja etsiä tämän voit itse löytää alkuperäistä lähdekoodia. Esimerkiksi tämä on kuvakaappaus vain osa melko suuri tiedosto, mutta tämä on funktio ilmeisesti nimeltään SSL tarkistaa merkki palvelimen avainten vaihdon. Ja se vie kasan argumentteja ja tulot. Ja emme aio keskittyä liikaa Erikoiskohdan siellä, mutta jos keskitytään koodin sisällä Tämän päällimmäinen function-- katsotaanpa zoomata että. Saatat jo epäillä mikä virhe saattaa olla vaikka sinulla ei ole aavistustakaan lopulta mitä etsit. On eräänlainen anomalia täällä, joka on mitä? Joo, en todellakaan pidä ulkoasua kahden goto epäonnistuu. Suoraan sanottuna, en todellakaan tiedä, mitä goto epäonnistua avulla, mutta jossa on kaksi niistä takaisin takaisin. Että vain sellainen hieroo minua älyllisesti väärällä tavalla, ja tosiaan jos me zoomata vain ne linjat, tämä on C. Niin paljon Applen koodia on itse kirjoitettu C, ja tämä ilmeisesti on todella equivalent-- ei sille ihan sisennys versio, mutta jos tunnistat siitä, että ei ole aaltosulkeita, mitä Apple todella kirjoitti oli koodi, joka näyttää näin. Joten olen zoomataan ulos ja minä vain Kiinteän syvennys mielessä että jos ei ole aaltosulkeita, että Toinen goto epäonnistua siinä keltaisella aikoo toteuttaa vaikka mitä. Se ei liity jos ehto sen yläpuolella. Joten vaikka uudelleen, jos et ole aivan ymmärtää, mitä tämä voisi mahdollisesti olla tekemässä, tietää, että jokainen näistä conditions-- kukin näiden linjojen on erittäin tärkeä askel prosessi tarkastaa jos tietosi on todellakin salattu. Niin ohita yksi näistä vaiheita, ei ole paras idea. Mutta koska meillä on tämä Toinen goto epäonnistua keltainen, ja koska kerran me tavallaan esteettisesti siirrä sitä vasemmalle, jossa se loogisesti on tällä hetkellä, mitä tämä tarkoittaa linjaa koodin alla, että toinen goto hylätty ajattelisit? Se on aina menossa ohitetaan. Joten GOTOt yleensä paheksutaan syistä emme todellakaan mennä, ja todellakin CS50 meillä on tapana ei opettaa tämän lausunnon goto, mutta voit ajatella goto ei siten mennä hyppy joihinkin muihin osa koodista. Toisin sanoen hypätä yli tämä viimeinen rivi kokonaan, ja niin tuloksena tyhmä yksinkertainen virhe, että oli vain seurauksena todennäköisesti joku kopioimalla yksi liikaa monta kertaa oli, että koko turvallisuus iOS ja Mac OS haavoittuvuuden Sieppaukseen by pahiksia jo jonkin aikaa. Kunnes Apple vihdoin korjannut. Nyt jos jotkut teistä ovat itse asiassa käynnissä vanhat versiot iOS tai Mac OS, voit mennä gotofail.com joka on sivusto, että joku perustaa olennaisesti määrittää ohjelmallisesti jos tietokone on edelleen haavoittuva. Ja suoraan sanottuna, jos se on, se on luultavasti hyvä idea Voit päivittää puhelimesi tai Macin tässä vaiheessa. Mutta on vain osoitus kuinka arvostusta näistä alemman tason yksityiskohdat ja melko yksinkertaisia ​​ideoita voi todella kääntää päätökset ja ongelmia, jotka affected-- tässä case-- miljoonia ihmisiä. Nyt sana hallintoon. Jakso alkaa tulevana sunnuntaina. Saat sähköpostilla viikonloppuna noin osiossa, jossa vaiheessa resektioiden prosessi alkaa jos olet tajusi sinulla on nyt joitakin uusia konflikteja. Joten tämä tapahtuu joka vuosi, ja me mahtuu sisään lähipäivinä. Office hours-- tehdä pitää silmällä tätä aikataulut tästä. Muuttuu hieman tällä viikolla, erityisesti alkamisaika ja paikka, joten älä ota että ennen kuin suuntaat virka tahansa seuraavan neljä yötä. Ja nyt sana arviointi, varsinkin kun sukeltaa ongelma asetetaan yksi ja sen jälkeen. Joten kohti erittely, nämä ovat yleensä akselit, joita pitkin me arvioida työsi. Laajuus viittaa siihen, mitä määrin koodi työkoneet ominaisuuksia tarvitaan meidän erittely. Toisin sanoen, kuinka paljon osainen sarja sinä purra. Teitkö kolmasosa siitä, puolet siitä, 100% siitä. Vaikka se ei ole oikein, kuinka paljon sinä yrität? Niin että kaappaa taso vaivaa ja määrä , johon puri Harjoitus ongelmia. Correctness-- tämä yksi, jotta Missä määrin, on koodi vastaa meidän tekniset ja vailla vikoja. Joten se toimii oikein? Jos annamme sille joitakin input, eihän antaa meille lähtö että odotamme? Design-- nyt tämä on ensimmäinen erityisesti laadullisten puutteiden, tai ne, jotka vaativat ihmisten tuomion. Ja todellakin, siksi meillä on henkilökuntaa niin monet opetuksen kaverit ja tietenkin avustajia. Missä määrin on koodi kirjoitettu hyvin? Ja taas tämä on erittäin laadullinen arviointi joka toimii kanssasi kaksisuuntaisesti vuonna lähiviikkoina. Niin että kun saat ei vain numeerinen tulokset, mutta myös kirjallinen pistemääriä tai kirjoitetaan palaute, tai kirjallista palautetta in Englanti sanat. Sitähän käytämme ajaa sinut kohti todella kirjallisesti parempaa koodia. Ja luento ja kohdassa, yritämme kohtaan out-- niin usein kuin me can-- mikä tekee ohjelma ei ainoastaan oikea ja toiminnallisesti hyvä, mutta myös hyvin suunniteltu. Tehokkain se voisi olla, tai jopa kaunein se voi olla. Joka johtaa meidät tyyliin. Tyyli lopulta on esteettinen tuomion. Päätitte hyvä nimet muuttujat? Oletko sisennetty koodin oikein? Se näyttää hyvältä, ja siksi, on se helppo toisen ihmisen lukea teidän kummankin sen oikeellisuutta. Nyt yleensä kohti oppimäärän, me pisteet nämä asiat viiden pisteen asteikolla. Ja haluan äänekkäästi piste että kolme on todella hyvä. Hyvin nopeasti tehdä ihmiset alkaa tehdä aritmeettinen. Kun he saavat kolme viisi oikeellisuudesta jostain PSET ja he ajattelevat pirun, minä menossa 60% joka on lähinnä D tai E. Se ei ole miten me ajatella näistä numeroista. Kolme on todella hyvä, ja mitä me odottavat yleensä alussa termi on, että jos saat nippu three's-- ehkä pari messujen, pari fours-- tai pari kaksittain, pari fours-- se on hyvä paikka aloittaa. Ja niin kauan kuin näemme vussa ajan, olet erityisen hyvä paikka. Kaava käytämme paino asioita on olennaisesti Tässä kohden oppimäärän, mikä tarkoittaa vain sitä, että me enemmän painoa oikeellisuutta. Koska se on hyvin usein oikeellisuutta joka vie eniten aikaa. Luota minuun nyt. Tulet find-- ainakin yhdessä pset-- että olet viettävät 90% ajastasi työskentelevät 10%: n ongelma. Ja kaikki tavallaan toimii lukuun ottamatta yhtä tai kahta vikoja, ja ne ovat vikoja, jotka pitää sinut ajan myöhään yöllä. Nämä ovat niitä, jotka tavallaan paeta sinua. Mutta kun nukkuminen sitä, tai kokouksen virka tai kysymällä verkossa, on kun saat että 100% tavoite, ja siksi me paino oikeellisuuden eniten. Suunnittele hieman vähemmän, ja tyyli hieman pienempi. Mutta pitää mind-- tyyliin on ehkä helpoin Näiden purra kohti tyyliin opas. Ja nyt vakavampi Huomaa akateemiseen rehellisyys. CS50 on valitettava ero on suurin tuottaja Ad Board tapauksia lähes vuosittain historiallisesti. Tämä ei johdu opiskelijat huijata CS50 sen enempää kuin mikä tahansa muu luokka, mutta koska luonteeltaan työn, se, että se on elektroninen, että etsimme sitä, ja Itse asiassa olemme tietotekniikan tutkijoita, Voin sanoa, että olemme valitettavasti erittäin hyvä havaitsemaan sitä. Mitä tämä tarkoittaa reaalisesti? Joten se, per oppimäärän, Kurssin filosofia todellakin pohjimmiltaan olla kohtuullinen. On tämä rivi välillä tekee omaan työhön oman ja saada hieman kohtuullista apua ystävältä, ja suoranainen tee sitä työtä varten ystävä, tai lähettämällä hänelle koodi niin että hän voi yksinkertaisesti ottaa tai lainata sitä oikeaa. Ja joka ylittää linjan että me piirretään luokassa. Katso, oppimäärä Viime kädessä linjat että vedämme olevan kohtuullinen ja kohtuuton käytös, mutta se todellakin kiehua alas ydin työsi tarvitsematta olla oma lopussa. Nyt, että sanoi, on heuristinen. Koska kuten ehkä imagine-- alkaen virka ja grafiikka ja videot olemme esitetään näin far-- CS50 on todellakin tarkoitus olla yhteisinä ja osuuskunta ja sosiaalista kuin mahdollista. Yhteisinä kuin se on tiukka. Mutta tämä sanoi, heuristinen, kuten näet vuonna oppimäärän, on, että kun sinulla on jokin ongelma. Sinulla on bugi koodissa, että olet voi ratkaista, on kohtuullista sinulle näyttää koodin toiselle. Kaverisi vielä luokassa, ystävä istuu vieressäsi virka, tai henkilökunnan jäsen. Mutta ne eivät saa näyttää koodia sinulle. Toisin sanoen, vastaus question-- Tarvitsen help-- ei oi, tässä on minun koodi. Katsokaa tätä ja päätellä siitä, mitä haluatte. Nyt tietenkin, siellä on tapa selvästi peli Tämän järjestelmän, jossa näytän sinulle minun koodi ennen kuin kysymys. Näytät minulle koodin ennen kuin kysymys. Mutta katso oppimäärän uudelleen tarkempia yksityiskohtia jos tämä linja on. Juuri nyt maalata kuvan ja jakamaan mahdollisimman avoimesti missä olemme viime vuosina, tämä on numero Ad hallituksen tapauksista että CS50 on ollut yli Viimeisten seitsemän vuoden aikana. 14 tapausta tämän viimeisimmän syksynä. Mitä opiskelijoiden mukana, se oli 20 jostain kumman opiskelijat viime syksynä. Oli huippu 33 opiskelijat joitakin vuosia sitten. Joista monet ovat valitettavasti enää täällä kampuksella. Opiskelija mukana prosentteina luokka on perinteisesti vaihdellut 0% 5,3%: iin, joka on vain sanoa tämä on vuosittain haaste. Ja kohti tätä varten, mitä haluamme tehdä, on välittää yhden että me dd-- vain FYI-- vertaa at oikeudenmukaisuus niille opiskelijoille, jotka ovat seuraavat riviä vastaavasti. Teemme vertaa tämänhetkiset näkökannat vastaan ​​kaikki aiemmat tehtävät menneisyyden monta vuotta. Tiedämme myös, miten Googlen ympärillä ja löytää koodi arkistot verkossa, keskustelufoorumit verkossa, työmailla verkossa. Jos opiskelija ei löydä sitä, voimme varmasti löytää sitä niin paljon kuin me valitettavasti tehdä. Joten mitä näet vuonna oppimäärä vaikka tämä pahoillani lauseke. Voin varmasti arvostavat, ja me kaikki on Henkilökunta tehneet kurssin kuten tämä tai tämä itsestään ajan myötä, varmasti tietää, miltä tuntuu, kun elämä tulee tielle, kun olet myöhäiseen yöhön deadline-- ei vain tässä luokassa, mutta another-- kun olet täysin uupunut, stressaantunut, on kohtuuton määrä Muiden asioita. Teet jossain vaiheessa elämä varmasti huono, ehkä myöhään yö päätös. Joten kohti oppimäärän, on tämä lauseke, niin että jos 72 tunnin kuluessa tehdä jotkut köyhät päätös, omistat sen tasalla ja tavoittaa minua ja yksi kurssin päät ja saamme keskustelun. Hoidamme asiat sisäisesti toiveita siitä tulossa enemmän Opetuksen hetki tai elämän oppitunti, eikä jotain erityisen rajuja seurauksia niin saatat nähdä näitä kaavioita täällä. Niin, että hyvin vakava sävy. Olkaamme tauko vain muutaman sekuntia rikkoa jännitteitä. [Musiikki soi] DAVID J. MALAN: Okei, niin miten tuo oli Segue? Nykypäivän ensisijainen aiheista. Joista ensimmäinen on abstraktio. Joista toinen tulee olemaan tietojen esittämisessä, joka suoraan sanottuna on todella kuiva tapa sanoa kuinka voimme edetä ongelmien ratkaisemiseen ja ajattelu noin ongelmien ratkaisemiseen? Joten olet nähnyt Scratch, ja olet nähdään ehkä jo pset1 C että et vain voi käyttää toimintoja, kuten printf, että muut ihmiset takavuosina kirjoitti sinulle. Voit myös kirjoittaa omia funktioita. Ja vaikka sinulla ei ehkä ole tehnyt tämän C, ja suoraan sanottuna vuonna pset1 et todellakaan tarvitse kirjoittaa oma toiminta, koska problem-- vaikka ehkä pelottava Ensimmäinen glance-- näet voidaan viime kädessä ratkaista ole kovin monta riviä koodia. Mutta että sanoi, mitä kirjallisesti oman toiminnon, ymmärtää, että C ei anna te tätä ominaisuutta. Aion mennä tänään lähdekoodia, joka on saatavilla jo verkossa, ja aion mennä eteenpäin ja avata up ohjelma nimeltä toiminto 0.C, ja toiminnaltaan nolla näemme muutamia asioita. Ensimmäisessä linjat 18 kautta 23 on minun tärkein toiminto. Ja nyt kun olemme alkaneet lukea koodin että emme kirjallisesti lennossa, mutta sen sijaan olen kirjoittanut aiemmin tai että sinulla on ongelma asetettu saisivat ottaa kirjoitettu etukäteen. Hyvä tapa aloittaa lukee jonkun toisen koodin on etsiä päätehtävä. Selvittää missä kyseinen nimike kohta on käynnissä ohjelma, ja sitten seuraa se loogisesti sieltä. Joten tämä ohjelma ilmeisesti tulostaa nimesi seuraa kaksoispiste. Tämän jälkeen käytämme GetString alkaen CS50 kirjastosta saada merkkijono tai sana tai lause käyttäjän näppäimistöllä. Ja sitten on tämä asia here-- PrintName. Nyt PrintName ei ole toiminto, joka tulee C. Se ei ole tavallinen io.h. Se ei ole CS50.h. Se on melko samaan tiedostoon. Huomaa jos en selaa bit-- linjat 25 27-- se on vain kaunis tapa kommentoi koodia käyttäen tähdet ja viiltää. Tämä on multi-line kommentoida, ja tämä on vain Oma kuvaus sininen mitä tämä toiminto tekee. Koska linjat 28 kautta 31, Olen kirjoittanut Super yksinkertainen funktio jonka nimi on PrintName. Se kestää kuinka monta perusteluja sanoisit? Joten argument-- koska siellä on yksi argumentti lueteltu sulkujen sisään. Tyyppi on String. Toisin sanoen PrintName on kuin tämä musta laatikko tai funktio, joka vie syötteenä merkkijonon. Ja nimi, että String sopivasti tulee nimi. Ei S, ei N, mutta nimi. Joten mitä PrintName tehdä? Se on mukava yksinkertainen. Vain yksi rivi koodia varten printf, mutta ilmeisesti se tulostaa "Hei," niin ja niin. Jos niin ja niin tulee argumentti. Nyt tämä ei ole valtava innovaatio täällä. Oikeasti, olen ottanut ohjelmaa, jossa voitaisiin on kirjoitettu yhtä riviä koodia laittamalla tämän tänne, ja muuttanut sen joksikin johon liittyy noin kuusi tai seitsemän tai niin riviä koodia myöten tänne. Mutta se harjoittamisen periaate tunnetaan abstraktio. Eräänlainen kapselointi sisällä uuden toiminto, joka on nimi, ja parempi vielä, että nimi kirjaimellisesti kertoo mitä se tekee. Tarkoitan printf-- että ei ole Erityisen kuvaileva. Jos haluan luoda palapelin pala, tai jos olen haluavat luoda funktion joka tulostaa jonkun nimi, kauneus Näin on, että voin itse antaa tämän tehtävän nimi joka kuvaa, mitä se tekee. Nyt se vie tulo, joka Olen mielivaltaisesti kutsutaan nimellä, mutta sekin on ihanan kuvaileva sen sijaan, on hieman enemmän geneerinen kuten S. Ja mitätön, ja nyt vain tarkoittaa että tämä toiminto ei ojennatko takaisin mitään. Eihän GetString että kirjaimellisesti kädet minut takaisin merkkijonon kuten teimme paperinpaloja teidän luokkatoverit viime viikolla, vaan se vain on sivuvaikutus. Se tulostaa jotain näyttöä. Joten lopussa päivä, jos en älä tee toiminto-0, ./function-0, näemme, että se kysyy nimeni. Kirjoitan David, ja se tyypit nimeäni. Jos teen sen uudelleen Rob, se tulee sanoa "Hei, Rob." Niin yksinkertainen idea, mutta ehkä yleistää tämän henkisesti että ohjelmat saavat hieman monimutkaisempi, ja haluat kirjoittaa kimpale koodi ja soittaa että code-- kutsukomponentin että code-- noin kuvaileva nimi kuten PrintName, C ei varaa meille tämä kyky. Tässä toinen yksinkertainen esimerkki. Esimerkiksi jos avaan ylös Tiedosto kehotti tänään return.c, huomaa, mitä olen tehnyt täällä. Suurin osa tästä päätehtävä on printf. Haluan ensin mielivaltaisesti alustaa muuttuja nimeltä x numero 2. Sitten tulostaa "x on nyt % I "ohimennen arvon x. Joten sanon vain, mitä se on. Nyt olen vain rohkeasti väittäen kanssa printf. Olen cubing että arvo x, ja olen Näin kutsumalla toiminto nimeltään kuutio kulkee vuonna x argumentiksi, ja tallentamalla lähtö ja itse muuttujan, x. Joten olen clobbering arvo x. Olen pakottavista arvo x kanssa, mitä tulos kutsuvan tämä kuutio toiminto on. Ja sitten vain tulostaa joitakin pörröinen tavaraa täällä sanoa mitä tein. Niin mikä sitten on kuutio? Huomaa mitä on pohjimmiltaan täällä erilainen. Olen antanut toiminto nimi kuin ennen. Olen määritellyt nimi argumentti. Tällä kertaa se on nimeltään n sijasta nimi, mutta voisin kutsua sitä mitä haluan. Mutta tämä on erilainen. Tämä juttu vasemmalla. Aiemmin se oli mitä avainsanan? Pojat. Nyt on ilmeisesti int. Joten mitä ehkä ottaa pois? Ottaa huomioon, että void ilmaisee, eräänlainen tyhjyyteen, ja näin oli. PrintName palasi mitään. Se teki jotain, mutta se ei Ojentaisitko takaisin jotain, että voisin laittaa vasemmalla puolella yhtäläisyysmerkki kuten olen tehnyt täällä linjalla 22. Joten jos sanon osaksi linjalla 30, mikä se luultavasti merkitsee mitä kuutio tekee minulle? Joo? Se palauttaa kokonaisluvun. Joten se ojentaa minulle takaisin, sillä Esimerkiksi paperille johon se on kirjoitettu vastaus. 2 kuutioitu tai 3 kuutioitu tai 4 cubed-- mitä ohitin vuonna, ja miten voin toteuttaa tämän? No, vain n kertaa n kertaa n miten voisin kuution arvoa. Joten jälleen, super yksinkertainen Ajatus, mutta demonstratiivinen nyt miten voimme kirjoittaa toimintoja että todella oli meidät takaisin arvot, jotka saattavat kiinnostaa. Katsotaanpa yksi viimeinen esimerkki täällä kutsutaan funktio yksi. Tässä esimerkissä, se alkaa saada enemmän pakottavia. Joten toiminto yhdessä, tämä program-- huomautus lopulta kutsuu funktiota kutsutaan GetPositiveInt. GetPositiveInt ei ole toiminto CS50 kirjastossa, mutta päätimme haluaisi sen olevan olemassa. Joten jos me selaa myöhemmin tiedoston, huomaa kuinka menin panna täytäntöön saada myönteisiä int, ja minä sanovat, että se on enemmän pakottavia koska tämä on kunnollinen rivejä koodia. Se ei ole vain typerä pikku lelu ohjelma. Se on itse saanut joitakin virheentarkistus ja tehdä jotain hyödyllisempää. Joten jos et ole nähnyt walkthrough videoita, jotka olemme upotettu pset1, tietävät, että tämä on eräänlainen silmukka C, hengeltään samanlainen , minkälaisia ​​asioita Scratch voi tehdä. Ja tehdä sanoo tähän. Tulosta tämä ulos. Sitten mennä eteenpäin ja saada n- saada int ja säilytä sitä n, ja jatkaa tätä uudestaan ​​ja uudestaan ​​ja jälleen niin kauan kuin n on pienempi kuin yksi. Joten n tulee olla pienempi kuin yksi vain, jos ihminen ei ole yhteistyötä. Jos hän on kirjoittaa vuonna 0 tai -1 tai -50, tämä silmukka on menossa pitämään täytäntöönpanosta uudestaan ​​ja uudestaan. Ja lopulta huomaa, minä palauta arvoa. Joten nyt meillä on funktio että olisi ollut kiva jos CS50 voisi toteuttaa CS50.h ja CS50.c sinulle, mutta täällä voimme nyt toteuttaa tämän itse. Mutta kaksi kommenttia joitakin tärkeitä yksityiskohtia. One-- miksi Vakuutan int n, luuletko, on line 29 sijaan juuri tekemässä tämä täällä, joka on johdonmukaisempaa mitä teimme viime viikolla? Joo? Hyvä ajatus. Joten jos me laittaa se täällä, se on ikään kuin me pitää julistaa sitä uudestaan ​​ja uudestaan. Että itsessään on ei ongelmallista, sinänsä, koska meidän tarvitsee vain arvo kerran ja sitten aiomme saada uuden muutenkin. Mutta hyvä ajatus. Joo? Lähellä. Joten koska olen julistanut n päälle linja 29 ulkopuolella silmukan, se on käytettävissä kaikkialla tämä koko toiminto. Ei muita toimintoja, koska n on vielä sisällä näitä kihara olkaimet täällä. Joten-- varma. Täsmälleen. Joten tämä on vielä siihen pisteeseen. Jos sen sijaan julisti n täällä linjalla 32, se on ongelmallinen, koska arvaus missä muualla minun täytyy käyttää sitä? Rivillä 34, ja Yksinkertainen nyrkkisääntö on että voit käyttää vain muuttujan sisällä viimeisimmän aaltosulkeita jossa olet ilmoittanut sen. Valitettavasti, rivi 34 on yksi rivi liian myöhään, koska olen jo suljettu kihara ahdin linjalla 33 , joka vastaa kihara ahdin linjalla 30. Ja niin tämä on tapa sanoa että tämä muuttuja int on scoped, niin sanotusti vain sisällä Näiden aaltosulkeita. Se vain ei ole olemassa niiden ulkopuolella. Joten todellakin, jos en tee tätä väärin, haluan pelastaa koodi koska se on-- virheellisesti kirjoitettu. Anna minun mennä eteenpäin ja tekevät toiminta-1, ja notice-- virhe. Käytä pimeän tunnisteen n rivillä 35, joka on täällä. Ja jos me vierittää ylös Edelleen toinen. Käytä pimeän tunniste n linjalla 34. Niin kääntäjä, kalahtaa, on huomata, että se vain ei ole olemassa, vaikka selvästi se on siellä visuaalisesti. Niin yksinkertainen korjata julistaa sen sinne. Nyt haluan selaa tiedoston alkuun. Mitä hyppää ulos sinua niin on hieman erilainen alkaen kamaa me katsoimme viime viikolla? Ei vain minulla on nimi, ei vain tehdä Minulla on joitakin teräviä sisältää alkuun asti, Minulla on jotain olen soittamalla prototyyppi. Nyt näyttää hirveän samanlainen kuin mitä me vain näki hetki sitten linjalla 27. Joten päätellä eri virheilmoitus miksi olen tehnyt tämän. Anna minun mennä eteenpäin ja poistaa nämä linjat siellä. Ja niin me tiedä mitään prototyyppi. Remake tätä tiedostoa. Tee funktio yksi. Ja nyt, perkele, neljä virhettä. Katsotaanpa selaa jopa ensimmäinen. Implisiittinen ilmoitus toiminto saada myönteisiä int on pätemätön C99. C99 tarkoittaa vain 1999 versio kieli C, joka on mitä me todella käyttävät. Mitä tämä tarkoittaa? Hyvin C-- ja erityisesti C compilers-- ovat aika tyhmiä ohjelmia. He vain tietävät, mitä olet kertoi heille, ja se on todella temaattinen viime viikolla. Ongelmana on, että jos menen panna täytäntöön nimi täällä, Kehotan toiminto nimeltään GetPositiveInt tässä linjalla 20, että toiminto teknisesti ei olemassa ennen kääntäjä näkee linjan 27. Valitettavasti kääntäjä on tehdä asioita ylhäältä, alas, vasemmalle, oikealle, niin, koska se ei ole nähnyt täytäntöönpano GetPositiveInt, mutta se näkee Yritätkö käyttää sitä täällä, se on juuri menossa bail-- huutaa sinulle virheestä message-- ehkä arvoituksellinen, eikä oikeastaan koota tiedosto. Joten ns prototyyppi up tässä tosin tarpeeton. Kirjaimellisesti, menin tänne ja olen kopioinut ja liittää tähän, ja laitoin sen tänne. Void olisi oikea, niin me kirjaimellisesti kopioi ja liitä se tällä kertaa. Olen kirjaimellisesti kopioida ja liittää se. Oikeastaan ​​yhtä kuin leipä murunen. Hieman vihjeen kääntäjä. En tiedä mitä tämä tekee vielä, mutta olen lupaavat sinulle että se esiintyy lopulta. Ja siksi tämä line-- vuonna line 16-- päättyy pilkkuun. On turha virhe. Kyllä? Jos et linkittää kirjastoon to sanot-- oh, hyvä kysymys. Sharp sisältää header-tiedosto sulkeumia. Tarve olet-- olisi lähes aina huipulla Tiedoston varten similar-- varten täsmälleen samasta syystä, kyllä. Koska standardi io.h on kirjaimellisesti linja näin, mutta sana printf, ja sen väitteisiin ja palautuva. Ja niin tekemällä teräviä olla enintään täällä, mitä olet kirjaimellisesti tekemässä on kopioida ja liittää sisältöä joku muu kirjoitti alkuun asti. Näin cluing koodi sisään Se, että nämä toiminnot ovat olemassa. Joo? Ehdottomasti. Joten erittäin taitava ja oikea ratkaisu olisi, tiedätkö mitä? En tiedä mitä Prototyyppi on, mutta tiedän jos olen ymmärtänyt, että C on vain tyhmä ja mietitään uudestaan ​​ylhäältä alas. No katsotaanpa antaa sille mitä se haluaa. Leikataan että koodi, liitä se alkuun, ja nyt työntää tärkeimmät alhaalla. Myös tämä ratkaisisi ongelman. Mutta voit helposti keksiä skenaario, jossa täytyy soittaa B, ja ehkä B kutsuu takaisin A. Tämä on jotain kutsutaan rekursio, ja me palaamme siihen. Ja se voi olla tai ei voi olla hyvä asia, mutta voit varmasti rikkoa tätä ratkaisua. Ja lisäksi haluan väittävät tyylillisesti, varsinkin kun ohjelmia tullut tämän pitkän ja tämän pitkän, se on vain erittäin kätevä laittaa tärkeimmät huipulla koska se on asia, useimmat ohjelmoijat ovat menossa välitä. Ja niin se on vähän puhtaampi, Ilmeisesti tehdä se tavalla Olen alun perin tein sen kanssa prototyyppi jopa vaikka se näyttää hieman tarpeeton ensi silmäyksellä. Joo? Anteeksi, voit sanoa sen kovempaa? Jos vaihdat sijainnit täytäntöönpanoa ja prototyyppi? Niin se on hyvä kysymys. Jos uudelleen julistaa tämän alas täällä, katsotaanpa mitä tapahtuu. Joten jos laitan tähän alas täällä, sanot. Anteeksi. Louder? Jopa kovempaa. Voi, hyvä kysymys. Olisiko mitätöidä toiminto? Tiedäthän, kaikkien näiden vuosien jälkeen, olen ole koskaan laittaa prototyyppi jälkeenpäin. Tehdäänpä tehdä toiminto-1 kun tekee niin. [Mutisten] DAVID J. MALAN: Hetkinen. Meillä on vielä laittaa kaiken alkuun asti. Tehdäänpä tämä täällä, jos olen ymmärtää kysymyksen oikein. Laitan kaiken, mukaan lukien prototyyppi edellä tärkein, mutta Laitan prototyyppi Alla täytäntöönpanoa. Joten jos teen yhden, Saan takaisin error-- käyttämättömän muuttujan n. Voi, siellä. Kiitos. Katsotaanpa, pääsemme eroon tästä. Se on eri vika, joten katsotaanpa kintaalla. Katsotaanpa todella nopeasti remake tästä. OK, joten tiedot väitettä ei käyttämä muotomerkkijonoa n- oi, se johtuu Vaihdoin näihin täällä. Okei, me tiedämme, mitä vastaus on menossa to-- kunnossa, tässä sitä mennään. Ah, kiitos positiivinen. Okei, aion korjata tämän koodin after-- sivuuttaa tässä bugi koska tämä oli-- se toimii on vastaus. Joten se ei korvaa mitä juuri teit. Epäilen kääntäjä on kirjoitettu siten, että se sivuuttaa prototyyppi koska elimistö, niin sanoakseni, toiminnon on jo toteutettu ylempänä. Olisin todella kuulla käsikirja kääntäjä ymmärtää, jos on muita implisiittisesti, mutta ensi silmäyksellä vain kokeilemalla ja kokeilemalla, ei näytä olevan mitään vaikutusta. Hyvä kysymys. Joten eteenpäin nyt siirtymässä pois haittavaikutuksia ovat toimintoja, jotka tekevät jotain visuaalisesti ruudulla printf, mutta älä palauta arvoa. Ja toimintoja, jotka ovat paluu arvoja, kuten me juuri nähnyt muutamia. Meillä on jo nähnyt tämän käsitteen soveltamisalaan, ja näemme tämän uudestaan ​​ja uudestaan. Mutta nyt taas, Käytä nyrkkisääntö että muuttuja voidaan käyttää vain sisällä viimeksi avattu ja suljetun aaltosulkeita kuin me näki kyseisessä esimerkissä. Ja kun huomautti, on ability-- voit ratkaista joitakin näistä ongelmista laittamalla muuttuja maailmanlaajuisesti huipulla tiedoston. Mutta lähes kaikissa tapauksissa me paheksua, että ja tosiaan edes mene tuohon ratkaisu nyt. Joten nyt takeaway on, että muuttujilla on tämä käsite soveltamisalaan. Mutta nyt Katsotaanpa toinen kuiva tapa todella etsivät jossain aika mielenkiintoinen toteutuksen yksityiskohdat. Miten voisimme edustaa tietoa. Ja meillä on jo pohtinut tätä ensimmäisellä viikolla luokka. Tarkasteltaessa binäärit, ja muistuttaa itseämme desimaalin. Mutta muistaa viime viikolla, että C on erilaiset tiedot ja nippuina enemmän, mutta hyödyllisin niistä nyt voisi olla näitä. Nieriä, tai merkki, joka tapahtuu olla yksi tavu, tai kahdeksan bittiä yhteensä. Ja se on sanoa, että koko ja merkki on vain yksi tavu. Tavu on kahdeksan bittiä, joten tämä merkitsee sitä, että Voimme edustaa kuinka monta merkkiä. Montako kirjainta tai symboleja näppäimistöllä jos meillä on yksi tavu tai kahdeksan bittiä. Muistelen viikolla nolla. Jos sinulla on kahdeksan bittiä, kuinka monta yhteensä arvoja voi te edustatte kanssa kuvioita nollia ja ykkösiä? One-- enemmän. Joten 256 yhteensä, jos alkaa laskea nollasta. Joten jos sinulla on kahdeksan bits-- joten jos me oli meidän binary sipulit täällä taas, voisimme kääntää nämä lamput ja pois Jonkin 256 ainutlaatuisia kuvioita. Nyt tämä on vähän ongelmallista. Ei niinkään Englanti ja romantiikkaa kieliä, mutta varmasti kun käyttöön, sillä Esimerkiksi Aasian tekstit, jotka on paljon enemmän symboleita kuin kuin 26 aakkosten kirjainta. Me itse asiassa ehkä enemmän kuin yksi tavu. Ja onneksi vuonna Viime vuosina on yhteiskunnan hyväksyi myös muita standardeja, jotka käyttävät enemmän kuin yksi tavu per lataus. Mutta nyt C, oletus on vain yksi tavu tai kahdeksan bittiä. Kokonaisluku puolestaan ​​on neljä tavua, joka tunnetaan myös 32 bittiä. Mikä tarkoittaa sitä, mitä on suurin mahdollinen numero voimme edustaa kanssa int ilmeisesti? Kanssa miljardia. Joten se on neljän miljardin antaa tai ottaa. 2 32th valtaa, jos me ota negatiiviset luvut ja vain käyttää kaikki positiiviset numeroita, se on neljään miljardiin antaa tai ottaa mahdollisuuksia. Float puolestaan ​​on erityyppinen Tietojen tyyppi C. Se on edelleen numero, mutta se on todellinen määrä. Jotain desimaalipilkun. Ja käy ilmi, että C käyttää myös neljä tavua edustamaan liukuluvuiksi. Valitettavasti kuinka monta kelluva pistearvot ovat siellä maailman? Kuinka monta todelliset luvut ovat siellä? On äärettömän numero, ja että asia siellä on ääretön määrä kokonaislukuja. Joten olemme jo tavallaan kaivaa itsemme reikä täällä. Jolloin ilmeisesti computers-- osoitteessa Ainakin kirjoitettuja ohjelmia C them-- voidaan laskea ainoastaan ​​peräti neljän miljardin antaa tai ottaa, ja liukulukuarvoja voi vain näennäisesti on jonkin verran rajallinen määrä tarkkuutta. Vain niin monta numeroa jälkeen niiden desimaalipilkun. Koska tietenkin, jos sinulla on vain 32 bittiä, En tiedä, miten aiomme edetä edustaa todellista numbers-- luultavasti erityyppisiä kuvioita. Mutta on varmasti rajallinen useita tällaisia ​​malleja, joten tässäkin tämä on ongelmallista. Nyt voimme välttää hieman. Jos et käytä float, voit käyttää kaksinkertaista C, joka antaa sinulle kahdeksan tavua, joka on paljon enemmän mahdollisia malleja nollien ja niitä. Mutta se on silti rajallinen, joka on menossa ongelmalliseksi, jos kirjoitat ohjelmisto grafiikkaa tai fancy matemaattisia kaavoja. Niin saatat todella haluavat laskea jopa suurempi kuin tuo. Pitkä long-- stupidly named-- on myös kahdeksan tavua, tai 64 bittiä, ja tämä on kaksi kertaa niin pitkä kuin int, ja se on pitkään kokonaisluku. Fun fact-- jos int on neljä tavua, kuinka pitkä on pitkä C tyypillisesti? Myös neljä tavua, mutta pitkä pitkä on kahdeksan tavua, ja tämä on historiallisista syistä. Mutta takeaway nyt on vain, että tietoja on olla edustettuna computer-- joka on fyysisen laitteen sähköä, se on yleensä ajo nämä nollat ​​ja ones-- joilla on rajallinen määrä tarkasti. Joten mikä on ongelma sitten? No siellä ongelma on kokonaisluvun ylivuoto. Ei vain C, mutta tietokoneissa yleensä. Esimerkiksi, jos tämä on tavu arvoinen bit-- joten jos tämä on kahdeksan bit-- kaikki joista numero yksi. Mikä numero on tämä eli jos oletamme se kaikki positiiviset arvot binary? 255, ja se ei ole 256, koska nolla on pienin numero. Joten 255 on korkein yksi, mutta ongelma on olettaa, että halusin increment tämä muuttuja käyttää kahdeksan bittiä yhteensä jos haluan kasvattaa sitä. Ja heti kun olen lisännyt yksi kaikkiin näihin niistä, voit ehkä kuvitella visually-- vain kuin kantaisi käyttävällä decimals-- jotain tulee virrata vasemmalle. Ja todellakin, jos voin lisätä numeron yksi tähän, mitä tapahtuu binary on, että se vuotaa yli takaisin nollaan. Joten jos vain use-- ole int, mutta yhden tavun laskea kokonaislukujen ohjelmassa, jonka default-- heti saat 250, 251, 252, 253, 254, 255-- 0 tulee sen jälkeen 255, joka ei luultavasti ole mitä käyttäjä tulee odottaa. Nyt puolestaan ​​liukulukukoodattujen maailmassa, sinulla on myös samanlainen ongelma. Ei niin paljon, joilla on suurin number-- vaikka se on edelleen ongelma. Mutta määrä tarkkuus että voit edustaa. Joten katsomaan tätä esimerkkiä täällä myös nykyisestä lähteestä code-- float-0.c. Ja huomaa sitä erittäin yksinkertainen ohjelma, joka olisi ilmeisesti tulostaa mitä arvoa? Mitä vetoa tämä tulee tulostaa vaikka siellä on vähän uusia syntaksin täällä? Joten toivottavasti 0.1. Joten vastaava yksi kymmenesosa koska mulla 1 jaettuna 10. Olen tallentamiseen vastaus muuttujaan nimeltä f. Että muuttuja on tyyppiä float, joka on avainsana olen vain ehdottanut olemassa. Emme ole nähnyt tätä ennen, mutta tämä on tavallaan siisti tapa printf määrittää, kuinka monta numeroa olet halua nähdä jälkeen desimaalipilkun. Joten tämä merkintä tarkoittaa vain että tässä on paikanvaraajaan. Se on liukuluku arvo, ja oh, muuten, näytä sitä desimaalipilkun kanssa yksi numero desimaalipilkun jälkeen. Niin, että numero on merkitsevää numeroa, niin sanoakseni, että saatat haluta. Joten anna minun mennä eteenpäin ja tehdä tehdä float-0, ./float-0, ja ilmeisesti 1 jaettuna 10 on 0,0. Nyt miksi näin? No jälleen, tietokone vie minulle kirjaimellisesti, ja olen kirjoittanut 1 ja minä kirjoitettu 10, ja arvaa mitä on oletettu tietotyyppi näiden kahden arvot? Int, se on teknisesti jotain hieman erilaista. Se on yleensä pitkä, mutta se on lopulta kiinteä arvo. Ei Liukulukuarvo. Joka on sanoa, että jos tämä on int ja tämä on int, Ongelmana on, että tietokone ei ole mahdollisuutta jopa tallentaa joka desimaalipilkun. Joten kun teet 1 jaettu 10 käyttäen kokonaislukuja Sekä osoittaja ja nimittäjä, vastaus olisi 0,1. Mutta computer-- koska nämä ovat integers-- ei tiedä mitä tehdä 0.1. Joten mitä se selvästi tekee? Se vain heittää sen pois, ja mitä näen lopulta on 0,0 vain siksi vaadin, että printf näyttää minulle yhden desimaalin tarkkuudella. Mutta ongelma on, että jos jakaa kokonaisluvun kokonaisluku, voit kuin-- määritelmän ja C-- kokonaisluku. Ja se ei tule tehdä jotain mukavaa ja kätevästi kuten pyöristää sen lähin ylös tai alas. Se tulee katkaista kaiken jälkeen desimaalin. Niin vain intuitiivisesti, mikä on luultavasti korjata? Mikä on yksinkertaisin korjata täällä? Joo? Täsmälleen. Miksi emme vain hoitaa näitä kuin liukulukuarvoja tehokkaasti kääntämällä ne kellukkeet tai kaksinkertaistuu. Ja nyt jos en tee kellukkeet-0, tai jos olen koota kellukkeet-1, joka on identtinen mitä oli juuri ehdotti. Ja nyt minä kellukkeet-0, nyt saan 0.1. Nyt tämä on hämmästyttävä. Mutta nyt aion tehdä jotain hieman erilaista. Olen utelias näkemään, mitä todella takana tapahtuu huppu, ja aion tulostaa tämän ulos 28 desimaalin tarkkuudella. Haluan todella nähdä 0.1000-- infinite-- [Äänetön] 27 nollia jälkeen 0.1. No katsotaanpa jos se mitä minä todellakin saada. Tee kellukkeet-0 samaa tiedostoa. ./floats-0. Katsotaanpa zoomata dramaattinen vastaus. Koko tämän ajan olet ollut ajatellut 1 jaettuna 10 on 10%, tai 0,1. Se ei ole. Ainakin siltä osin kuin tietokoneen osalta. Nyt why-- OK, se on täydellinen valhe 1 jaettuna 10 on 0,1. Mutta why--, että ei ole takeaway tänään. Joten miksi tietokone ajatella, toisin kuin meille kaikille huoneessa, , että 1 jaettuna 10 on todella että hullu arvo? Mikä on tietokone tekee ilmeisesti? Mikä se on? Se ei ole ylivuoto, sinänsä. Ylivuoto on tyypillisesti silloin, kun voit kietoa arvo. Se on tämän kysymyksen epätarkkuuden in Liukulukuarvo jos sinulla on vain 32 tai ehkä jopa 64 bit. Mutta jos on ääretön useita todellisia numbers-- numerot desimaaleja ja numerot thereafter-- varmasti et voi edustaa niitä kaikkia. Näin tietokone on antanut meitä lähin vastaava arvoon se voi edustaa käyttäen, että monta bittiä arvoon minä todella haluavat, joka on 0,1. Valitettavasti, jos alkaa tehdä matematiikkaa, tai et aloittaa joihin tällaiset kelluvat pistearvot tärkeissä programs-- Financial Software, sotilaallinen software-- mitään jos käsitys on luultavasti aika tärkeä. Ja aloitat lisäämällä numeroita, kuten tämä, ja alku käynnissä että ohjelmisto todella suuret panokset tai paljon tunnin tai erien päivien tai paljon vuosia, nämä pikku virheitä varmasti voi lisätä ajan mittaan. Nyt syrjään, jos olet joskus nähnyt Superman 3 tai Office Space ja saatat muistaa miten nämä kaverit varasti paljon rahaa heidän tietokone käyttämällä liukulukuarvoja ja laskemalla vähän jäännöksiä, toivottavasti elokuva nyt järkevämpää. Tämä on mitä he olivat viittaamatta siinä elokuvassa. Se, että useimmat yritykset eivät katso sen jälkeen, kun tietty määrä desimaaleja, mutta ne ovat jakeet senttiä. Joten voit aloittaa lisäämällä niitä, voit alkaa tehdä paljon rahaa pankkitilille. Niin, että Office Space selitti. Nyt valitettavasti yli Toimistotilaa, siellä On joitakin perustellusti huolestuttavia ja merkittäviä vaikutuksia Tällaisten taustalla suunnittelun päätöksiä, ja todellakin yksi syy käytämme C aikana on niin, että sinulla on todella tällä perusteella jopa käsitys siitä, miten tietokoneet toimivat, miten ohjelmisto toimii, eivätkä ota mitään itsestään selvänä. Ja todellakin valitettavasti, vaikka että peruskäsitys, me ihmiset tekevät virheitä. Ja mitä minä ajattelin jakaa on Tämän kahdeksan minuutin video tästä ottanut alkaen moderneja ihmeitä episodi, joka on koulutus näyttää, miten asiat toimivat että maalit kaksi kuvaa milloin virheellisestä käytöstä ja ymmärrystä liukulukuarvoja johti joitakin merkittäviä valitettavaa tuloksia. Katsotaanpa katsomaan. [VIDEOTOISTOSTA] -Meidän Nyt palata "Engineering Katastrofit "on moderneja ihmeitä. Tietokoneet. Olemme kaikki tulevat hyväksymään usein turhauttavaa ongelmia, jotka sai kanssa them-- vikoja, viruksia, ja ohjelmisto glitches-- pienille hinnat maksaa mukavuutta. Mutta korkean teknologian ja korkean nopeuden sotilaallinen ja avaruusohjelma sovelluksia, pienin ongelma voi suurennetaan katastrofiin. Kesäkuun 4. päivänä 1996 tutkijat valmistettu käynnistää miehittämättömän Ariane 5 raketti. Se kantoi tieteellistä satelliittien suunniteltu vahvistaa tarkasti, miten Maan magneettikenttä vuorovaikuttaa aurinko tuulet. Raketti rakennettiin Euroopan avaruusjärjestö ja nostetaan pois sen laitos rannikolla Ranskan Guayana. -At Noin 37 sekunnin lennon, he ensin huomasi jotain oli vialla. Että suuttimet kääntyvä tavallaan he todella pitäisi. Noin 40 sekunnin lennon, selvästi ajoneuvon oli vaikeuksissa, ja silloin he tekivät Päätös tuhota sen. Alue turvallisuudesta vastaavan johtajan kanssa valtava sisua, painetaan nappia ja räjäytti raketin ennen kuin se voisi tulla vaaraa yleiselle turvallisuudelle. -Tämä oli neito matkan Ariane 5, ja sen tuhoaminen kesti koska oli virhe upotettu raketti ohjelmisto. P ongelma Ariane oli, että oli numero, joka tarvitaan 64 bittiä ilmaista, ja he halusivat muuttaa sen 16-bittinen numero. He olettivat, että numero ei koskaan tule olemaan kovin suuri. Että useimmat niistä numeroa 64-bittinen numero olivat nollia. He olivat väärässä. P kyvyttömyys yhden ohjelma hyväksyä sellainen numero, joka generoidaan toinen oli juureen vika. Ohjelmistokehitys oli tullut erittäin kalliiksi osa uutta teknologiaa. Ariane 4 raketti oli onnistunut hyvin. Niin paljon ohjelmisto luotu sitä käytettiin myös Ariane 5. P perusongelmana oli, että Ariane 5. On faster-- kiihtyi nopeammin, ja ohjelmisto ei ollut osuus siitä. P tuhoaminen raketti oli valtava taloudellinen katastrofi. Kaikki johtuu minuutin ohjelmiston virhe. Mutta tämä ei ollut ensimmäinen aikaa tietojen muuntaminen ongelmia oli vaivannut moderni ohjusteknologia. -In 1991 alku Ensimmäisen Persianlahden sodan, Patriot ohjus kokenut samankaltaisia Useiden muuntaminen ongelma. Ja sen seurauksena 28 people-- 28 Amerikkalainen soldiers-- kuoli, ja noin sata muuta haavoittui. Kun Patriot, jonka piti suojaamaan saapuvan Scuds, ei osunut. Milloin Irak hyökkäsi Kuwaitiin, ja Amerikassa käynnistettiin Desert Storm alkuvuodesta 1991, Patriot ohjusten akut lähetettiin suojella Saudi-Arabian ja Israelin Irakin Scud ohjus hyökkäyksiä. Patriot on Yhdysvaltain keskipitkän kantaman pinta-ilmaan-järjestelmä valmistanut Raytheon yhtiön. P koko Patriot keräilyaltaan itself-- se on noin noin 20 metriä pitkä, ja se painaa noin 2000 kiloa. Ja se harjoittaa taistelukärjellä noin, Minusta se on noin 150 kiloa. Ja ydinpommi itse voimakas räjähdysaine, joka on fragmentteja hänen ympärillään. Joten kotelo ydinpommi on suunniteltu toimimaan kuten Buckshot. P ohjukset kuljetetaan neljä per kontti, ja kuljetetaan puoliperävaunu. P Patriot ohjuspuolustusjärjestelmä ulottuu vähintään 20 vuotta. Se oli alun perin suunniteltu kuten ilmatorjuntaohjusjärjestelmään ampua alas vihollisen lentokoneita. Ensimmäisessä Persianlahden sodassa kun että sota tuli, Army halusi käyttää sitä ampua alas Scuds, ei lentokoneita. Irakin ilmavoimat oli ei niin suuri ongelma, mutta armeija on huolissaan Scuds. Ja niin he yrittivät päivittää Patriot. -Intercepting Vihollinen ohjus kulkee Mach 5 tultaisiin riittävän haastava. Mutta kun Patriot kiidätettiin palvelu, armeija ei ollut tietoinen Irakin muutoksia, jotka tekivät Scuds lähes mahdotonta sen. Mitä tapahtui on Scuds että oli tulossa oli epävakaa. He olivat huojuva. Syynä tähän oli Iraqis-- saadakseen 600km ulos ja 300 kilometrin välillä missile-- otti painoa pois edestä ydinpommi, ja teki ydinpommi kevyempi. Joten nyt Patriot yrittää tulla klo Scud, ja suurin osa time-- Valtaosa time-- se vain lentää Scud. -Kun Patriot verkonhaltijoiden tajusi Patriot jäi tavoitteestaan, ne räjähti Patriot ydinpommi välttää mahdolliset onnettomuudet, jos se annettiin pudota maahan. Tuo oli se, mitä useimmat ihmiset näkivät yhtä suuri tulipalloja taivaalla, ja ymmärtää väärin kuuntelevansa Scud ydinkärkien. -vaikka Vuonna yötaivas, Patriots näytti onnistuneesti tuhoamalla Scuds kello Dhahran voisi olla erehtykö sen suorituskykyä. Siellä Patriot tutkajärjestelmää kadottaa saapuvan Scud ja koskaan käynnistetty takia että ohjelmisto virhe. Se oli israelilaisia, joka ensimmäisenä löysi että pidempi järjestelmä oli, enemmän aikaa ero tuli. Johtuen kellon upotettu järjestelmän tietokoneelle. -Noin Kaksi viikkoa ennen tragedia Dhahran, Israelilaiset ilmoitetaan puolustusministeriön että järjestelmä oli menettää aikaa. Noin kahdeksan tuntia käynnissä, he huomasivat että järjestelmän tulee huomattavasti epätarkempi. Puolustusministeriö vastasi kertoo kaikki Patriot paristot ja jättää järjestelmiin on pitkään. Ne koskaan sanonut, mitä pitkään oli. 8 tuntia, 10 tuntia, tuhat tuntia. Kukaan ei tiennyt. P Patriot akku sijoitettiin kasarmi klo Dhahran ja sen puutteellinen sisäinen Kello oli ollut käynnissä jo yli 100 tuntia välisenä yönä 25. helmikuuta. -se Seurata aika tarkkuus noin kymmenesosa toinen. Nyt kymmenesosa toinen on mielenkiintoinen numero koska se ei voi ilmaista binary tarkalleen, mikä tarkoitetaan sitä ei voida ilmaista tarkasti missä tahansa nykyaikaisessa digitaalisen tietokoneen. On vaikea uskoa, mutta käyttää esimerkkinä. Otetaanpa numero kolmasosaa. Kolmasosa ei voi olla ilmaistaan ​​desimaalilukuna tarkalleen. Kolmasosa on 0,333 jatkunut jo ääretön. Ei ole mitään keinoa tehdä sitä absoluuttinen tarkkuus desimaalin. Juuri sellainen ongelma joka tapahtui Patriot. Kauemmin järjestelmä juoksi, huonompi aika virhe tuli. -Kun 100 käyttötunnin virheestä ajassa oli vain noin kolmasosa toisen. Mutta suhteen kohdistaminen ohjus kulkee Mach 5, se johti seuranta virhe on yli 600 metriä. Olisi kohtalokas virhe että sotilaat Dhahran. Mitä tapahtui on Scud lanseeraus oli havaita ennakkovaroituksen satelliitit, ja he tiesivät Scud oli tulossa heidän yleinen suunta. He eivät tiedä, mistä se tuli. Nyt oli jopa tutka osa Patriot järjestelmän puolustaminen Dhahran paikantaa ja pitää kirjaa saapuvan vihollisen ohjuksia. P tutka oli hyvin älykäs. Olisi todella seurata asema Scud ja sitten ennustaa, se todennäköisesti olisi seuraavan kerran tutka lähettää pulssin ulos. Jota kutsuttiin alue portti. Sittenhän kun Patriot päättää tarpeeksi aikaa on läpäissyt mennä takaisin ja tarkista seuraava paikka tämä havaittu kohde se menee takaisin. Joten kun se meni takaisin väärin paikka, sillä silloin ei näe mitään esinettä. Ja päättää, ettei esinettä. Että oli väärä tunnistus ja se putoaa radalla. P saapuvan Scud katosi tutkanäytöltä, ja sekuntia myöhemmin, se lyönyt osaksi kasarmi. Scud tappoi 28. Se oli viimeinen potkut ensimmäisen Persianlahden sodan. Traagisesti, päivitetty ohjelmisto saapui aamunkoitteessa seuraavana päivänä. Ohjelmisto virhe oli ollut kiinteä, sulkeminen yhden luvun levoton historia Patriot ohjus. [END VIDEOTOISTOSTA] DAVID J. MALAN: Se on se CS50. Nähdään keskiviikkona. [Musiikki soi]