[Powered by Google Translate] § Harjoitus 2: Hacker Edition Rob Bowden, Harvardin yliopisto Tämä on CS50. CS50.TV Joten, olen Rob. Olen vanhempi Kirkland. Tämä on kolmas vuosi TFing CS50. Se on ensimmäinen kerta, kun olemme muuttumassa perinteisestä luento-tyylinen kappale, jos me vain eräänlainen katsaus mitä tapahtui luento ja sitten te kysyä kysymyksiä, nyt on paljon enemmän ongelmalähtöinen, jossa käytämme tilat, ja - Voi, niin ajatus on mennä, että linkin Minä olen lähettänyt teidät ja sitten voit olla minun Space. Onko kellään ole kannettavaa tietokonetta? Okei. Joten aiomme käyttää tätä, ja aiomme tehdä ongelmien elää osiossa ja keskustella niistä ja mietitään mikä hätänä ja voisin vetää joitakin koodin, ja voisin keskustella ideoista. Joten onko kukaan ollut vaikeuksia? Voit keskustella puolella, en tiedä, jos meillä on syy. Nyt, kuten edellinen supersection, jos olisit tuossa luokassa, tiedät mitä se on noin. Kaikissa P settiä siellä tulee olemaan näiden osia. Joten P-sarja 2, tekniset, kai näit sen P-set 1 jo. Mutta voimme tarkastella P-sarja 2 mitä aiomme olla ylittämättä tänään. Ja näet osan kysymyksistä. Joten tämä tulee olemaan kaikki P-sarjat; siellä tulee olla osa kysymyksiä. Toistaiseksi olemme sanoneet, "Mieti tätä tilaisuutta harjoitella." Sinua ei pyydetä esittämään tätä ohjelmaa. Ajatus on, että nämä on tarkoitus sellainen auttaa pääsemään alkuun Harjoitus. Luulen päälle Hacker painos, monet heistä on tarkoitus vain olla uusia, mielenkiintoisia asioita oppia. Ne eivät saa olla suoraan sovellettavissa ongelmaan asetettu. Ja nyt emme ottaa lähetät heidät, mutta teoriassa, myöhemmin ongelma asetetaan, saatat lähettää ne, ja näin voit joko tulla § tai katsella osiossa saada vastauksia, tai voit vain saada ne omalle jos ei huvita nauttia olotila. Joten - Mielestäni tämä on ensimmäinen. Oh. Myös näissä kohdissa kysymyksiä meillä on myös kysyt kysymyksiä shortsit. Joten kai teoriassa, sinun pitäisi katsella näitä ennen tuloaan §, mutta se on hienoa, jos et, menemme yli niitä joka tapauksessa. Joten voimme aloittaa näillä: "Miten while-silmukka eroaa do-while-silmukka? Kun on jälkimmäinen erityisen hyödyllistä? " Joten kellään mitään -? [Opiskelija] do-while-silmukka aina suorittaa vähintään kerran. Kyllä. Niin, että on ero. While-silmukka - Minä vain tehdä sen täällä - kun silmukka, olemme kunnossa täällä taas tee-aikaa, sinulla ei ole kunnossa kunnes saamme tänne. Ja niin, kun ohjelman täytäntöönpanosta, ja se pääsee taas silmukka, se välittömästi tarkistaa, jos tämä ehto on tosi. Jos tämä ehto ei ole totta, se vain ohittaa silmukan kokonaan. Do-while-silmukka, koska ohjelma on täytäntöönpanovaltiossa, se saa "tehdä." Mitään ei tapahdu tässä vaiheessa, vain jatkaa suorittamista. Sitten kun se osuu "taas" jos ehto on tosi, se tulee silmukka takaisin ja tehdä se uudestaan ja uudestaan ​​ja uudestaan, kunnes ehto ei ole totta, ja sitten vain kuuluu läpi. Niin, eron ollessa, että tämä voidaan hypätä suoraan alusta alkaen. Tämä väistämättä suorittaa kerran ja sitten voi suorittaa useampaan kertaan, jos ehto on edelleen tosi. Joten vaikka silmukka tehdä vain sen kerran, tai - kun silmukka - meidän ei ehkä tarvitse tehdä sitä ollenkaan, sillä heti kun saamme sen, jos ehto on epätosi, me vain hypätä suoraan sen yli. Katsoo do-while-silmukka, me suorittaa sen kerran, välttämättä. Sitten, kun pääsemme kunnossa, tarkista onko se totta vai tarua. Jos se on totta, teemme sen uudestaan, jos se on väärä, me vain edelleen menossa. Joten kun on jälkimmäinen erityisen hyödyllistä? Voin siis sanoa, että kokonaisuudessaan 4 vuotta, 3 vuotta, riippumatta, että olen ohjelmointia, olen käyttänyt tätä, kuten, alle 10 kertaa. Ja luultavasti 5 niistä ovat CS50 kun otamme käyttöön do-while silmukoita. Joten kun teet käytetään tee-ja silmukoita? Kun on - joo? [Opiskelija] Kun yrität saada käyttäjä syöttää, tai jotain haluat tarkistaa - Joo. Niin-ja silmukoita, käyttäjä syöttää on iso. Siksi ensimmäisenä pari ongelmaa sarjaa, kun haluat kysyä käyttäjälle, kuten, "Anna minulle merkkijono," et voi jatkaa, kunnes saat että merkkijono. Ja niin te välttämättä, täytyy kysyä merkkijonon ainakin kerran. Mutta sitten jos ne vastaavat jotakin pahaa, niin sinun täytyy silmukka takaisin ja kysy uudestaan. Mutta muut kuin käyttäjän syötettä, se on hyvin harvinaista, että olen kohtaavat tapaus minne haluan loop "ainakin kerran", mutta ehkä enemmän. Kysymyksiä tai -? Onko kukaan käyttänyt do-while-silmukka muualla? Okei. Joten seuraava on "Mitä pimeän tunnus yleensä ilmoittaa jos ulostulevien kalahtaa? " Millainen koodin voisin kirjoittaa saada "pimeän tunniste? ' [Student], että x = 2? Joten voimme vain kokeilla sitä täällä, x = 2. Me suorittaa tämän - oh, en osoita sitä. Joten tässä saamme - kaikki hyvin. "Käytä pimeän tunnisteen x." Niin, että pimeä tunniste muuttuja. Se usein kutsuvat muuttujan tunniste. Joten se ei ehkä tiedä se on todella vaihteleva, se ei tiedä, mitä se on. Joten se on tunniste. Joten miksi se pimeää? Joo. Joten on selvää terminologiasta, ilmoitus muuttujan on, kun sanot "int x" tai "string y," mitä tahansa. Alustuksen muuttuja, tai tehtävän muuttujan, on aina sanoa "x = 2". Joten voimme tehdä näitä erillisinä vaiheina, int x, x = 2, ja kunnes - voimme olla nippu tavaraa täällä - mutta ennen tätä linjaa tapahtuu, x on edelleen alustamattoman, mutta se on ilmoitettu. Ja jotta voimme tietenkin tehdä sen 1 rivi, ja nyt olemme julistaa ja alustetaan. Kysymyksiä? Ja lopuksi: "Miksi Caesar Cipher ole kovin turvallinen?" Joten ensimmäinen, ei kukaan halua sanoa, mitä keisarille Cipher on? [Student] Caesar Cipher vain on, että voit kartoittaa, voit siirtää jokaiseen kirjeeseen, tietty määrä kirjeitä mennä yli, ja muuttaa takaisin päälle, ja se ei ole kovin turvallinen, koska on vain 26 mahdollisia vaihtoehtoja ja sinun täytyy vain yrittää kukin 1 näistä kunnes saat sen. Oh. Joten minun pitäisi toistaa? Caesar Cipher, Se on - tarkoitan, sinun on tekemisissä sen kanssa ongelmia, että te - tai kai Standard Edition ongelman joukko, joka ei päällä hakkeri painos. Joten Standard Edition ongelmaan asetettu, saat viestin, kuten "Hei, maailma" ja sinulla on myös useita, kuten 6, ja otat tämän viestin, ja kunkin merkin käännät sen 6 kantoja aakkoset. Joten 'h' hei tulisi h-i-j-k-l-m-n. Joten ensimmäinen kirjain olisi n.. Teemme sama juttu e.. Jos meillä on, kuten, z tai jotain, sitten kääri takaisin ympäri "." Mutta kukin merkki saa kierrättää 6 merkkiä myöhemmin aakkoset, ja se ei ole kovin turvallinen sillä on ainoastaan ​​26 mahdollisuuksia kuinka monella tavalla voit kääriä yhden kirjaimen. Joten voit vain kokeilla kaikki 26 niistä, ja oletettavasti pitkään riittävän viesti vain 1 niistä mahdollisesti 26 asioita tulee olemaan luettavissa, ja luettavissa kukaan tule olemaan alkuperäisen viestin. Joten se ei ole kovin hyvä tapa salaamalla yhtään mitään. Liity nuo shortsit, "Mikä on funktio?" Joten mikä on funktio? Kyllä. [Student] Se on kuin erillinen koodinpätkä, että voit soittaa läpi ja sitten saada palauttaa arvon riippumatta. Joo. Joten minä vastaamme siihen myös vastaamalla seuraavaan - tai toista mukaan myös vain vastaamalla seuraavaan. Voit käyttää toimintoja eikä vain kopioimalla koodi uudestaan ​​ja uudestaan. Ota vain se koodi, laita se fuction, ja sitten voisi vain soittaa toiminto missä olet ollut kopioimalla. Joten toiminnot ovat käyttökelpoisia. Joten nyt teemme todellisia ongelmia. Ensimmäinen. Joten ajatus ensimmäinen on, ohitat sen merkkijono, ja riippumatta - tai se sano pieniksi? Siinä ei sanota pieniksi. Joten viesti voi olla mitä tahansa, ja - oh no. Se. "Yksinkertaisuuden voit olettaa, että käyttäjä vain syöttää pieniä kirjaimia ja välilyöntejä." Joten ohitamme sen sanoman vain pieniä kirjaimia ja sitten vuorotella isojen ja pienten - muutamme merkkijono oltava isoja ja pieniä, vuorotellen. Joten ennen kuin voimme antaa teille toisen jopa sukeltaa ongelma, Mikä on ensimmäinen asia, että meidän täytyy tehdä? Voi, mitä minä klikkaa? Minä vain napsautti sähköpostin täällä. Joten ensimmäinen asia, joka meidän täytyy tehdä - olen katsot väärä? Onko tämä osa tätä? Ei, ne ovat edelleen olemassa, vaikka. Okei, vielä täällä. Nyt emme voi olettaa -? Kyllä. Täällä emme voi olettaa, että se on vain pieniä ja tilat. Joten nyt meidän on käsiteltävä sitä, että kirjaimet voivat olla mitä haluamme niiden olevan. Ja niin ensimmäinen asia haluamme tehdä, on vain saada viestin. Meidän täytyy vain saada merkkijono, merkkijono s = GetString, okei. Nyt tähän ongelmaan on olemassa pari tapaa tehdä se. Mutta olemme menossa halua käyttää bittioperaatioiden täällä. Onko ihmisiä, jotka joko eivät olleet supersection, tai jotain, ja en tiedä mitä bittioperaatioiden ovat? Tai miten ne liittyvät ASCII millään tavalla? [Opiskelija] en ollut supersection, mutta tiedän mitä bittioperaatioiden ovat. Okei. Joten en tarvitse mennä yli perusasiat niitä, mutta selitän mitä aiomme haluavat käyttää täällä. Joten '': binääriesityksen pääoman, numero on 65. Olen juuri menossa katsomaan - 41 tulee olemaan 01.000.001. Niin että olisi 65 desimaalin, joten tämä on binääriesitys merkin pääoman A. Nyt, binääriesityksen merkin pieniksi "a" tulee olemaan sama juttu, melkein. Onko tuo - 6, joo. Tämä on oikea. Joten binary pääoma, binary pieniä "." Niin huomaa että ero ja "" on tämä yksi bitti. Ja tämä sattuu olemaan 32 bittiä, bitti edustaa numero 32. Ja se on järkevää, koska on 65, "" on 97. Ero niiden välillä on 32. Joten nyt me tiedämme, että voimme muuntaa ja "" ottamalla ja bittikohtainen oring sen kanssa - joka näyttää 1. Tämä on bittikohtainen tai, 00100000, ja että annan meille "." Ja voimme saada '' to by peiton ANDing on 11, 0 tässä paikassa, 11111. Joten tämä antaa sitten meille, mitä "" oli, mutta kumoavat tämän yksittäisen bitin, joten saamme 01000001, en tiedä, jos laskin oikein. Mutta tämä tekniikka peiton oring päästä pääoman pieniksi, ja peiton ANDing päästä siitä pieniä pääoman ei ole yksinomaan A. Kaikki kirjaimet, K vs k, Z vs z, ne kaikki ovat juuri menossa eroavat tämän yhden bitin. Ja jotta voit käyttää tätä muuttaa mistä tahansa kirjain tahansa kirjain ja päinvastoin. Okei. Niin helppo tapa saada tästä - niin sen sijaan, kirjoittaa mitä 1011111 on - helppo tapa edustaa tämän numero, ja tämä ei ole yksi että menin ohi supersection, mutta tilde (~) on toinen bittioperaattori. Mikä ~ ei se tarkastelee hieman edustusta. Otetaan mikä tahansa numero. Tämä on vain joitakin binaariluku, ja mitä ~ se on se vain kääntää kaikki bitit. Joten tämä oli 1, nyt 0, tämä on 0, nyt 1, 010100. Niin, että kaikki ~ tekee. Joten 32 tulee olemaan numero - päästä eroon - joten 32 tulee olemaan numero 00100000, ja niin ~ tämän tulee olemaan Tämä numero täällä että minä anded "" kanssa. Onko kaikki nähdä, että? Tämä on melko yleinen, kuten silloin, kun haluat selvittää myöhemmin asioita, joita emme ehkä nähdä, kun haluamme nähdä, jos - tai haluamme kaiken, jokainen bitti paitsi 1 sinulla on taipumus tehdä ~ bittien että emme halua asettaa. Joten emme halua 32 bitti, joten emme ~ 32. Okei. Joten voimme käyttää kaikkia näitä täällä. Selvä, joten on hienoa, jos et ole tehnyt, meillä on hitaasti kävelevät yhdessä, tai kävellä yli tämän, joten - tätä kautta. Kävele tätä. Joten meillä on merkkijono, ja haluamme silmukan yli jokaisen merkin merkkijonon ja tehdä jotain sille. Miten siis silmukan yli merkkijono? Mitä meidän pitäisi käyttää? En aio tehdä sitä täällä. Joo. Joten minulla on iteraattori, ja hän sanoi sen, mutta mistä tiedän kuinka monta merkkiä on merkkijono? Strlen (s), i + +. Joten mitä olen tehnyt täällä ei ole paras tapa hoitaa asioita. Tietääkö kukaan miksi? Koska olet tarkkailun kielen merkkijono joka ikinen kerta. Joten aiomme haluat siirtää strlen, voisin sanoa täällä, int pituus = strlen (s), ja sitten voin > 1 bitti. Se voisi olla enemmän kuin 1 bitti, niin kauan kuin kaikki bitit alle tämän kannan ovat samat. Tarvitsemme siis vähintään 26 merkkiä - tai on 26 merkkiä. Tarvitsemme siis ainakin 26 numeroa edustamaan eroa - Ero ja 'a' on oltava vähintään 26, tai muuten emme olisi edustettuna kaikki pääoman numerot. Tämä tarkoittaa, että jos aloitamme klo 1, se tulee käyttää kaikkia näitä bittiä, kaikki nämä ensimmäiset 5 bittiä, joka edustaa kaikkea Z. Siksi seuraava bitti, tai tämän bitin, seuraava bitti on yksi, joka on valittu erottamaan ja "." Juuri siksi, ASCII taulukossa on 5 symboleja erottaa isot kirjaimet alkaen pieniä kirjaimia. Koska ne ovat symboleja, ylimääräiset 5, joka tuo esiin 32 on ero niiden välillä. [Student] Jotta voisimme tehdä sen, koska ASCII on suunniteltu sillä tavalla. Kyllä. Mutta ASCII - erotus voi olla myös molemmat näistä bittiä. Kuten, jos oli 10000001, ja "" oli 11100001 - unohdan, mitä. Mutta jos se olisi tämä, niin voisimme silti käyttää "" - A. Se on juuri nyt ero ja 'a' on edelleen näiden 2 bittiä. Minusta se on kirjoitettu 48. Onko 32 + 64? Mielestäni on? Se olisi silti 2 bittiä, jokainen merkki, kuten, Z ja Z, K ja K ne olisivat edelleen on täsmälleen sama bittien arvoksi on asetettu lukuun ottamatta 2 bittiä. Niin kauan kuin se on aina totta, riippumatta siitä, jos käytämme ASCII tai jokin muu järjestelmä, niin kauan kuin on olemassa vain tietty määrä bittejä, jotka ovat erilaisia ​​kunkin merkin, Sitten se toimii hyvin. Se on vain 32 perustettiin, koska se on ensimmäinen voisimme mahdollisesti käyttää. >> Cool. Minulla on tapana mieluummin, jos et ole nähnyt, jos lohko on vain yksi linja, voit päästä eroon aaltosulkeita, joten olen yleensä mieluummin näin. Myös, tiedät kuinka voimme tehdä asioita, kuten s [i] + = 1? Voit myös tehdä s [i] peiton ja = 32. Ja peiton OR = 32. Myös lasketa mod 2 == 0. Muista siis, että - en kirjoita sitä - ei-nolla on tosi, ja 0 on epätosi. Eli "jos count mod 2 == 0" on sama kuin sanonta "jos ei lasketa mod 2". Olisin ehkä juuri päinvastaiseksi linjat ja sanoi, "jos count mod 2, älä TAI 1, muuten älä JA 1, "joten en tarvitse" ei. " Mutta tämä toimii yhtä hyvin. Ja mitä muuta voin tehdä täällä? Voisit yhdistää ne ternäärinen jos halusi, mutta sitten se olisi vain tehdä asiat Messier ja luultavasti vaikeampi lukea, joten emme tee sitä. Kellään mitään muita ehdotuksia? Onko kaikki ongelma pyysi? Ai niin. Joten päästä eroon näistä tyhjiä rivejä, nyt me tulostaa f,% s on yksi jouset, Me tulostaa f, s. Nyt ajaa sitä. Teinkö jotain väärin? Se \ ", haluan n. Okei. Nyt me ajaa sitä. Se luultavasti huutaa minulle. Strlen on string.h. Joten tämä on mukava asia clang se kertoo mitä se on, sijaan GCC joka vain sanoo, "Hei, unohdit jotain, en tiedä mitä se oli." Mutta tämä kertoo minulle, "Sinä tarkoitus sisällyttää string.h." Joten en ole saanut mitään, joten se ei sano mitään. Mutta me teemme heidän Esimerkiksi "thanks 4 the add". Se näyttää oikealta. Hurraa. Joten palata tärkein, en juuri koskaan tee sitä. Se on vapaaehtoinen. Ja tärkein on ainoa toiminto, jota varten se on vapaaehtoista. Jos et palauta mitään tärkein, se olettaa, että olet tarkoitus palauttaa 0. Kysymyksiä? Okei. Joten nyt toinen ongelma. "Recall viikolla 2 toiseksi luento että vaihtokauppa 2 muuttujien arvot ajamalla nuo 2 muuttujien funktio (vaikka nimeltään swap) ei juuri toimi, ainakaan ilman "osoittimia. '" Ja sivuuttaa osoittimet kunnes saamme heidät. Haluamme vaihtaa 2 muuttujia, emme käytä toimintoa tehdä se. Olemme edelleen aiomme tehdä sen tärkeimpien kuin se sanoo. Mutta käyttää näitä 2 muuttujia, emme halua käyttää tilapäistä muuttujaa. On 2 tapaa tehdä tätä. Voit tehdä sen käyttämällä perinteistä binääri toimijoille. Joten ei kukaan tiedä nopea ja likainen tapa tehdä se? Se saattaisi kestää minuutin ajattelua. Jos minulla on - Näytän ongelma niin kuin he pyytävät. Joten jos minulla on 2 muuttujia,, joka on vain kokonaisluku että he antavat minulle, ja summamuuttuja B, joka on toinen kokonaisluku, että olen antanut. Joten jos minulla on nämä 2 muuttujia, nyt haluan vaihtaa niitä. Perinteinen, käyttäen säännöllisiä binääri toimijat, tarkoitan, kuten +, -, ÷. Ei bittioperaatioiden jotka vaikuttavat binary. Joten käyttäen -, +, ÷, ja kaikki nuo. Voisimme vaihtaa tekemällä jotain = a + b, ja b = - b, = - b. Joten järki tarkistaa, ja sitten näemme, miksi se toimii. Sanotaan = 7, b = 3, niin a + b tulee olemaan 10. Joten olemme nyt asetetaan = 10, ja sitten teemme b = - b. Joten teemme b = - b, joka tulee olemaan 7 ja b = - b jälleen tai = a - b. Joka tulee olemaan 10-7, joka on 3. Joten nyt oikein, "" oli 7, b oli 3, ja nyt b on 7 ja "" on 3. Niin, että tällainen on järkevää, "a" on yhdistelmä 2 numerot. Tässä vaiheessa, "a" on yhdistelmä, ja sitten me vähentämällä pois alkuperäisen b, ja sitten me vähentämällä, mikä oli alkuperäinen "." Mutta tämä ei toimi kaikki numerot. Voit nähdä tämän, Tarkastellaan järjestelmää, joten meillä yleensä ajatella kokonaislukuja 32 bittiä. Tehdään jotain, joka on vain kuin 4 bittiä. Toivottavasti keksiä hyvä esimerkki juuri nyt. Joten tiedän, tämä on helppo. Sanotaan meidän 2 numeroa ovat 1111, ja 1111, joten olemme binary juuri nyt. Itse desimaaleja, jos haluat ajatella sitä niin, = 15 ja b = 15. Ja niin me odotamme, kun olemme vaihtaa niitä - he eivät edes tarvitse olla samat numerot, mutta tein sen näin. Tehdään niistä ei samat numerot. Tehdäänpä 1111 ja 0001. Joten a = 15 ja b = 1. Kun me vaihtaa niitä, odotamme "" on 1 ja b olevan 15. Joten ensimmäinen askel on = a + b. Meidän numerot ovat ainoastaan ​​4 bittiä leveä, joten ",", joka on 1111, + b, joka on 0001, tulee päätyä 10000, mutta meillä on vain 4 bittiä. Joten nyt = 0. Ja nyt me haluamme asettaa b = - b - Oikeastaan ​​tämä toimii edelleen täydellisesti. = - b - Katsotaan, jos tämä toimii täydellisesti. Niin sitten b = 0-1, joka olisi edelleen 15, ja sitten = a - b, joka olisi 1. Ehkä tämä ei toimi. Tunnen siellä syystä se ei toimi tavallisella. Okei, joten siitä oletuksesta, että se ei toimi säännöllisesti binary toiminnan ja aion etsiä - Aion Google nähdä, jos se on totta. Joten me haluamme tehdä sen käyttämällä bittioperaatioiden, ja vihje täällä on XOR. Joten, käyttöön XOR (^) jos et ole nähnyt sitä vielä. Se on taas bittioperaattori niin se toimii vähän kerrallaan, ja Se on - Jos on bitit 0 ja 1, niin tämä on 1. Jos sinulla on bitit 1 ja 0, se tulee olemaan 1, sinulla bitit 0 ja 0 se tulee olla 0, ja jos sinulla on bitit 1 ja 1 se tulee olemaan 0. Joten se on kuin OR. Jos jompikumpi bitit ovat totta, se on 1, mutta toisin kuin OR, se ei voi olla molemmat bitit, jotka ovat totta. TAI olisi tämä olla 1, XOR olisi tämä olla 0. Joten olemme menossa halua käyttää XOR täällä. Ajattele sitä hetki, aion Google. No, et voi lukea, että, olen tällä hetkellä XOR swap algoritmi sivu. Toivottavasti tämä selittää miksi en voi - Tämä on juuri algoritmi teimme. En vieläkään ymmärrä, miksi - Taisin juuri poimittuja huono esimerkki, mutta tässä tapauksessa, jossa "a" on tapahtunut tulla 0, saatuaan 5 bittiä, joten nyt "a" on 0, joka on ns "kokonaisluvun ylivuoto." Mukaan Wikipedia, "Toisin XOR swap, tämä muutos edellyttää, että se käyttää joitakin menetelmiä takaamaan, että x + y ei aiheuta kokonaisluvun ylivuoto. " Joten tämä ei ole ongelmia, tämä oli kokonaisluvun ylivuoto, mutta tein jotain väärin. En ole varma. Yritän keksiä toinen. [Student] No, ei ole kokonaisluvun ylivuoto kun yrität laittaa numero siellä suurempi kuin määrä bittejä olet varattu? Joo. Meillä on 4 bittiä. That's - meillä oli 4 bittiä, me yritä lisätä 1 sitä, joten päädymme 5 bittiä. Mutta viides bitti aivan katkeaa, joo. Se saattaisi - [Opiskelija] Eikö tämä heittää sinut virhe, vai että - se että heittää virhe? No siis ole mitään virhettä. Kun saat kokoonpano tasolle, erityinen hieman jossain on asetettu, että mainittu oli ylivuodon, mutta C olet sellainen vain eivät käsitellä asiaa. Et oikeastaan ​​voi käsitellä sitä ellet käytä erityisiä asennusohjeita C. Ajatellaanpa XOR swap. Ja mielestäni Wikipedia ehkä myös sanoa, että - Joten se myös esille modulaarinen aritmeettinen, joten kai olin teoriassa, tehdä modulaarinen aritmeettinen kun sanoin, että 0-1 on 15 uudelleen. Niin että saattaisi - säännöllisesti prosessori, joka tekee 0-1 = 15. Koska päädymme 0, vähennämme 1, niin sitten se vain kietoutuu takaisin ympäri 1111. Joten tämä algoritmi voisi todella työskennellä, a + b, - b, b -, joka voisi olla hieno. Mutta on joitakin jalostajat, jotka eivät tee sitä, joten se ei olisi hienoa kyseisillä niistä. XOR swap toimii kaikissa prosessori. Okei. Ajatuksena on, että sen pitäisi olla sama, vaikka. Jos käytämme XOR jotenkin saada tietoa sekä jaetaan 1 muuttujien, ja vedä sitten tietoa yksittäisten muuttujien uudelleen. Joten ei kellään ideoita / vastaus? [Student vastaus, käsittämättömällä] Joten tämä pitäisi toimia, ja myös, XOR on vaihdannainen. Riippumatta siitä, missä järjestyksessä nämä 2 numeroa sattuvat olemaan täällä, tämä tulos tulee olemaan sama. Joten ^ b on b ^. Saatat myös nähdä tämä kirjoitetaan ^ = b, b ^ =, ^ = b uudelleen. Joten tämä on oikea, ja miksi tämä toimii, ajattele bittiä. Käyttämällä pienehkö joukko, sanokaamme 11001, ja 01100. Joten tämä on "a", ja tämä on b. Joten ^ = b. Aiomme olla asettaa '' = on XOR nämä 2 asiaa. Joten 1 ^ 0 on 1; 1 ^ 1 on 0; 0 ^ 1 on 1, ja 0 ^ 0 on 0; 1 ^ 0 on 1. Joten "," jos tarkastellaan desimaaliluku, se tulee olemaan - et aio nähdä paljon suhde alkuperäisen "" ja uusi "," mutta katsot bittiä, "" on nyt kuin silmäkoko tiedot Sekä alkuperäinen "a" ja alkuperäinen b. Joten jos otamme b ^, huomaamme, että me päätyvät alkuperäiseen "." Ja jos otamme alkuperäisen "" ^ uusi "," näemme me päätyvät alkuperäiseen b. Joten (^ b) ^ b = alkuperäisen '. " Ja (^ b) ^ = alkuperäisen b. On - toinen tapa nähdä tämä on jotain XOR itsessään on aina 0. Joten 1101 ^ 1101, kaikki bitit tulee olla sama. Joten ei koskaan tule olemaan silloin 1 on 0 ja toinen on 1. Joten tämä on 0000. Sama tämän kanssa. (^ B) ^ b on kuin ^ (b ^ b). (B ^ b) tulee olla 0, ^ 0 on vain olemaan "," koska kaikki bitit ovat 0. Joten ainoat jotka tulevat olemaan, jos "" oli alun perin 1 - oli niistä. Ja sama ajatus täällä, olen melko varma, että se on myös kommutatiivinen. Joo. En sano sitä ennen se oli kommutatiivinen. ^ "," Ja se on assosiatiivinen, joten nyt (b ^) ^. Ja voimme tehdä b ^ (^). Ja niin taas saamme alkuperäisen b. Joten "a" on nyt yhdistelmä "a" ja b yhdessä. Käyttämällä uusi combo "" sanomme b = combo '"^ alkuperäistä b, saamme alkuperäisen". " Ja nyt = combo '"^ uusi b, mikä oli alkuperäinen - tai mikä on nyt mitä oli" "tai b.. Että tämä asia täällä. Tämä on = b, vanha b. Joten nyt kaikki on taas vaihtuneet järjestyksessä. Jos me todella katseli bittiä, b = ^ b, aikoo XOR nämä 2, ja vastaus tulee olemaan tämän ja sitten = ^ b on XOR-operaatio näiden 2 ja vastaus on tässä. Kysymyksiä? Okei. Niin viimeinen on hieman vaikeutuu merkittävästi. [Opiskelija] Mielestäni hän on kysymys siitä. >> Anteeksi. [Opiskelija] Mitä oikeastaan ​​nopeammin? Jos käytät tätä XOR, vai onko se jos julistaa uusi muuttuja? Joten mikä on todella nopeampi, julistaa uusi muuttuja tai käyttämällä XOR vaihtaa? Vastaus on, kaiken todennäköisyyden mukaan väliaikainen muuttuja. Ja se johtuu siitä, kun se on käännetty alas - niin on kokoonpano tasolla, ei ole sellaista asiaa kuin paikallisia muuttujia tai väliaikaisia ​​muuttujia tai tätä kamaa. He vain haluavat - siellä muistia, ja on olemassa rekistereitä. Rekisterit ovat missä asioita aktiivisesti tapahtuu. Et lisätään 2 asioita muistiin, voit lisätä 2 asioita rekistereihin. Ja voit tuoda asioita muistiin rekisterien sitten lisätä niitä, ja sitten ehkä laittaa ne takaisin muistiin, mutta kaikki toiminta tapahtuu rekistereihin. Joten kun käytät tilapäistä muuttujaa lähestymistapaa, yleensä mitä tapahtuu on nämä 2 luvut ovat jo rekistereihin. Ja sitten siitä lähtien, kun olet vaihtanut ne, se vain alkaa käyttää muita rekisteriin. Anywhere olisit käyttänyt b, se vain käyttää rekisteriä, joka oli jo tallentamiseen "." Joten se ei tarvitse tehdä mitään itse tehdä swap. Niin? [Student] Mutta se myös vie enemmän muistia, eikö? Se vain vie enemmän muistia, jos se tarvitsee tallentaa, että väliaikainen muuttuja. Kuten jos myöhemmin käyttää tätä tilapäistä muuttujaa taas jonnekin, sitten - tai voit määrittää jotain, että väliaikainen muuttuja. Joten jos missään vaiheessa "," b temp on erillisiä arvoja tai jotain, niin se tulee olla selkeä paikkoihin muistissa, mutta on totta, että monia paikallisia muuttujia, jotka ovat olemassa vain rekistereihin. Siinä tapauksessa, se ei ole koskaan laittaa muistiin, joten et koskaan tuhlaa muistia. Okei. Viimeinen kysymys on vähän enemmän. Joten tässä, tässä CS50 laitteessa on sanakirja. Ja syy tähän on, koska [? B66] on oikeinkirjoituksen tarkistus, jossa voit kirjoittaa käyttäen hash taulukoita tai yrittää tai jotain tietorakennetta. Olet menossa on kirjallisesti oikeinkirjoituksen tarkistus, ja aiot käyttää tätä sanakirja tehdä niin. Mutta tämä ongelma, olemme juuri menossa katsomaan jopa nähdä, jos yksittäinen sana löytyy sanakirjasta. Joten sen sijaan tallennetaan koko sanakirjan joissakin tietorakenteen ja sitten etsii yli koko asiakirjan onko jotain on kirjoitettu väärin, haluamme vain löytää 1 sana. Joten voimme vain skannata koko sanakirja ja jos emme koskaan löydä sanaa koko sanakirjasta, niin se ei ollut siellä. Jos me skannata koko sanakirjan eivätkä näe sanaa, niin olemme hyviä, löysimme sen. Tässä sanotaan, että haluamme alkaa tarkastella C: n tiedostojen käsittely toiminto, koska haluamme lukea sanakirja, mutta annan vihjeen tästä, mitä toimintoja kannattaa ajatella. Kirjoitan ne tilat. Joten tärkeimmät sinun kannattaa katsoa on f auki ja sitten väistämättä, f suljettu, joka menee lopussa oman ohjelman, ja f skannata f. Voit myös käyttää f lukea, mutta luultavasti halua koska - et päädy tarvitse sitä. F skannaus f on mitä aiot käyttää skannata yli sanakirja. Ja niin sinun ei tarvitse koodata ylös ratkaisun vain kokeilla ja kuten pseudo-koodi tiesi ratkaisuun, ja sitten me keskustelemme siitä. Ja itse asiassa, koska olen jo antanut sinulle nämä, jos menet mihin tahansa terminaaliin tai laitteen on kuori, Haluaisin - En yleensä - jos et ole nähnyt vielä, en tiedä jos teit luokassa, mutta mies, niin mies sivut ovat melko hyödyllisiä katsomalla melko paljon mitään toimintoa. Joten en voi tehdä, kuten, mies f, skannaus f. Tämä on nyt tietoa skannauksen F perheen toimintoja. Voisin myös tehdä mies f, avoin, ja että annan minulle yksityiskohtia siitä. Joten jos tiedät mitä toimintoa käytät tai luet koodin ja näet joitakin toiminto ja olet kuin, "Mitä tämä tekee?" Vain ihminen, että funktion nimi. On olemassa pari outo esimerkkejä, joissa saatat joutua sanoa vastaavat. Man 2, että funktion nimi, tai mies 3 että funktion nimi, mutta sinulla on vain tehdä, että jos ihminen funktion nimeä ei tapahdu työskennellä ensimmäistä kertaa. [Opiskelija] Joten luen man sivun auki, mutta olen silti hämmentynyt siitä, miten sitä käytetään ja ohjelmaa. Okei. Paljon man-sivut ovat vähemmän kuin hyötyä. He enemmän hyötyä, jos tiedät mitä he tekevät ja sitten sinun täytyy vain muistaa järjestyksessä väitteitä tai jotain. Tai he voivat antaa sinulle yleiskuvan, mutta jotkut niistä ovat erittäin ylivoimainen. Kuten F skannaus f. myös. Se antaa sinulle tietoja kaikista näistä toiminnoista, ja 1 rivi tänne sattuu sanoa, "F scan F lukee merkkijonon piste tai stream." Mutta f auki. Joten, miten käytämme f auki? Ajatus ohjelman tarvitsee tehdä tiedoston I / O on, että sinun on ensin avata tiedosto, jonka haluat tehdä asioita, ja väistämättä, lukea asioita tiedoston ja tehdä juttuja heidän kanssaan. F avoinna on mitä käytämme avata tiedostoa. Asia palaamme, niin mitä tiedosto haluamme avata, se antaa meille - täällä se sanoo "/ käyttäjä / share / dict / sanoja." Tämä on tiedosto, jonka haluat avata, ja haluamme avata - meidän on nimenomaan määrittää, haluamme avata lukea tai jos haluamme avata sitä kirjoittaa. On pari yhdistelmiä ja tavaraa, mutta haluamme avata lukemista varten. Haluamme lukea tiedostoa. Joten mitä tämä paluu? Se palauttaa tiedoston tähti (*), ja minä vain näyttää kaiken muuttuvan f, niin * uudelleen, se on osoitin, mutta emme halua käsitellä osoittimia. Voit ajatella F, f on nyt muuttuja aiot käyttää edustamaan tiedostoon. Joten jos haluat lukea tiedostoa, lukea F. Jos haluat sulkea tiedoston, suljet f. Joten ohjelman päättyessä, kun väistämättä halutaan lopettaa, mitä meidän pitäisi tehdä? Haluamme sulkea F. Joten nyt viimeinen tiedosto toiminto, että olemme menossa halua käyttää ei skannata f, f scan f. Ja mitä se tekee on se skannaa tiedoston päälle etsivät kuvio vastaamaan. Tarkasteltaessa man-sivulla täällä, näemme int f scan f jättää paluuarvo nyt. Ensimmäinen argumentti on tiedosto * stream, joten ensimmäinen väite aiomme haluat kulkea on f. Olemme skannaus yli f.. Toinen argumentti on muotomerkkijonoa. Annan teille muotomerkkijonon nyt. Mielestäni tapahtua sanoa, 127s \ n, paljon se on turhaa. Ajatus siitä, mitä se muotomerkkijonon on, on voit ajatella skannauksen F vastakohta Print F. Joten print f, tulostus f käytämme tällaista muotoa parametrin mutta painetussa f mitä teemme on - katsokaamme vastaava. Joten tulostaa f, ja siellä on todella myös F Tulosta F, missä ensimmäinen argumentti tulee olemaan f.. Kun tulostat f, voisimme sanoa jotain, "print 127s \ n", ja sitten jos ohitamme sen joitakin merkkijono, se tulee tulostaa tämän merkkijonon ja sitten uusi rivi. Mitä 127 tarkoittaa, olen melko varma, mutta en ole koskaan rajoitettu itseäni siihen, Et edes tarvitse sanoa 127 "in Print f, mutta mitä se tarkoittaa on tulostaa ensimmäinen 127 merkkiä. Joten olen melko varma, että asia on näin. Voit Googlelle siitä. Mutta seuraava olen melkein varma, se tarkoittaa että. Joten tämä on tulosta ensimmäiset 127 merkkiä, jonka jälkeen uusi rivi. F scan F nyt sijaan tarkastellaan muuttuvan ja tulostamista, se tulee katsomaan joitakin merkkijono, ja tallentaa kuvion muuttujaan. Katsotaanpa itse käyttää skannata f eri esimerkin. Joten sanokaamme meillä oli joitakin int, x = 4, ja halusimme luoda merkkijono tehty - Halusimme luoda merkkijono että oli kuin, tämä tulee esille paljon myöhemmin, jotain, joka on aivan kuin 4.jpg. Joten tämä voisi olla ohjelma, jossa sinulla on summa laskuri, Yhteenvetona Laskurin i, ja haluat tallentaa kasan kuvia. Joten haluat tallentaa i.jpg, missä i on jokin variaatio teidän silmukka. Joten miten teemme tätä merkkijono että JPEG? Jos halusi tulostaa 4.jpg, voisimme sanoa print f,% d.jpg, ja sitten se tulostaa kyseisen JPEG. Mutta jos haluamme pelastaa merkkijono 4.jpg, käytämme scan f.. Joten string s - oikeastaan ​​meillä en voi - merkki, char s, mennään 100. Olen siis vain ilmoitettu joitakin erilaisia ​​100 merkkiä, ja sitähän me väistämättä olemaan tallentamista että JPEG sisään Joten aiomme käyttää skannaus f ja muoto, miten sanoisimme% d.jpg Jotta tulostaa 4.jpg, formaatti tämä tulee olemaan% d.jpg. Joten muoto on% d.jpg, mitä haluamme korvata% d kanssa on x, ja nyt meidän täytyy tallentaa merkkijonon jonnekin. Ja minne olemme menossa tallentaa merkkijono on array s. Joten tämän jälkeen koodirivin, s, jos me painamme f% s muuttujan s, se tulee tulostaa 4.jpg. Joten f skannaus f on sama kuin skannaus f, paitsi nyt se etsii yli tämän tiedoston mitä tallentamaan s. Sitähän viimeinen väite tulee olemaan. Haluamme säilyttää - "Scan f perhe toimintoja skannaa molempien mukaan muodossa kuin yritti alla. Jos jokin on tallennettu paikkaan kohdissa saatat palata - " Ei, meillä voisi olla hyvä. Saanen ajatella toista. Joten skannaus f ei - mitä hittoa on toiminto, joka tekee sen? Joten skannaus f aio ottaa kokonaisluku ja tehdä piste jpg. Se tulee [Mumbles]. Tallenna int muuttuja merkkijono int C. Mikä on tämä muuttuja, tai mikä on tämä toiminto nimeltään? Kyllä. That's - kyllä. Joten mitä olin määrittelemällä sinulle ennen oli s print f, mikä - että paljon järkevämpää, miksi sanoin se oli paljon enemmän kuin tulosta f.. Scan f on edelleen sellainen kuin print f, mutta s print f aikoo skannata sen yli ja korvaavat muuttujat ja nyt säilytä se merkkijono. Sijaan tulostaa, se tallentaa sen merkkijono. Joten unohda se kokonaan. Voit silti ajatella formaatin määrittely niin kuin että print f. Joten nyt, jos haluamme tehdä 4.jpg asia, tekisimme s tulostaa f, x tästä. Joten mitä scan f tekee - mitä kysymykseesi tulee? [Opiskelija] Olen vain hämmentynyt siitä, mitä me yritämme tehdä täällä kanssa JPEG. Voitko selittää, että 1 enemmän aikaa? Joten tämä oli - se on vähemmän relevent F skannaus f nyt, toivottavasti se tie takaisin jonkinlainen tapa. Mutta mitä minä perin aikoi näyttää oli - tämä on oikeastaan ​​suoraan koske näitä [?? F5] Tulette käyttää S Tulosta f, missä, sano meillä on 100 kuvaa, ja haluat lukea kuvan 1.jpg, 2.jpg, 3.jpg. Joten jotta tehdä, että sinun täytyy f auki, ja sitten sinun täytyy kulkea merkkijono, jonka haluat avata. Joten me haluaisimme avata 1.jpg, jotta voidaan luoda merkkijonon, joka on 1.jpg, teemme s tulostaa f% d.jpg--meillä ei tehdä int i = 0. i <40, i + +. Joten s print f% d.jpg i. Joten kun tätä linjaa, nyt muuttuja tai matriisi n aikoo 1.jpg. Tai 0.jpg, 1.jpg, 2.jpg. Ja niin voimme avata puolestaan ​​kutakin kuvaa käsittelyssä. Niin, että mitä s tulostaa f ei. Näetkö mitä s tulostaa f tekee nyt? [Student] Okei, joten se vie - se luo merkkijono, something.jpg, ja sitten tallentaa sen. Kyllä. Se luo - tämä on toinen muotomerkkijonon, kuten skannaus f ja tulostaa f jos se lisää kaikki muuttujat toiseen väitteeseen, ehkä s eikä i.. Ehkä - Tarkoitan, näin on. Mutta mitä argumenttien järjestystä on. Se tulee lisäämään kaikkien muuttujien muotomerkkijonoa ja sitten tallentaa osaksi puskuriin, kutsumme että puskuri, se missä olemme varastointia merkkijono. Joten olemme tallentamiseen sisällä s oikein muotoiltua merkkijono,% d on korvattu kanssa 4. [Student] Joten jos teimme tämän, on muuttuva F juuri menossa jaettava uudelleen? Kyllä. Joten meidän pitäisi sulkea alkuperäisen F ennen tätä. Mutta - ja sitten myös, jos ei ole f avata tänne, niin meidän pitäisi sanoa - Joo. Mutta se avaisi sata erilaista tiedostoja. [Student] Mutta emme voi käyttää tai - okei. Okei. Joten skannaus f, f skannaus f on tavallaan sama idea mutta sen sijaan, vaan tallentaa sen merkkijono, se on enemmän kuin olet nyt menee yli pisto ja kaavoja vastaan ​​merkkijonon ja varastointi tulokset muuttujiin. Voit käyttää skannauksen F jäsentää yli jotain 4.jpg, ja tallentaa kokonaisluvun 4 osaksi summa int x. Se mitä voimme käyttää skannauksen F. F scan f aikoo tehdä komentoriviltä. Olen oikeastaan ​​aika varma, että tämä on mitä CS50 kirjasto tekee. Joten kun sanot, "saada int," se scan F-ta yli - scan f on tapa saat käyttäjän syötettä. F scan f aikoo tehdä saman mutta käyttäen tiedostoa skannata. Joten tässä, me skannauksen aikana tämän tiedoston. Kuvio yritämme sovittaa on joitakin merkkijonon, joka on 127 merkkiä pitkä seurasi uusi linja Joten olen melko varma, että voisimme jopa sanoa "täsmää s" koska sanakirjassa meillä sattuu olemaan, olemme taatusti ole sana on niin kauan, ja myös f skannata f, luulen, pysähtyy uuden linjan mitä. Mutta me ovat uuden linjan ottelu, ja - [Student] Jos emme ole uuden linjan, eikö löytää osia sanan? Se - jokainen - katsot sanakirjassa - Joten sanakirjasta, nämä ovat kaikki sanamme. Jokainen on uusi rivi. Scan f menossa hakemaan tätä sanaa. Jos emme ole uuden linjan, niin se on mahdollista, että seuraava skannaus f on juuri lukenut uuden rivin. Mutta myös uusien rivi silloin vain sivuuttaa uusi rivi. Mutta emme koskaan saa osan sanasta, koska olemme aina lukemaan jopa uuden linjan, ei väliä mitä. [Student] Mutta entä jos etsit sanaa "cissa", kuten cissa. Tuleeko se löytää sen, ja sano se ottelu? Joten tässä me - se luetaan - tämä on todella hyvä asia. Emme koskaan käyttää nykyistä - sana etsimme on ensimmäinen komentorivillä. Joten string, sana = argv 1. Joten merkkijono etsimme on argv 1. Emme ole etsimässä sanan kaikissa meidän skannaus f. Mitä teimme skannaa f on saada jokaisen sanan sanakirjasta, ja sitten kun meillä on tuo sana aiomme käyttää strcmp vertailla niitä. Aiomme vertailla sanamme ja mitä juuri lukenut tuumaa Joten väistämättä, menemme päätyä tekemään kasan scan fs kunnes se vain niin, että skannaus f palaa - se palaa yksi, niin kauan kuin se on sovitettu uusi sana, ja se palaa jotain muuta heti, kun se on jättänyt vastaavat sanan. Luemme koko sanakirjan, varastointi rivi jokaisen sanan muuttujaan s. Sitten olemme vertaamalla sanan s, ja jos vertailu == 0, strcmp sattuu tuomaan 0, jos ottelu on tehty. Joten jos se oli 0, niin voimme tulostaa f, Hyväksytty, tai sana on sanakirjassa, tai mitä haluat tulostaa f.. Ja sitten - emme halua f sulkea uudestaan ​​ja uudestaan. Tämä on sellainen asia, mitä haluamme tehdä, ja emme vain etsivät sanan sanakirjasta. Joten me voisimme tehdä, että jos me halusimme etsiä niiden malli, cissa, kuten sanoit aiemmin, jos halusimme etsiä että malli, sitten se epäonnistuu, jos koska se ei ole oikeastaan ​​sana, mutta yksi sanoja, sattuu olemaan, että siinä. Joten se vastaisi tämän sanan, mutta tämä osajoukko sana ei ole sana itse. Mutta se ei ole, miten käytämme sitä, me luet jokaisen sanan ja sitten verrataan sana meillä on tuo sana. Joten olemme aina vertaamalla täynnä sanoja. Voin lähettää viimeistelty ratkaisut myöhemmin. Tämä on tavallaan lähes oikea vastaus, luulen. [Student kommentti, käsittämättömällä] Ai, minä eroon, että ennen? Char s, kai me sanoimme 127 - Unohdan mitä suurin on. Me vain tehdä 128, joten nyt s on riittävän pitkä. Meidän ei tarvitse tulostaa mitään. Olemme myös menossa haluavat sulkea meidän tiedoston, ja että pitäisi olla noin oikea vastaus. CS50.TV