[Powered by Google Translate] [3 jakso] [vähemmän mukavaksi] [Nate Hardison] [Harvardin yliopisto] [Tämä on CS50.] [CS50.TV] Selvä, mennään alkuun. Tervetuloa Viikko 4 CS50. Jos te avata selain ja avata PSET 3, Scramble kanssa CS50, aiomme aloittaa menee osan läpi kysymyksiä siellä. Aivan kuten viime viikolla, me työskentelevät CS50 Spaces, jos voit myös vetää että jopa niin hyvin, ja jos mennä eteenpäin ja vierailla tämän linkin että minulla täällä ylhäällä. On aika aloittaa. Meillä pikku hi-ohjelma täältä. Mikään hullu. Yksi ensimmäisistä asioista mitä haluan tehdä teidän kanssa tänään mennä yli muutamia ratkaisuja Tehtävä Set 1, millaisia ​​esimerkiksi ratkaisuja, niin voit saada tuntea, millaisia ​​koodin henkilöstön kirjallisesti, millaisia ​​koodin muiden opiskelijoiden kirjoittamista, ja olet katsomaan sitä, koska tiedän, että se on outoa Kun lähetät ratkaisun ongelmaan asettaa ja saada kommentteja oman version, mutta joskus se on hyödyllistä nähdä, miten muut ihmiset tekivät sitä, varsinkin ne, jotka ovat komeita. Suurimmaksi osaksi, olin todella vaikuttunut ratkaisuja te tuotettu. En ole vielä alkaneet kartoittaa ongelman Set 2s, mutta jos he ovat kaikkea muuta kuin ensimmäinen, se tarkoittaa vain hyviä asioita. Jos katsot minun korjauksia, aloitamme aina alas Versio 1, ja aiomme ottaa vilkaista Mario ratkaisuun. Jos vedät tähän asti, nämä ohjelmat että aiomme esitellä ovat oikeita. Ei ollut oikeellisuutta kysymyksiä näistä ongelmista, vaan pikemminkin haluamme puhua hieman siitä eri suunnittelu kysymykset , joita on käytetty tässä. Yksi niistä asioista, että oli mielenkiintoista ratkaisua on, että se käyttää uuden rakenteen nimeltään punta määritellä, joskus myös nimitystä hash määritellä. Saanen suurentaa sitä täällä. # Define voit antaa nimiä näitä numeroita teidän ohjelmassa. Tällöin suurin korkeus pyramidi Mario oli 23 ja sen sijaan että 23 minun koodi- me viittaa että kova koodaus 23 - vaan tämä antaa nimen max_height tähän numeroon, joten tänne minun do-while silmukka voit itse viitata max_height sen sijaan, että numero 23 tuumaa [Opiskelija] Mitä hyötyä tehdä se? Se on hyvä kysymys. Yksi on luettavuus. Etu tämän # define on luettavuus. Kun luen tätä koodia, näen, mitä on tekeillä. Näen tässä kunnossa täällä, että testaamme varten korkeus on <0, jonka voisimme myös määritellä olla minimikorkeus tai min korkeutta. Muiden etu on se, että voin sitten lukea loput linja nähdä että olemme myös Varmistamme, että korkeus ei ole suurempi kuin Max korkeus, koska aiomme jatkaa samalla korkeus on suurempi kuin maksimi korkeus. Muiden etu on, jos olen loitontaa vähän täällä- jos juoksen tämän ohjelman ja olen suorittanut sen, sano, jossa 23 juuri nyt, se tulostaa kaikki 23 riviä tuosta vain. Mutta sano halusin muuttaa Max korkeus, ja nyt haluan rajoittaa maksimikorkeus pyramidit olevan vain sanoa-mies, joka oli funky. # Include , # define max_height, ja sanokaamme halusimme asettaa se vastaa 10. Nyt tässä vaiheessa, kaikki mitä oli tehtävä oli muuttaa tässä yhdessä paikassa. Voin kääntää koodin, ja nyt jos yritän ja kirjoita 12, se pyytää minua uudelleen. Tässä tapauksessa olemme vain käyttämällä max_height kerran. Se ei ole iso hässäkkä mennä ja muuttaa sitä kun silmukka, jos haluat. Mutta ohjelmissa missä olet viittaa samaan maaginen numero uudestaan ​​ja uudestaan, tämä # define mekanismi on todella kätevä koska olet vain muuttaa sitä kerran yläreunassa tiedostojen on tyypillisesti minne laitat ne- ja muutos siivilöityy läpi loput tiedoston. Muita asioita Halusin todeta tämän tehtävän, että ajattelin näytti todella mukava, yksi oli nimeäminen muuttujia. Näetkö tässä että meillä kokonaisluku muuttujia kutsutaan rivin ja kutsutut korkeus. Spaces, hash, se auttaa tekemään koodia hieman luettavaa, tekee siitä hieman ymmärrettävämmäksi, mitä todella tapahtuu. Tämä on päinvastoin kuin käyttäen sanoa, satunnaisia ​​kirjaimia tai vain siansaksaa kokonaan. Viimeinen asia, minä huomauttaa on, että silmukoita, usein nämä iteraattori muuttujia, nämä laskurit että käytät omassa silmukoita, se on vakio ja perinteisen käynnistää ne joko i ja sitten j ja k ja menee sieltä jos tarvitset enemmän muuttujia, ja tämä on vain yleissopimus. On olemassa paljon sopimuksia. Se riippuu ohjelmointikieli käytät. Mutta C, me yleensä aloita i. Se ei ole järkevää käyttää vaikkapa tai b tilanteesta riippuen. Siinä kaikki tämä. Jos nyt vetää Versio 2, näet toisen Mario, ja tämä on samanlainen kuin toinen, että me vain näki, mutta se tekee jotain eräänlainen jäähtyä. Jos me tarkastelemme tässä osiossa täällä sisemmän for silmukka, he käyttävät joitakin hullu näköinen syntaksin täällä juuri tätä linjaa. Tätä kutsutaan ternäärinen operaattori. Se on, jos muu selvitys tiivistetty yhden rivin. Ehto on tämä osa suluissa. Se vastaa sanomalla jos j > Sam. Sam. Kuten Sam sanoi, että lineaarinen etsintä prosessi tulee olemaan todella hidas, ja sen sijaan on binäärihakupuu, miten tämä toimii on, että joka kerta käymme läpi iteraation meidän etsiä algoritmin, aiomme jakaa luettelon puoli pääasiallisesti, kahteen pienempään luetteloihin. Ja sitten seuraavan iterointia silmukan, me jakaa sen uudelleen muihin pienempiin luetteloihin. Kuten näette, ongelma pitää saada pienempiä koska pidämme heitetään puolet luettelon joka kerta. Miten tämä hävitä työtä? Aivan kuten muistutus, mitä aiomme tehdä, jos olisimme tietokoneella ja olimme vaikkapa etsimällä numero 5 tässä luettelossa että voisimme poimia numero keskellä. Keskellä tätä luetteloa, koska on olemassa 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 numeroa, olimme poimia numero joko 4-asemassa tai 5. asemassa, ja olimme kutsua että keskellä meidän listan. Poimi numero keskellä. Sitten, aivan kuten Sam sanoi, me testata nähdä, jos se numero on sama määrää, että haluamme saada tai meidän haluamasi numero. Jos se on yhtä, niin olemme löytäneet sen. Me voitamme. Jos se ei ole yhtä, sitten on pari tapausta. Kaksi tapausta ovat joko numero on oltava suurempi kuin määrä me tarkastelemme, tai se on vähemmän kuin. Jos se on suurempi, siirrytään oikealle. Ja jos se on pienempi, me liikkumaan vasemmalle. Ja sitten me toistaa koko prosessi uudestaan joko oikealle puoli tai vasemman puolen luettelosta. Ensimmäinen ongelma nykypäivän osiossa on selvittää miten voimme todella alkaa ilmaista tämä C-koodia. Meillä pseudokoodina täällä. Mitä me alkaa tehdä on minä vetää jopa upouusi tilaa, Tallenna tämä tarkistus niin, että meillä on nämä muistiinpanot myöhemmin, me poistaa kaikki tähän, ja sitten kopioida ja liittää Harjoitus tämä tieto meidän tiloihin, ja toivottavasti tämä ei rikkoudu. Perfect. Jos te kaikki tehdä, kopioi ja liitä tämä koodi uuteen tilaan, tyhjään yksi. Kokeillaan Daniel. Jos kääntää ja ajaa tämän ohjelman, se toimii? No >> Mitä se sanoo? Se sanoo valvonta on päättymässä kuin void funktio. Joo, niin haluan kokeilla käynnissä sitä. Oletteko nähnyt tätä ennen? Tiedätkö mitä tämä tarkoittaa? Okei, leikellä tätä hieman. Se sanonta file.c rivillä 9, 1 sarakkeessa meillä virhe, kuten sanoit, ja se sanoo että se johtuvat virhe-varoitus ja palautuva varoituksen. Se näyttää jotain on tekeillä palautuva, jossa on järkeä. Meillä ei void funktio, mikä tarkoittaa, että meillä toiminto joka ei palauta mitätön. Void funktio on, joka näyttää tältä: void foo (), ja se on mitätön, koska paluu tyyppi on mitätön, mikä tarkoittaa sitä, että jos meillä olisi jotakin täällä kuten paluu 1, olimme saada kääntäjä virheen tämän. Kuitenkin meillä on ei-mitätön toiminto. Meidän ei void funktio on tässä tapauksessa meidän hakutoiminto koska sillä on paluu tyypin bool. Kun se on selvää, että ohjaus on lopussa ei-mitätön toiminto, se johtuu haku ei ole paluuta selvitys. Se ei palaa mitään tyyppi bool. Voimme korjata sen ja mitä mieltä olette search pitäisi palauttaa oletuksena? Mikä olisi oletusarvo paluuarvon haku? Koska sitähän voimme lopussa. Charlotte, onko teillä,? Totta vai tarua? >> Totta vai tarua. Kumpi? Vääriä. En tiedä. Väärä? Yritetään. Miksi sanot tuottoa väärä? Se on hyvä intuitio. [Charlotte] En tiedä. Aiomme palata vääriä tässä tapauksessa, koska tämä on meidän oletus Jos jostain syystä lista on tyhjä, tai neula että etsimme ei ole olemassa. Sitten aivan lopussa, jos emme palauta true aiemmin tätä toimintoa, me aina tiedämme, että tämä toiminto sanovat Ehei, se ei ole array. Se ei ole heinäsuovasta. Nyt jos me kääntää ja ajaa se-anna minun tallentaa, jotta voimme vetää sen ylös. Nyt jos me kääntää ja ajaa meidän ohjelma, se rakentaa. Saamme vähän nopeasti. Jos Löin 4-uh-oh. Se ei tulosta mitään. Se näyttää kaiken päättyi kunnossa. Meidän täytyy täyttää tämä tuumaa Puhuimme algoritmi pseudokoodilla hieman sitten. Haluan nähdä, tallenna, ja minä vetää että algoritmi takaisin ylös. Katsotaanpa osuma tämän kaveri. Nope. Siellä se on. Miten teemme tämän? Mikä olisi hyvä strategia liikkeellelähtö tämän koodin? Sinun täytyy valita numero keskellä. Miten valita numero keskellä array? Mitään ehdotuksia? [Student] strlen jaettuna 2. Strlen jaettuna 2. Se on hieno. Strlen toimii erityinen erilaisia ​​matriiseja. Millaisia ​​ryhmät? String taulukot, merkki taulukot. Se on niin samanlaista käsite, haluamme soveltaa, mutta emme voi käyttää strlen koska meillä ei ole joukko merkkejä. Meillä on joukko ints. Mutta mitä strlen saa meille? Tiedätkö mitä se saa meille? [Opiskelija] strlen saa meidät pituuden. Aivan, se saa meidät pituuden. Strlen saa pituus array meille. Miten saamme, että meidän binary hakuohjelma? Miten saat pituus array? [Student] strlen? Voit saada pituutta oikein muotoiltu C string array strlen. Ongelmana on kuitenkin se, että meillä ei ole string array. Jos katsomme taaksepäin tätä koodia, meillä on tämä kokonaisluku array. Mistä tiedämme, kuinka kauan se on? [Student] Onko vastaavaa yksi päätepiste, kuten int l tai jotain? On käynyt siellä oikeastaan ​​ole, joten tavallaan tämä on yksi niistä asioista, joka on vain hyvä tietää C, että ei ole mitään keinoa saada pituus array jos kaikki annan teille on jono. Siksi toimii jouset, syy strlen toimii, on sillä, jos merkkijono on muotoiltu oikein, se on, että erityinen \ 0 luonnetta aivan lopussa. Voit myös kuvitella, jos sinulla on väärin muotoiltu merkkijono ja ei ole \ 0 luonnetta siellä, niin koko juttu ei toimi. [Opiskelija] Voitteko lisätä \ 0? Voisimme tässä tapauksessa. Voisimme lisätä jonkinlainen \ 0 tai jonkinlainen merkitsee merkki ja sitten käyttää sitä. Mutta se ei ole aivan tule toimimaan koska \ 0 on char tyyppinen, ja tässä meillä ints. Toinen asia on, jos me käyttäisimme erityinen arvo kuten -1 merkitä loppua array emme voisi koskaan säilytä -1 meidän kokonaisluku ryhmät. Olisimme jumissa. On käynyt ilmi, että ainoa tapa saada pituutta of array C on todella muistaa sen kun asetat sen ja sitten siirtää se ympäriinsä array niin että kun minulla on toiminto, joka aikoo tehdä töitä on joukko kokonaislukuja tai kelluu tai kaksinkertaistuu tai mitä olet, Olen myös antaa funktion taulukon pituus, ja se mitä olemme tehneet täällä hakutoiminto. Jos katsotte, mitä olemme tehneet, kun jätämme meidän array täällä Olemme myös siirtää sen pituus, koon. Se vain käy niin, että me olemme kutsuneet tätä muuttujaa täällä, Tämä parametri tai väitteitä. Tätä kutsutaan funktion argumentti luettelon tai Parametrilistassa ja näitä kutsutaan myös väitteitä tai parametreja. Ihmiset käyttävät eri termejä eri aikoina. Olen joskus vaihtaa ne itse. Se vain on niin, että tämä muuttuja tässä on nimetty samalla Tähän # define täällä. Mutta ne eivät ole sama asia. Osakekannan väliä. Jos katsot mitä tapahtuu täällä, me julistamme meidän int array, jota olemme kutsuneet numeroita. Olemme antaneet sille meidän koko, joka vastaa meidän # define ylös yläreunassa. Se tulee olemaan 8. Ja sitten kun me sitten kutsumme hakutoiminto alhaalla, ohitamme määrä haluamme etsiä, joita olemme pyydettäessä, saanut käyttäjältä. Me kulkea array, tämä numeroita, ja sitten meillä on myös kulkemaan koko array, ja sitten arvo koko 8 saa säilyttää tai siirtynyt tämän kokonaisluku muuttuja nimeltä kokoa. Meillä on taulukon koko. Nyt jos palaamme siihen, mitä me puhuimme aiemmin, Luulen Missy esille seikka mitä piti tehdä, on saada pituus array ja jakaa sen 2, ja se antaa meille keskipiste. Katsotaanpa. Voiko olla joku kirjoittaa tämän ja tallentaa ne avaruudessa? Entä Leila? Saanko kirjoittaa tästä? Kirjoita ensimmäinen rivi, jossa otat pituus array ja saada keskipisteen ja tallentaa sen uuteen muuttuja. Annan teille muutaman sekunnin. Oletko valmis? [Student äänetön] Toki olisin voinut voit laskea keskipisteen on heinäsuovasta array sisällä hakutoiminto käyttämällä pituus heinäsuovasta array, joka on kooltaan vaihteleva? Mikään hankala täällä. [Leila] Vain koko / 2 ja juuri- Ja tallenna se ja paina Tallenna-painiketta täällä huipulla, ja me vedä se ylös. Perfect. Siellä mennään. Mahtavaa. Kuten on, tulee tämä kääntää? [Leila] Ei, se on suurempi. [Nate] Joo, niin mitä meidän pitää tehdä? [Leila] Kuten int keskipiste tai jotain. Mahtavaa. Joo, tehdään se, int keskipiste = koko. Tuleeko tämä kääntää? Katsotaanpa poistaa tämän kommentin ja saada se pois tieltä. Mitä ei koota tästä? Emme ole tekemässä mitään kokonaisluku, joten meidän täytyy tulostaa sen tai jotain. Joo, aivan. Saamme käyttämätön muuttuja. Mitä muuta ei tule toimimaan tästä? Mielestäni sanoit jotain, Sam. Puolipistettä. Joo, olen puuttuu nuo puolipistettä. Se tulee olemaan pysyvä asia koko aikana aikavälillä. Viimeinen asia Teen on laitan joitakin valkoisia tilaa kummallakin puolella Tämän operaattorin täällä, koska se on tyypillisesti miten me sen teemme mukaan meidän tyyliin opas. Meillä keskipiste meidän array. Nyt jos muistamme takaisin meidän algoritmi, Mikä oli toinen askel, että meidän piti tehdä, kun meillä keskipisteen? [Student] Jos se on suurempi [kuulumattomissa]. Joo, niin meidän täytyy tehdä jonkinlainen vertailu, ja mitä me vertaamalla täällä? Sanoit jos se on suurempi kuin. Mikä on se, että lause viittaa? Numero tulee esiin, jos se on suurempi kuin keskipiste, sitten mennä jopa array? Aivan, niin numero, joka tulee, kun me- Neula, joten olemme vertaamalla neula, ja mitä me vertaaminen neulaa? Koska neula on mitä etsimme. Olemme vertaamalla sitä päästä keskipisteen. Mutta se järkevää tarkistaa jos neula = keskipisteessä? Onko siinä järkeä? Onko kukaan eri mieltä? Annetaan sitä kokeilla, jos (neula == keskipiste). [Student] Onko printf löysit sen. [Nate] printf ("Löysimme sen! \ N"); Muuten-Olen menossa alkaa tehdä jotain erilaista täällä. Aion aloittaa laskemisesta housunkannattimet noin jos lausuntoja koko ajan vain sillä jos lisää tavaraa, niin emme saa kerääjiä. Joo, Sam. Sinulla pisteen. Ongelmana on, että keskipiste edustaa asema array, mutta voit saada sen edustamaan arvoa että kanta array. Se on hyvä piste. Oliko kaikki kuulla Sam sanoi? Hän sanoi, että midpoint kuten edustaa vain aseman jono, mutta se ei ole varsinainen alkio. Jos ajattelee koodi kirjoitettu juuri nyt, jos me tarkastelemme tätä array tänne, mikä on 8 elementtiä se, Mikä on arvo keskipisteen tulee olla tätä toimintoa? [Student] 4. [Nate] 4. Jos etsimme numero 4 - ja voimme vain ajaa tämän koodin ja laittaa vähän surullinen kasvot täällä koska emme löydä sitä, jos me suorittaa tämän koodin kuten nyt, lataamalla sen, rakennus, haluan selaa alaspäin ja jos etsimme numero 4, löysimme sen, mutta emme saaneet tätä printf kyllä. Yksi syy on se, että emme palauta true, mutta me todella löytää numero 4? Ja Sam sanoo ei. Mitä huomaamme? Olemme todella löytänyt keskipisteen, joka jos katsomme array tänne, se tulee olemaan elementti indeksi 4, että me tarkastelemme, joka on 23. Miten oikeastaan ​​tuon elementin keskipisteessä eikä vain keskipisteen itse? [Student] Olisimme tulee char tai jotain? Mikä se tehdä vain uteliaisuudesta? Voitko täsmentää hieman? Sinun täytyy muuttaa asennosta numero, joten sinun täytyy tehdä jonkinlainen yhteys-Minusta se on char, mutta se ei ehkä ole. Joo, hyvä pointti. Olemme tehneet paljon tämän muuntaa kannat otetaan merkkiä, nämä merkit, Kahden ensimmäisen ongelman sarjaa. On käynyt ilmi, että täällä, tämä on melkein samanlainen Käyttämällä i kirjaimen merkkijono, jos se on järkevää. Tässä haluamme päästä keskipisteen elementti. Miten me sen teemme? Kevin, sinulla on ehdotuksia siitä, miten voisimme tehdä? Voisit tehdä heinäsuovasta, alkusulkumerkki, mid, suljettu kiinnike. Voitko kirjoittaa, että meille? Tallenna se täällä, ja me vetää se ylös. Etsimme tällä rivillä 9, ja olemme ymmärtämättä, että emme halua verrata neulan keskipisteen, vaan haluamme verrata neulan sen elementin asemassa keskikohdassa sisäpuolella heinäsuovasta array. Cool. Siellä mennään. Joo, se näyttää aika hyvältä, jos (neula == heinäpaali [keskipisteen]). Löysimme sen. Nyt jos otamme koodi-Me varmuuskopioida hieman, Se kokoaa, se toimii, ja jos nyt etsimme 4, emme löydä sitä, koska nyt olemme todella saada numero 23. Saamme arvo 23, ja sitähän me vertaamalla meidän neula. Mutta se on hyvä. Se on askel oikeaan suuntaan. Sitähän me yritämme tehdä. Emme yritä verrata neulan vastaan ​​tehtävissä array vaan pikemminkin vastaan ​​todellinen alkiot taulukossa. Jos katsomme takaisin nyt seuraava askel meidän algoritmi, Mikä on seuraava askel? Leila on jo mainitsi sen lyhyesti. [Opiskelija] Tarkista, onko se suurempi tai pienempi kuin ja sitten päättää, mikä tapa liikkua. [Nate] Joo, niin miten me sen teemme? Voitko laittaa joskus Minä tallentaa tämän tarkistuksen, ja sitten jos laitat jotkut linjat, jotka tekevät niin. Joo, Charlotte. >> Minulla on kysymys. Eikö sen pitäisi olla keskipiste - 1, koska ensimmäinen asia on se on 0 indeksoitu, joten jos laittaa 4, se ei oikeastaan ​​merkki etsimme? Kyllä, ja toinen ongelma, että on- että on hyvä saalis, sillä mitä päätyä tapahtumassa mahdollisesti jos pidämme liikkuvat ja emme koskaan säädä aluksi? Oletan, mitä voisimme päätyä tekemään yrittää käyttää elementin 8. kannan array, joka tässä tapauksessa ei ole olemassa. Me haluamme tehdä jonkinlainen osuus siitä että meillä on joitakin nolla indeksointi. [Charlotte] Anteeksi, en tarkoittanut keskipiste - 1 hakasulkeisiin. Voimme tehdä sen. Palaamme tähän asiaan vain hieman. Kun alamme päästä varsinaiseen kiehkura, silloin me todella nähdä tämän kuvaan. Toistaiseksi voimme tehdä tämän, mutta olet täysin oikeassa. Että nolla indeksointi on, että meidän täytyy selittää. Katsotaanpa. Miten on suurempi kuin ja pienempi kuin-? [Opiskelija] saan miten suurempi ja pienempi kuin osa. En vain ollut varma mitä tulostaa jos huomaat, että se on vähemmän kuin heinäsuovasta keskipisteen tai suurempi kuin. Täällä voin pelastaa mitä I've- [Nate] Joo, jos tallennat mitä sinulla, ja me vedä se ylös. Siellä mennään. [Opiskelija] ja laitoin kysymysmerkkejä mitä en tiedä. [Nate] Tuo näyttää hyvältä. Täällä meillä kysymysmerkkejä, koska emme vielä tiedä mitä aiomme melko tehdä vielä. Mitä me haluamme tehdä-Oops, meillä on joitakin olkaimet kaikki funky meille. Me korjata nämä olkaimet. Siellä mennään. Ja niin mitä me haluamme tehdä, mukaan meidän algoritmin, Jos emme löydä neulaa? Sano siinä tapauksessa, että neula on pienempi kuin mitä me tarkastelemme. Kevin. Vain katsoa vasen puoli. Oikea, joten laitamme kommentin tänne joka sanoo "katsomaan vasemmalle puoli." Ja jos neula on suurempi kuin heinäsuovasta keskipisteessä, mitä haluamme tehdä? [Opiskelija] Sitten sinä katsot oikealla puolella. Katsokaa oikea puoli ", katso oikea puoli." Ei liian nuhjuinen. Okei, joten tässä vaiheessa, mitä etsit melko hyvä. Ongelma koodi kirjoitettu on mitä? [Student] Sinulla ei ole päätetapahtumat puolikkaat. Oikea, meillä ei ole päätetapahtumat puolikkaat. Olemme myös vain mene läpi tämän kerran. Olemme vain menossa katsomaan yhtä keskikohdassa. Joko elementti on olemassa, tai se ei ole. Jotta täydellinen tähän, meidän täytyy tehdä jonkinlainen toistoa. Meidän pitää toistaa kunnes huomaamme, että joko elementti on olemassa, koska olemme rajanneet ja lopulta löytyi se, tai se ei ole siellä, koska teimme läpi kaikki asiat asianmukaiseen puoliskot array ja totesi, että mikään ei ole siellä. Aina meillä tämä toisto tapahtuu, mitä aiomme käyttää? [Opiskelija] silmukka. Jonkinlainen silmukka. Kyllä. [Student] Voimmeko tehdä do-while-silmukka ja saada se tehdä sitä ja sitten kun neula ei vastaa-En ole varma minne olin menossa sitä. Mutta tavallaan kuin tehdä niin kauan kuin se ei ole sama arvo, että käyttäjä syöttää. Joo, niin katsotaanpas, miten tämä voisi kirjoittaa itse? Sanoit Katsotaanpa käyttää do-while-silmukka. Mistä tehdä alku? [Student] Heti koko / 2. [Nate] Okei, ja mitä me teemme? Me täyttää taas myöhemmin. Mitä me nyt teemme? [Student] Emmekö halua tehdä kaikkia juttuja meillä, jos osaan? [Nate] Tee kaikki jutut, hyvä. Kopioi ja liitä. Voi veljet. Katsotaan, jos tämä toimii, jos voimme välilehti tämän yli. Kaunis. Okei, ja säästämme tämän niin teillä sitä. Selvä, ja aiomme tehdä tämän, kun- mikä oli samalla ehto olit jälkeen? [Opiskelija] Kun neula ei ole sama, niin kuin huutomerkki. Mutta en ole varma, mitä se on vielä. [Nate] Joo, tämä on yksi tapa tehdä se. Sam, sinulla on kommentoitavaa? [Sam] Muistelin kun katsoin videoita, Otin kuvakaappaus yhden kaltainen kun teimme pseudokoodi se, siellä oli joitakin suhde max ja min. Minusta se oli jotain, jos maksimi on yhä vähemmän kuin min. Selvä. [Sam] Tai esimerkiksi jos max on vähintään min tai jotain, koska se merkitsisi, että olet etsinyt kaiken. Niin, mitä se kuulostaa max ja min oli kyse? [Sam] Arvot,-kokonaislukuja, jotka tulevat muuttumaan suhteessa mihin laitoimme keskipiste. Aivan. [Sam] Tuolloin se tulee [kuulumattomissa] laskea max ja min. Keskipiste on tämä max ja min idea. Onko siinä järkeä ihmiset? Jos me alkaa tarkastella, miten aiomme tehdä tämän iteraation olet täysin oikeassa, että haluamme käyttää jonkinlaista do-while-silmukka. Mutta kai jos muistamme, mitä tapahtuu klo paikalla tämän taulukon ja mitä todella tapahtuu-Menen kirjoittaa tänne, aivan ensimmäinen variaatio binäärihakupuu, olemme- Aion käyttää b ja e merkitsemään alkua. Ja sitten loppuun meidän array. Tiedämme, että alku on 4 oikealla tänne, ja me tiedämme, että pää on 108. Sano olemme etsivät numero 15. Ensimmäistä kertaa teemme tämän, kuten näimme aikaisemmin, Keskipiste joko olemaan 16 tai 23 riippuen miten laskemme asioita. Koska tasaisesti jakamalla keskellä antaisi meille tätä tilaa välillä 16 ja 23, emme voi tasaisesti jakaa sitä tai jakaa sitä ja saada aikaa todellinen keskipiste. Me tutustumme 16. Me huomaat "Hei, 16> 15, että etsimme." Voit sitten katsoa vasemmalla puolella array mitä me lopulta teemme on poisheittämistä tämä koko yläosa ja sanoi, "Okei, nyt meidän päätepiste tulee olemaan täällä." Seuraava iteraatio meidän silmukan, olemme nyt etsimässä tätä array, tehokkaasti joilla hylättiin tämän osan, koska nyt jos olemme ottaen puoliväliin olla ero alussa ja lopussa, löydämme keskipiste on 8, jonka voimme testata 8 nähdä missä se on suhteessa määrään etsimme, 15, huomaavat, että 15 on suurempi, joten meidän täytyy siirtyä oikealle osan luettelossa, jonka tiedämme koska olemme ihmisiä, ja voimme nähdä sen. Tiedämme, että oikea osa tulee olemaan, jos löydämme sen, mutta tietokone ei tiedä, että, niin mitä me teemme on hyvitämme oikeastaan ovat tämän nousevat, ja nyt alku ja loppu ovat samassa paikassa, joten keskipiste tulee ainoa numero luettelossa siinä vaiheessa, joka on 15, ja olemme löytäneet sen. Onko se valottaa jos koko max ja min merkintätapa on menossa, tarkkailemalla päätepisteet array jotta selvittää kuinka kapea asioita alas? Mitä tapahtuisi, jos tämä ei vastaa 15 nyt? Mitä jos etsimme 15 ja sen sijaan, tämä määrä oli myös 16? Saatoimme sanoa, "Voi, se on suurempi. Haluamme mennä takaisin vasemmalle. " Ja olimme siirrymme e oikealle, jolloin meillä on päätepiste, joka olisi ristiriitaista. Se ei voisi etsiä enempää elementtejä koska nyt meillä on päätepiste ja meidän alkupiste, meidän max ja meidän min, nyt käännetään. Me etsiä koko joukko. Emme voi löytää mitään. Se missä vaiheessa me haluaisi sanoa, "Okei, me aiomme lopettaa tämän algoritmin. Emme ole löytäneet mitään. Tiedämme, että se ei ole täällä. " Miten tämä menee? [Opiskelija] Miten tarkasti tietokone vaihtaa pää? Miten loppuun päätyvät ennen alkua? Pää päättyy ennen alkua koska matematiikan että aiomme tehdä joka kerta me teemme tätä. Tapamme Vaihdetaan on jos tarkastellaan ensimmäistä kertaa teemme tämän swap jossa meillä on alusta 4 ja lopussa aina alas 108 ja meidän keskipiste, eli klo 16 - Aion palauttaa tämän takaisin 15-jos me etsimme 15, tiesimme, että mitä teimme, kun pyysimme 16 ja näki, että se oli suurempi ja halusi hävittää koko oikean osan luettelossa, näimme, että mitä halusimme tehdä, on siirtää tämä e täällä. Tehokkaasti, e pelaaja siirretään johonkin ennen keskipisteen. Samoin, kun me teimme tämän iterointia algoritmin ja keskipiste oli 8, Olemme havainneet, että 8 <15, joten halusimme siirtyä b yksi entinen keskipiste. Nyt, alku ja loppu ovat molemmat yhdessä tämän 15. Jos olisimme olleet tapahtumassa etsiä jokin muu arvo, ei 15, tai jos tämä 15 oli sen sijaan ollut 16, olisimme havainneet, että e haluamme siirtää yksi ennen keskipisteen. Nyt e olisivat siellä selattava vähemmän kuin b. Käydään läpi, miten me oikeastaan ​​päätyä koodaus tätä algoritmia. Me tiedämme, että haluamme saada tämän keskipisteen laskemista. Tiedämme myös, että haluamme seurata alussa ja lopussa array nykyiseen array jotta voimme selvittää jos tämä vasen puoli luettelo on ja missä oikea puoli luettelossa on. Teemme joka joko alkaa ja päättyy, tai voimme soittaa heille min ja max. Minä käytän alkavan ja päättyvän tällä kertaa. Kun alamme, jos katsomme taaksepäin meidän esimerkiksi tänne, Meidän alku oli asetettu alusta array, luonnollisena. Mikä indeksi oli tämä? Mitä pitäisi meidän alkaa olla? Daniel. [Daniel] heinäsuovasta [0]. [Nate] Joo, niin voisimme asettaa sen yhtä heinäsuovasta [0]. Ongelmana on kuitenkin se, että tämä antaa meille ei asemaa ensimmäisen elementin. Se antaa meille indeksi ensimmäisen elementin tai todellinen arvo, että ensimmäisessä asennossa. [Opiskelija] Se muuntaa 0,20? [Nate] Mitä tämä tekee on-hyvin, se ei tee mitään jatkojalostus. Mitä se tekee on se tallentaa 4 alkaa, ja silloin on vaikea tehdä vertailuja vastaan ​​alkaa koska begin järjestämme arvo 4, joka on alku meidän array, mutta haluamme seurata indeksejä array toisin kuin arvoihin. Me todella käyttää 0, niin. Lopulle array-Charlotte asian esille hieman aikaisemmin. Tämä on, jos otamme huomioon nolla indeksointi. Charlotte, mikä pää array? Mikä on indeksi loppu? [Charlotte] Size - 1. Joo, ja jonka koko meidän pitäisi käyttää? Pitäisikö meidän käyttää pääomaa koko tai pieniä koko? Capital kokoa. Tässä tapauksessa voisimme käyttää pääomaa koko. Jos haluamme tätä toimintoa kannettavaksi ja käyttää tätä toimintoa muissa ohjelmissa, voimme itse käyttää pieniä kooltaan. Se on hieno myös. Mutta Charlotte on täysin oikeassa siinä, että haluamme koko - 1. Tässä vaiheessa, [Opiskelija] Kuinka on mahdollista, että voit käyttää isoja kokoa? Miten on mahdollista, että voisimme käyttää isoja kokoa? On käynyt ilmi, että nämä # määrittelee ovat todella, konepellin alle, tekstin kuten etsi ja korvaa, jos se on järkevää. Kun kääntää koodin, esikäsittely vaihe ja kääntäjä kulkee tiedosto, ja se etsii kaikkialla, että olet kirjoittanut pääoman määrän, ja se korvaa tekstiä kirjaimellisesti 8, aivan kuten se. Tässä mielessä tämä on hyvin erilainen kuin muuttuja. Se ei vie tilaa muistissa. Se on yksinkertainen teksti korvaa temppu. Tässä tapauksessa aiomme käyttää kokoa. Sieltä me haluamme tehdä jonkinlainen toistoa, ja olemme oikealla tiellä meidän do-while silmukka. Haluamme tehdä jotain, kunnes ehto ei päde enää, ja kuten näimme aikaisemmin, näimme, että tämä edellytys oli todellakin, että emme halua loppua olla vähemmän kuin alkaa. Tämä on meidän pysäyttää kunnossa. Jos näin tapahtuu, me haluamme lopettaa ja julistaa, kuten "Hei, emme ole löytäneet mitään." Ilmaista tätä, haluamme käyttää jonkinlaista silmukan. Tässä tapauksessa se olisi do-while-silmukka, ja silmukka, kun silmukka? Meillä on do-while-silmukka täällä. Onko teillä sellaista lähestymistapaa? Luuletteko meidän pitäisi kokeilla erilaista lähestymistapaa? Kevin, mitään ajatuksia? Meillä voisi olla kun silmukka, koska me tiedämme suurin olisi suurempi kuin min alussa anyways. Joo, joten ei ole alustus, joka tarvitsee tapahtua. Nämä do-while silmukat ovat suuria, kun olet alustaa jotain sitä ennen testausta, kun taas täällä me tiedämme, että emme aio pitää reinitializing sekä alkaa ja päättyy joka kierroksella silmukan. Me tiedämme, että haluamme ne alustaa, niin tutustu kunnossa. Tässä tapauksessa minä itse mennä yksinkertainen, kun silmukka. On käynyt ilmi, että do-while silmukoita käytetään melko harvoin. Paljon paikkoja ei edes opeta tehdä samalla silmukoita. He ovat hyviä käsittelyyn käyttäjän syötettä, joten olemme nähneet paljon niitä toistaiseksi. Mutta normaalia ja kun silmukat ovat paljon yleisempiä. Osoittautuu, että tämä edellytys kirjoitettu ei todellakaan tee meille paljon hyvää, ja miksi? Olen pahoillani, en tiedä nimeäsi. Olen Jerry. >> Anteeksi? Se on B-O-R-U-I. Selvä. En näe sinua listallani. Voi, se on siksi, oh, että järkeä. Onko sinulla idea miksi tämä kun silmukka ei välttämättä toimi tarkoitetulla sillä kirjoitettu ehto? [Jerry] Tarkoitatko haluat kaikki jutut jälkeen se-? Joo, niin se on yksi. Meidän täytyy ehkä laittaa kaikki tätä kamaa osaksi kun silmukka, joka on täysin totta. Toinen asia, joka on hieman ongelmallista, vaikka se, että tämä ehto ei toimi. [Student] Sinun kääntää sitä. Oikea, joten tämä ehto ei koskaan totta aluksi niin puhuimme siitä. Haluamme tehdä jotain loppuun > Plus alkaa? [Opiskelija] lopussa. Koska se on vain lasketaan puoli pituudesta. Sinun täytyy lisätä aloittaa. [Nate] Mitä tämä laskee meille? Jos ajattelemme päättyy tähän ensimmäiseen iterointia silmukan, pää tulee olemaan paikallaan olevaa 7. Aloita on 0-asennossa. Muista, etsimme joko asento 3 tai asema 4. Jos me tarkastelemme tätä matematiikkaa, vain tehdä se hieman konkreettisemmin, laittaa numeroita tänne, meillä on 7, 0, joten 7-0, ja sitten / 2 on 3 kokonaisluku jako, joka on. Sitten meidän täytyy lisätä sitten takaisin meidän alkaa? Emme ole tässä tapauksessa. On aivan ensimmäinen iteraatio, se on hieno, koska begin on 0. Mutta edetään, teemme oikeastaan ​​kaikki täytyy vain loppu - alkaa / 2. On yksi muu temppu täällä, ja se on nimittäin yksi edelle. [Student] Tarvitaanko sulkeet? [Nate] Aivan, ja se johtuu siitä, jos emme aseta näitä sulkeita, tämä rivi tulkitaan sijaan kuten (loppu) - (alkaa / 2), jota varmasti halua. Varo näitä priorisointisääntöjä. [Student] Miksei se päättyy + alkaa? Miksei se päättyy + alkaa? [Opiskelija] Miksi ei, että? Miksi se olisi +? Luulen, että olet oikeassa. [Student] Koska se on keskimäärin? [Nate] End + alkaa, olet täysin oikeassa. Vau, olen täysin goofed. Olet oikeassa. Jos teimme miinus, haluaisimme lisätä aloittaa takaisin sisään Tässä tapauksessa, olet aivan oikeassa, että haluamme ottaa keskiarvo kahdesta, joten haluamme lisätä ne, toisin kuin vähennyslaskua niitä. [Student] Se toimisi myös jos teit lopussa - aloittaa / 2 + alkaa. Se olisi, jos me-uskon niin. Esimerkiksi, jos katsoitte alkaa, ja siirsimme sen tänne sen 15. Nyt alkaa on asennossa 2. Pää on 7-asemassa. Jos vähennämme niitä, saamme 5. Jaetaan että 2, saamme 2. Ja sitten me lisätään 2 takaisin, ja joka saa meidät 4. asemassa, mikä on täällä, mikä on keskipiste. [Student] Onko meidän huolehtia kääre? Missä mielessä me tarvitsemme huolehtia kääre? Jos summa tai erotus riippuen siitä, miten me sen teemme ei ole parillinen. Sitten tietokone saa sekoittaa onko kun se 2,5; sinä siirtyä vasemmalle tai oikealle mitkä on keskipiste? Selvä. On käynyt ilmi, että kokonaisluku jako, emme koskaan saa näitä liukulukuja. Emme koskaan desimaalin. Se on täysin hylätty. Jos sinulla on tietokone jakaa kaksi int muuttujaa, ja yksi on 7, ja toinen on 2, et saa 3,5 seurauksena. Se saa 3. Loput hävitetään, joten se tehokkaasti pyöristäminen ei pyöreä vaan lattia, jos te tuntevat, että matematiikka, jossa täysin hävittää desimaali, ja niin olet lähinnä katkaisemalla sen alaspäin lähimpään kaikkiaan positioita, lähimpään kokonaislukuun. [Student] Mutta sitten se ongelmallinen, koska jos sinulla on joukko 7 elementtiä Sitten ottaa automaattisesti 3. osa ulos keskipisteen sijaan 4.. Miten käsitellä sitä? Se ongelmallista, koska jos meillä olisi joukko 7, se poimia 3. sijasta 4.. Voisitko selittää hieman? [Student] Koska jos sinulla on 7 elementtiä sitten 4. osa olisi keskipiste, oikea? Muista kommentti on nolla indeksoitu, tosin. [Student] Joo, niin asentoon 3. Se olisi keskipiste. Joo. Selvä. Näen mitä tarkoitat. Se on tavallaan outoa, koska me tottua tähän koko käsite päästä eroon desimaaleja. Se on hyvä piste. Lopetetaan tämä. Olemme lasketaan myös keskipiste. Testaamme onko meidän neula on sama keskimmäinen arvo. Olemme tulostat että löysimme sen, mutta oikeasti, mitä haluamme tehdä tässä tilanteessa? Olemme huomanneet sen, joten haluamme antaa soittajalle tietää, että löysimme sen. Meillä toiminto, joka on Boolen kirjoitettu funktio. Tapaamme signaalin soittajalle meidän toiminnon olemme valmiina on sanomme, "Hei, tämä on totta." Miten teemme sen, Kevin? Olet nyökkää päätäsi. >> [Kevin] Lisää return true. [Nate] Aivan, return true. Nyt, jos se ei ole yhtä, miten katsomme vasen puoli? Onko ideoita? Stella, mitään ideoita? Sinun täytyy asettaa uuden aseman loppua. Joo. Joten meidän täytyy tehdä kannan keskipisteen - loppua. Suuri. Meidän on asetettava uuteen asentoon loppuun tarkastella vasen puoli. Tämä oli mitä puhuimme ennen kun Pidän menossa takaisin tähän esimerkkiin. Olen aluksi täällä, ja sitten minulla on pää koko matkan tänne. Jälleen, jos etsimme 15, ja meidän keskipiste on 16, ja ymmärrämme, "Oho, 16 on suurempi. Haluamme siirtyä vasemmalle puoli. " Olisimme sitten siirtyä pää 15, ja me teemme sen ottamalla yksi pois keskikohdasta ja asettamalla että uusi loppu. Samoin, jos haluamme tarkastella oikea puoli, miten me sen teemme? Onko sinulla idea? [Student] Olet juuri asettanut alkaa keskipisteen + 1. [Nate] Suuri. Ja nyt siinä tapauksessa, että emme löydä mitään, tuo saa hoitanut meille? Daniel, tuo saa hoitanut meille? [Daniel] No [Nate] Jos teemme sen läpi koko joukko, ja emme löydä mitään, jos se olisi hoidettu, vai pitäisikö meidän huolehtia siitä? [Daniel] taas kunnossa. [Nate] Joo, taas kunnossa, tarkalleen. Se hoitaa läpi koko ryhmän jos emme löydä mitään. Tämä taas silmukka päättyy. Emme koskaan ole kohdanneet tämän edellytyksen, ja voimme palata vääriä. Voimme myös jättää tätä, jos tänne näin sillä jos tämä jos lause on tosi, ja meidän funktio palauttaa, ja niin me pohjimmiltaan keskeyttää tämän toiminnon tässä vaiheessa kun palaamme totta. Mutta mitä tapahtuu tämän rakenteen täällä? Toimiiko tämä kokonaan, vai onko olemassa jokin looginen virhe siellä? On joitakin looginen virhe siellä, miten se on perustettu. Mikä mahtaa olla? [Student] Mihin tarvitset - ja + 1s? Joka asettaa meidän array jopa olla uusi vasen puoli ja oikea puoli. [Student] Mutta miksi et voinut tehdä sitä ilman - 1s ja + 1s? [Nate] Voisimme asettaa sen yhtä keskipisteen? Mikä voisi olla ongelmallista siitä? [Opiskelija] Kai se on tehotonta, koska olet tarkkailun arvo, joka on jo tarkistettu. [Nate] Aivan, joten Sam on täysin oikeassa. Jos asetat loppuun ja alkaa sama keskipisteen sijasta - 1 ja + 1 reflektoiden, jossain vaiheessa tulevaisuudessa me lopulta tarkistaa keskipisteen uudelleen. [Opiskelija] aloitin PSET, ja sitten minulla oli jotain missä Unohdin + 1, ja se juuttui ikuiseen silmukkaan. Oikea, koska jossain vaiheessa et koskaan saa alkaa ja päättyy todella päällekkäin. Cool. On vielä yksi looginen virhe, ja se on, että tämä pitäisi ehdottomasti olla if. Miksi se voisi olla? Syynä on, jos se ei ole if-Näitkö sen, Kevin? [Kevin] Joo, koska muutat päätepiste. [Nate] Aivan. Olemme muuttamassa päätepiste, ja jos se on kirjoitettu näin-Me tekevät välit- se tarkistaa asian. Tässä tapauksessa, jos se onnistuu, keskeytyy ulos toiminto. Sitten se tarkistaa tämän seuraavan kerran, ja jos tämä onnistuu, se säätää päätepiste, ja sitten se jatkuu ja tarkista tässä tapauksessa. Mutta tässä vaiheessa, emme halua sitä jatkaa tarkkailun. Onneksi emme ole nollaa keskipisteen täällä, ja me tiedämme, että tämä asia ei onnistu. Mutta halusimme ehdottomasti laittaa if siellä vaikka se saattaa, tässä tapauksessa koska emme säätämällä keskipiste, sillä olisi merkitystä? Ei, koska nämä tapaukset ovat kaikki erinomaisia. Jälleen my bad. Emme mielestäni tarvitse tätä if. Voimme kokeilla ja käyttää sitä ja katso mitä tapahtuu. Rakennus, virhe. Se johtuu luultavasti siitä, jätin nämä b: n ja e: n täällä. Onko minulla enää niitä ylös huipulla? Se ei näytä siltä. Me loitontaa, rakentaa, siellä se menee, joten nyt jos hakee 15, Kyllä. Saanen Lähennä 15, kyllä. Voimme käyttää sitä uudelleen. Lataaminen lähdekoodia, rakennus, juoksu. Voimme etsiä jotain 13, emmekä saa mitään tulostamisen, joten se ei katsonut, että meille. Se on hienoa, koska se ei ole meidän luetteloon. Olemme nyt myöhässä. Se tulee olemaan se tällä viikolla. Kiitos liittymisestä, ja nähdään myöhemmin. [CS50.TV]