[Powered by Google Translate] [3. osa] [Vähem Mugav] [Nate Hardison] [Harvardi Ülikool] [See on CS50.] [CS50.TV] Olgu, hakkame pihta. Tere tulemast 4. nädalal CS50. Kui te avada veebibrauseri ja avab pset 3, Rüselus koos CS50, me ei kavatse alustada läheb kaudu osa küsimusi seal. Täpselt nagu eelmisel nädalal, saadame töötavad CS50 Spaces, kui sa ka pull, et suureneb, ja kui sa minna ja külastada seda linki, et mul on siin üleval. On aeg alustada. Meil meie väike hi programm siin. Miski hull. Üks esimesi asju, mida ma tahan teha koos teiega täna on minna üle mõned lahendused kuni Ülesanded 1, omamoodi eeskuju lahendusi, lihtsalt nii saad aimu, milliseid kood töötajad on kirjutamine, milliseid kood teised õpilased kirjutavad, ja kas te olete heita pilk seda, sest ma tean, et see on imelik kui sisestate lahendust probleemile komplekt ja saada kommentaare kohta oma versioon, kuid mõnikord on see kasulik vaadata, kuidas teised inimesed tegid seda, eriti need, mis on kena välimusega. Enamasti olin tõesti muljet lahendusi, mis te poisid toodetud. Ma ei ole veel hakanud uurima oma Ülesanded 2s, kuid kui nad midagi nagu esimene, see ei tähenda midagi, kuid häid asju. Kui te vaatate minu parandusi, alustame täiesti alla kell 1. läbivaatamine, ja me ei kavatse võtta kiire pilk Mario lahendus. Kui te tõmmake see üles, need programmid, et me ei kavatse esitada on õiged. Seal ei olnud õigsuse küsimusi nende probleemidega, vaid pigem me tahame rääkida natuke erinev projekteerimise küsimusi mida kasutatakse siin. Üks asi, et oli huvitav lahendus on see, et ta kasutas seda uut ehitada nimetatakse nael määratleda, mõnikord nimetatakse ka räsi määratleda. Lubage mul suumida see siin. # Define võimaldab teil anda nimed need numbrid oma programmi. Sel juhul maksimaalne kõrgus püramiid Mario aastal 23 ja panemise asemel 23 minu kood- me viitaks, et nii raske koodis 23 - selle asemel annab see nimi MAX_HEIGHT, et number, nii et siia alla oma do-kui ahela saab tegelikult viidata MAX_HEIGHT selle asemel, et number 23 tolli [Student] Mis on see eelis, seda teeb? See on hea küsimus. Üks on loetavus. Eelis kasutades seda # define on loetavus. Kui ma loen seda koodi, ma näen, mis toimub. Ma näen sellises seisundis siin, et testaamme jaoks kõrguse <0, mis me oleks võinud ka määratletud olema minimaalne kõrgus või min kõrgus. Teine eelis on see, et ma saan siis loe ülejäänud rida näha et me ka kontrollida veendumaks, et kõrgus ei ole suurem kui max kõrgus, sest me kavatseme jätkata samas kõrgus on suurem kui kõrgus max. Teine eelis on see, kui ma välja suumida natuke siin- kui ma käivitada programm ja ma saan seda, ütleme, 23 just nüüd, siis printida välja kõik 23 rida just niimoodi. Aga öelda tahtsin muuta max kõrgus, ja nüüd ma tahan, et piirata maksimaalse kõrgusega püramiidid olla ainult öelda, mees, see oli funky. # Include , # define MAX_HEIGHT, ja ütleme et me tahtsime, et seada see võrdub 10. Nüüd sel hetkel, kõik, mida ma pidin tegema oli muuta selles ühes kohas. Ma ei kompileeri kood, ja nüüd, kui ma püüan ja kirjuta 12, siis kiire mind jälle. Sellisel juhul me kasutame ainult MAX_HEIGHT kord. See ei ole nii suur probleemideta minna ja muuta see samas loop kui teil on vaja. Aga programmid kuhu viitamine sama maagiline number ikka ja jälle, see # define mehhanism on tõesti mugav sest sa lihtsalt muuta see üks kord ülaosas faili-see on tavaliselt kuhu need pandud- ja muutus percolates läbi ülejäänud faili. Muud asjad ma tahtsin märkida seda ülesannet, et ma arvasin tundus väga kena, üks oli nimede muutujad. Näete siin, et meil on täisarv muutujad nimega reas ja nn kõrgus. Spaces, hashes, see aitab muuta koodi natuke paremini arusaadavaks, muudab veidi arusaadavamaks, mis tegelikult toimub. See on kontrastiks kasutades, ütleme, juhuslike tähtede või lihtsalt mitmesugused märgid kokku. Viimane asi, ma juhtida on see, et eest silmuseid, sageli need iteraatori muutujad, nende vastu, et te kasutate oma jaoks silmuseid, see on standard ja tava, et alustada neid kas i ja siis j ja siis k ja läheb edasi sealt, kui teil on vaja rohkem muutujaid, ja see on lihtsalt konventsioon. Seal on palju konventsioone. See sõltub programmeerimiskeelt te kasutate. Aga C, me tavaliselt alustame i. See ei ole mõtet kasutada, ütleme, või b sõltuvalt olukorrast. Ongi see. Kui te nüüd tõmba Revision 2, näete teise Mario, ja see on sarnane teine, et me just nägime, kuid see teeb midagi sellist lahe. Kui me vaatame seda osa siin sees sisemine jaoks silmus, nad kasutavad mõned hull otsin süntaksi siin just seda joont. Seda nimetatakse kolmekomponentsete operaator. See on kui teine ​​avaldus lühendatud ühele reale. Tingimus on see osa sulgudes. See on samaväärne, kui öelda, kui j > Sam. Sam. Nagu Sam ütles, et lineaarne otsingu protsess saab olema väga aeglane, ja selle asemel binaarne otsing, kuidas see toimib on see, et iga kord kui me minna läbi iteratsiooni meie otsingu algoritm, me ei kavatse jagada loetelu pooleks sisuliselt, kaheks väiksemaks nimekirju. Ja siis järgmisel iteratsiooni loop, siis me jagame seda uuesti teistesse väiksemad nimekirjad. Nagu näete, probleem peab üha väiksemaks ja väiksemaks sest me peame visates poole nimekirja iga kord. Kuidas see viskama toimib? Lihtsalt meeldetuletuseks, mida me teeme, kui me olime arvutis ja me olime, ütleme, otsides number 5 selles loetelus on see, et meil oleks valida number keskel. Keset seda nimekirja, sest seal on 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 numbrit, me tahaks valida number kas 4. kohal või 5. positsiooni, ja me tahaks helistada, et keset meie nimekirjas. Vali number keskel. Siis, nagu Sam ütles, me proovida, kas see arv on võrdne arvu, et me tahame saada või meie soovitud number. Kui see on võrdne, siis me oleme selle leidnud. Meie võidame. Kui see ei ole võrdne, siis seal on paar juhtudel. Kahel juhul on kas peab number olema suurem kui arvu me vaatame, või see on väiksem kui. Kui see on suurem, astume õige. Ja kui see on väiksem, me liigume vasakule. Ja siis me kogu protsessi korrata uuesti kas parem pool või vasakul pool nimekirjas. Esimene probleem tänapäeva osa on välja mõelda kuidas me saame tegelikult hakata väljendama seda C-koodi. Meil pseudokoodi siin. Mis me hakkame tegema on ma tõmba uus ruum, salvestada selle muutmisega nii, et meil on need märkused hiljem Me kustutame kõik selle, ja siis kopeeri ja kleebi probleem komplekt seda informatsiooni meie ruumid, ja loodetavasti see ei purune. Perfect. Kui te kõik seda teha, kopeeri ja kleebi see kood oma uut ruumi, arvesse tühi üks. Proovime Daniel. Kui te kompileerida ja käivitada see programm, see töötab? No >> Mis see räägib? Ta ütleb kontrolli jõuab lõpuks mitte-tühine funktsioon. Jah, nii ma püüan läbiviimist. Kas te olete näinud seda varem? Kas sa tead, mida see tähendab? Okei, lahkama seda natuke. See ütlus on file.c real 9 veerus 1, saame viga, nagu sa ütlesid, ja ta ütleb, et see tuleneb viga hoiatus ja tagastab tüüp hoiatus. Tundub, et midagi toimub koos naasmise tüüp, mis on loogiline. Meil ei ole tühine funktsioon, mis tähendab, et meil on funktsioon et ei tagasta tühine. Tühine funktsioon on üks, mis näeb välja selline: void foo (), ja see on tühine, kuna tulu liik, on tühine, mis tähendab, et kui meil oleks midagi siin nagu return 1, me saame tõlkija viga selles. Kuid meil ei ole tühine funktsioon. Meie mitte-tühine funktsioon on sel juhul meie otsingu funktsiooni sest see on tagasipöördumise tüüpi bool. Kui ta ütleb, et kontrolli jõuab lõpuks mitte-tühine funktsioon, see on sellepärast, et otsing ei ole tulu avaldusega. See ei tule midagi tüüpi bool. Saame kinnitada, et, ja mida te poisid arvate otsing peaks tagasi vaikimisi? Milline peaks olema vaikimisi tagastatav väärtus otsingut? Sest see, mida me saame panna lõpus. Charlotte, kas sul on-? Õige või vale? >> Õige või vale. Milline neist? False. Ma ei tea. Vale? Proovime seda. Miks sa ütleksid tagasi false? See on suurepärane intuitsioon. [Charlotte] Ma ei tea. Me läheme tagasi false käesolevas asjas, kuna see on meie vaikimisi kui mingil põhjusel loend on tühi või nõela et me otsime ei ole olemas. Siis päris lõpus, kui me ei anna tõsi varem seda funktsiooni, me alati teame, et see funktsioon ütlevad nope, see ei ole massiiv. See pole heinakuhjas. Nüüd, kui oleme kompileerida ja käivitada see-las ma salvestada see, et me ei tõmba see üles. Nüüd, kui oleme kompileerida ja käivitada meie programmi, see ehitab. Me saame meie väike kiire. Kui ma tabanud 4-uh-oh. See ei prinditud välja midagi. See tundub kõik lõppes hästi. Me peame täitma käesoleva sisse Me rääkisime algoritmi pseudokoodi natuke tagasi. Las ma vaatan, salvestage see, ja ma pull, et algoritm tagasi jälle. Olgem virutanud. Nope. Siin see on. Kuidas me seda teeme? Milline oleks hea strateegia alustades maha selle koodi? Sa pead valima number keskel. Kuidas me valime arv keset massiivi? Kõik soovitused? [Student] strlen jagatud 2. Strlen jagatud 2. See on suur üks. Strlen töötab erilist liiki massiivid. Milliseid massiivid? String massiivid, iseloomu massiivid. See on see sama liiki mõiste, et me tahame rakendada, kuid me ei saa kasutada strlen sest meil ei ole array tähemärki. Meil on hulgaliselt ints. Aga mida see strlen saada meile? Kas tead, mida ta saab meid? [Student] strlen saab meile pikkus. Täpselt, see läheb meile pikkus. Strlen saab pikkus array meile. Kuidas saame, et meie Kahendotsingupuu programm? Kuidas sa saad pikkus massiivi? [Student] strlen? Saad pikkus õigesti vormindatud C string massiivi strlen. Probleem on aga, et me ei pea stringi massiivi. Kui me vaatame tagasi selle koodi, meil on see täisarv massiivis. Kuidas me teame, kui kaua see on? [Student] Kas samaväärne üks näitaja, nagu int l või midagi? Tuleb välja, et tegelikult ei ole, ja seda viisil, et see on üks nendest asjadest, mis on lihtsalt hea teada C, et puudub võimalus saada pikkus massiivi kui kõik ma annan teile on massiiv. Seetõttu töötab stringid, põhjus strlen töid, seetõttu, kui string on õigesti vormindatud, see on selline eriline \ 0 märk päris lõpus. Võite ette kujutada, kui teil on valesti vormindatud stringi ja pole mingit \ 0 märk seal, siis kogu asi ei tööta. [Student] Kas lisate \ 0? Võiksime sel juhul. Võiksime lisada mingi \ 0 või mingi tähistades iseloomu ja siis kasuta seda. Aga see pole ju päris läheb tööle sest \ 0 on char tüüpi, ja siin on meil ints. Teine asi on see, kui me kasutada erilise väärtusega nagu -1 kuni kaubamärgi lõpuks massiiv siis me ei saa kunagi hoida -1 meie täisarv massiivid. Me tahaks olla ummikus. Tuleb välja, et ainus viis saada pikkus massiivi C on tegelikult mäletan seda kui sa ehita ja siis andke seda ümber massiiv nii et kui mul on funktsioon, mis läheb tegema mõned tööd aasta array täisarvud või ujukite või kahekordistab või mida iganes, Ma ka pead andma funktsioon massiivi pikkuse, ja see on täpselt see, mida me oleme teinud siin allalaadimisfunktsioon. Kui vaadata, mida me oleme teinud, kui võtame meie massiivi siin, me ka läbida pikkus, suurus. See lihtsalt juhtub, et me oleme nimetanud seda muutujat siin, Selle parameetri või argument. Seda nimetatakse funktsiooni argument nimekirja või parameetrite nimekirja, ja neid nimetatakse ka argumente või parameetrid. Inimesed kasutavad erinevaid termineid eri aegadel. Ma mõnikord vahetada neid ise. See lihtsalt nii juhtub, et see muutuja siin on oma nime sarnaselt Käesoleva # define siin. Aga nad ei ole sama asi. Kapitaliseerimine ei küsimuses. Kui te vaatate, mis juhtub siin, me kuulutame meie int massiiv, mis me oleme numbreid. Oleme andnud oma suuruse, mis vastab meie # define kuni ülaosas. See saab olema 8. Ja siis kui me siis nimetame oma otsingu funktsiooni allapoole, võtame arvu tahame otsida, mis meil küsitakse, hangitud kasutaja. Me läbida massiiv, see numbrite ja siis on meil ka läbida suurus massiiv, ja siis väärtus suurus 8 saab ladustada või edastatakse see täisarv muutuja nimega suurus. Meil on suurus massiiv. Nüüd kui me läheme tagasi, mida me rääkisime varem, Ma arvan, et Missy tõid punkti, mida meil oli vaja teha on saada pikkus array ja jagada seda 2, ja mis annab meile keskpunktis. Vaatame. Kas mul on keegi kirjutada see ja salvestada see oma ruumi? Kuidas Leila? Kas mul võib olla kirjutad seda? Kirjutage esimene rida, kus te võtate pikkus array ja saada keskpunktis ja hoidke seda uus muutuja. Ma annan sulle paar sekundit. Oled sa valmis? [Student kuuldamatu] Muidugi, ma saaksin sulle arvutada keskpunktis Euroopa heinakuhjas massiiv sees otsingu funktsiooni kasutades pikkus heinakuhjas massiiv, mis on suuruse muutuja? Miski keeruline siin. [Leila] Lihtsalt suurus / 2 ja lihtsalt- Ja salvesta see ja vajuta nuppu Salvesta siin üleval, ja me tõmmake see üles. Perfect. Nii juba läheb. Awesome. Nagu, kas see kompileerida? [Leila] Ei, see tuleb suurem. [Nate] Jah, siis mida me peaksime tegema? [Leila] Nagu int keskpunktis või midagi. Awesome. Jah, teeme seda, int keskpunktis = suurus. Kas see kompileerida? Teeme seda kommentaari kustutada ja saada see välja viis. Mis ei kompileerida selle kohta? Me ei tee midagi koos täisarv, nii et me peame seda trükkida või midagi sellist. Jah, täpselt. Me saame kasutamata muutuja. Mida veel ei kavatse teha sellest? Ma arvan, et sa ütlesid midagi, Sam. Semikoolonit. Jah, ma olen kadunud need semikooloniga. See saab olema pidev asi vältel perspektiivis. Viimane asi, ma teen on ma panen natuke tühja ruumi mõlemal pool selle korraldaja siin, sest see on tavaliselt kuidas me seda teeme vastavalt meie stiili juhend. Meil keskpunktis meie massiivi. Nüüd, kui me mäletame tagasi meie algoritm, Mis oli teine ​​samm, et pidime tegema kui meil on keskpunktis? [Student] Kui see on suurem [kuuldamatu]. Jah, nii me peame tegema mingi võrdlus ja mida me võrrelda siin? Sa ütlesid, et kui see on suurem kui. Mis on see, mis lause viitab? Number, mis kerkib, kui see on suurem kui keskpunktis, siis minna kuni massiivi? Täpselt, nii arvu, mis kerkib kui me- Nõela, nii et me oleme võrreldes nõela, ja mida me võrrelda vastu nõela? Kuna nõel on see, mida me otsime. Me võrdleme seda saada keskpunktis. Aga kas on mõtet vaadata, kui nõel = keskpunktis? Kas see on loogiline? Kas keegi ei ole nõus? Vaatame seda proovida, kui (nõel == keskpunktis). [Student] Kas printf olete leidnud seda. [Nate] printf ("Me leidsime selle! \ N"); Muidu-Ma hakkan midagi erinevat siin. Ma lähen alustada pannes traksid ümber, kui avaldused kogu aeg lihtsalt sellepärast, et kui me lisame rohkem kraami, siis me ei saa koostajad. Jah, Sam. Sul punkti. Probleem on selles, et keskpunktis esindab positsiooni massiiv, aga sa saad selle esindada väärtus sellel kohal on massiiv. See on hea punkt. Kas kõik kuulsid, mida Sam ütles? Ta ütles, et keskpunktis nagu on moodustab vaid ühe positsiooni massiiv, kuid see ei ole tegelik element massiivi. Kui sa arvad koodi kirjutada kohe, kui me vaatame seda massiivi siin all, mis on 8 elementi see, Mis on väärtus keskpunktis saab olema see funktsioon? [Student] 4. [Nate] 4. Kui vaatame number 4 - ja me lihtsalt käivitada selle koodi ja panna veidi kurb nägu siin sest me ei leidnud seda-kui me teeme selle koodi nagu on praegu, laadige see, hoone, las ma liikuge allapoole ja kui me vaatame number 4, leidsime ta, kuid me ei saanud seda printf jah. Üks põhjus on see, et me ei tulnud tagasi tõsi, kuid kas me tõesti leida number 4? Ja Sam ütleb ei. Mida me leida? Me tõesti leitud keskpunktis, mis, kui me vaatame massiivi siin all, see saab olema elemendi indeks 4, et me vaatleme, mis on 23. Kuidas me tegelikult saada seda elementi keskpunktis ja mitte ainult keskpunktis ise? [Student] Me jõuaksid char või midagi? Mis oleks, et teha, lihtsalt uudishimust? Kas sa töötada natuke rohkem? Sa pead muutma seisundit arv, nii et sa pead tegema mingi side-Ma arvan, et see char, kuid see ei pruugi olla. Jah, see on hea punkt. Oleme teinud palju see konverteeriva ametikohad tähemärki, need märgid, Kahes esimeses probleem seab. Tuleb välja, et siin, see on peaaegu sarnane tutvumise nda tähemärgi stringi, kui see on mõistlik. Siin me tahame pääseda keskpunktis element. Kuidas me seda teeme? Kevin, kas sul on mingeid ettepanekuid, kuidas me võiksime seda teha? Sa võiksid teha heinakuhjas, sulg, keskel, suletud sulg. Kas sa kirjutad, et meie jaoks? Salvesta see siin, ja me pull, et üles. Me otsime seda rida 9, ja me aru, et me ei taha võrrelda nõela keskpunktis, kuid selle asemel, me tahame võrrelda nõela element positsioonil keskpunktis jooksul meie heinakuhjas massiiv. Lahe. Nii juba läheb. Jah, see tundub päris hea, kui (nõel == heinakuhjas [keskpunktis]). Me leidsime selle. Nüüd, kui me käivitada koodi-Me varundada natuke- see kompileerib, ta jookseb, ja nüüd, kui vaatame 4, me ei leia seda, sest nüüd me tegelikult saada number 23. Saame väärtus 23, ja see, mida me võrrelda meie nõel. Aga see on hea. See on samm õiges suunas. See, mida me üritame teha. Me ei püüa võrrelda nõela vastu positsioone massiivi vaid pigem vastu tegeliku massiivi elementide. Kui me vaatame tagasi nüüd järgmine samm meie algoritm, Mis on järgmine samm? Leila juba mainisin seda lühidalt. [Student] Kontrollige, kas see on suurem või väiksem kui ja siis otsustada, mis suunas liikuda. [Nate] Jah, nii kuidas me seda teeme? Kas paned mõne-Ma salvestada see läbivaatamine, ja siis kui paned mõned read, et teen seda. Jah, Charlotte. >> Mul on küsimus. Ei peaks see olema keskpunktis - 1, sest esimene asi on see on 0 indekseeritud, nii et kui me paneme 4, see pole tegelikult märk me otsime? Jah, ja teine ​​probleem, et on- see on suur saak, sest see, mis läheb lõpuks juhtub võib-olla kui me liigume edasi ja me ei ole kunagi kohandada esialgu? Ma arvan, mida me võiksime lõpuks teed püüab kasutada element kell 8. positsiooni massiiv, mis antud juhul ei ole olemas. Me tahame teha mingi arvestuse asjaolu et meil on mõned null indekseerimist. [Charlotte] Vabandust, ma mõtlesin keskpunktis - 1 Nurksulgudes. Me ei saa seda teha. Me tuleme selle küsimuse lihtsalt natuke. Kui hakkame tundma tegelikku silmuspõletamise, see on, kui me tõesti näeme seda mängu tulla. Praegu saame seda teha, kuid sa oled täiesti õigus. See null indekseerimine on mõju, et me peame arvele. Vaatame. Kuidas on suurem kui ja väiksem kui-? [Student] ma saan, kuidas seda teha suurem ja väiksem osa. Ma lihtsalt ei teadnud, mida printida, kui sa leiad, et see on vähem kui heinakuhjast keskpunktis või suurem. Siin ma võib päästa mida Ma olen- [Nate] Jah, kui salvestate mis sul ja me tõmmake see üles. Nii juba läheb. [Student] Ja ma panen küsimärke, mida ma ei teadnud. [Nate] See näeb hea välja. Siin on meil küsimärke, sest me ei tea siiani mida me kavatseme üsna tegema veel. Mida me tahame teha-oops, meil mõned traksid kõik funky meist. Me parandada need traksid. Nii juba läheb. Ja nii et mida me tahame teha, vastavalt meie algoritm, kui me ei leia nõela? Ütle nii, et nõel on väiksem kui see, mida me vaatame. Kevin. Ainult vaatate vasakule poole. Õigus, nii et paneme kommentaar siin, mis ütleb "vaata vasakule poole võrra." Ja kui nõel on suurem kui heinakuhjast keskpunktis, mida me tahame teha? [Student] Siis te vaatate paremale poole. Vaata paremale poole, "vaata paremale poole." Mitte liiga räbal. Okei, nii et sel hetkel, asjad otsivad päris hea. Probleem kood kirjutatud on mis? [Student] Sa ei pea tulemusnäitajad pooleks. Õigus, meil ei ole tulemusnäitajad pooleks. Samuti on ainult lähe läbi see üks kord. Me ainult kavatse vaadata üks keskpunktis. Kas element on olemas, või see ei ole. Et viia lõpule selle, me peame tegema mingi kordamine. Me peame hoidma korrata seni, kuni leiame, et kas element on olemas, sest me oleme vähenenud alla ja lõpuks leidsin selle, või see ei ole olemas, sest me vaatasime läbi kõik asjad, vastavas poolitatud massiivi ja leidis, et midagi on seal. Iga kord, kui meil see kordus toimub, mida me kavatseme kasutada? [Student] silmus. Mingi silmus. Jah. [Student] Kas me teeme do-kui ahela ja on seda teha ja siis samas Nõela ei võrdu-Ma ei tea, kust ma läksin sellega. Aga selline nagu seda nii kaua, kui see ei võrdu väärtusega, et kasutaja sisend. Jah, nii, vaatame, kuidas võiks seda kirjutada ise? Sa ütlesid, et lähme kasutada tee-samas silmus. Kui ei tee algus? [Student] Kohe pärast suurus / 2. [Nate] Okei, ja mida me nüüd teeme? Me täitke aega hiljem. Mida me nüüd teeme? [Student] ei me tahame teha kõik asjad on meil siis, kui osa? [Nate] Kas kõik see kraam, väga. Kopeeri ja kleebi. Oh, mees. Vaatame, kas see töötab, kui me suudame lingile see üle. Ilus. Okei, ja me salvestada see nii teiega on see. Olgu, ja me teeme seda- milline oli samas seisukorras sa olid pärast? [Student] Kuigi nõel ei võrdu, nii nagu hüüumärk. Aga ma ei tea täpselt, mis see on veel. [Nate] Jah, see on üks viis seda teha. Sam, sa pead kommentaari? [Sam] mulle meenus, kui ma vaatasin videod, Võtsin pilt ühe-meeldib, kui me tegime pseudokoodi seda, seal oli mingi seos max ja min. Ma arvan, et see oli midagi, kui maks on kunagi alla min. Käes. [Sam] Või nagu kui maks ei ole väiksem kui min või midagi sellist, sest see tähendaks, et olete otsinud kõik. Jah, mis siis see tunduda max ja min viitasid? [Sam] Väärtused et-täisarvud, et ei kavatse muuta võrreldes, kus me paneme keskpunktis. Täpselt. [Sam] Sel hetkel, see läheb [kuuldamatu] arvutada max ja min. Keskel on see max ja min idee. Kas see mõttekas rahvas? Kui me hakata uurima, kui me teeme seda iteratsiooni sa oled täiesti õige, et tahame kasutada mingi tee-samas silmus. Aga ma arvan, et kui me mäletame, mis toimub hetkekurss selle massiivi ja mis tegelikult toimub-Ma kavatsen kirjutada siia- päris esimese iteratsiooni binaarne otsing, meil- Ma lähen kasutada B ja E tähistavad alguses. Ja siis lõpuks meie massiivi. Me teame, et alguses on kell 4 siinsamas, ja me teame, et aasta lõpuks on 108. Ütle me otsite number 15. Esmakordselt teeme seda, nagu nägime, keskpunktis on kas saab olema 16 või 23 sõltuvalt sellest, kuidas me arvutama asju teha. Kuna ühtlaselt jagades keskel annaks meile selle ruumi vahemikus 16 ja 23, ei saa me ühtlaselt jagada see või jagada see ja saada on tõsi keskpunktis. Me vaatame 16. Me mõistame "Hei, 16> 15, et me otsime." Et siis vaatate vasakule poole massiivi mida me lõpuks teeme on vette kogu see ülemine osa ja ütles: "Okei, nüüd meie lõpp saab olema siin." Järgmise iteratsiooni meie silmus, me nüüd vaatab seda massiivi tõhusalt äraviskamist seda osa, sest nüüd kui me võtame keskpunktis olla vahe algus ja lõpp, leiame meie keskpunktis olla 8, mida me saame siis katsetada 8 näha, kus see on seotud hulk me otsime, 15. leiab, et 15 on suurem, nii et me peame liikuma paremale osa nimekirjast, mida me teame, sest me oleme inimesed, ja me näeme seda. Me teame, et õigus osa saab olema, kui me selle leiame, kuid arvuti ei tea, et nii see, mida me teeme on me tegelikult on see tõusevad, ja nüüd alguses ja lõpus on sama kohapeal, nii keskpunktis muutub ainult nimestikus numbrit sel hetkel, mis on 15, ja me leidsime ta. Kas see valgustada, kus see kogu max ja min märge läheb, jälgida otspunktid massiiv, et aru saada, kuidas kitsas asju ette? Mis juhtuks, kui see ei olnud võrdne 15 nüüd? Mida teha, kui otsisime 15 ja selle asemel, see number oli ka 16? Me ütleks: "Oh, see on suurem. Me tahame minna tagasi vasakule. " Ja me tahaks liikuda meie e paremale, kus punkt on meil näitaja, mis oleks vastuolus. See ei oleks võimalik otsida enam elemente sest nüüd oleme meie lõpp ja meie lähtepunkt, Meie max ja meie min, nüüd keerata. Otsime läbi kogu massiiv. Me ei leia midagi. See on koht, kus me tahaks öelda: "Okei, me lähme lõpetage see algoritm. Me ei leidnud midagi. Me teame, et see pole siin. " Kuidas see läheb? [Student] Kuidas täpselt ei arvuti lülitab end? Kuidas end lõpuks enne algust? Lõpuks jõuab enne algust sest matemaatika, et me teeme iga kord, kui me seda teha. Kuidas me swap on, kui te vaatate esimest korda me seda swap kus meil algab 4. ja lõpuks kõik viis maha 108 ja meie keskpunktis, ütleme, vähemalt 16 - Ma lähen taastama tagasi 15-kui me otsime 15, Me teadsime, et see, mida me tegime, kui me kontrollisime 16 ja nägi, et see oli suurem ja tahtis ära visata kogu õigus osa nimekirjast, nägime, et see, mida me tahtsime teha on liikuda seda e siinsamas. Tõhusalt, e sain kolis üks enne keskpunktis. Samuti, kui me seda tegime iteratsiooni algoritm ja keskpunktis oli kell 8, leidsime, et 8 <15, siis me tahtsime minna b 1 viimase keskpunktis. Nüüd, algus ja lõpp on nii kokku selles 15. Kui me tahaks toimunud otsima mõnda muud väärtust, mitte 15, või kui see oli 15 asemel olnud 16, oleksime leidnud, et e soovime liikuda üks enne keskpunktis. Nüüd e oleks seal keerata alla b. Vaatame läbi kõndida, kuidas me tegelikult lõpuks kodeerimine seda algoritmi. Me teame, et me tahame seda keskpunkti arvutamise. Me teame ka seda, et me tahame jälgida alguses ja lõpus massiivi Meie praegune massiivi nii saame nuputada kui see vasakus pooles nimekiri on ja kus paremal pool nimekirjas on. Me teeme seda kas algab ja lõpeb, või me nimetame neid min ja max. Ma kasutan algab ja lõpeb seekord. Kui hakkame, kui me vaatame tagasi meie näide siin all, meie alguses seati algusest massiiv, nagu loomulik. Mis indeks oli? Mida peaks meie hakkavad olema? Daniel. [Daniel] heinakuhi [0]. [Nate] Jah, et me saaksime seada see võrdne heinakuhjas [0]. Probleem on aga, et see annab meile ei positsiooni esimese osaga. See annab meile indeks esimese elemendi või tegelik väärtus tol esimesel kohal. [Student] See teisendada 0,20? [Nate] Mis see teha on-hästi, see ei tee midagi konverteeriva. Mida ta teeb on see salvestab 4 alustada, ja siis on raske teha võrdlusi vastu hakata sest begin on ettevõtte väärtuse 4, mis on algusest meie massiiv, kuid me tahame jälgida indeksid massiivi erinevalt väärtused. Me tegelikult kasutavad 0, niimoodi. Aasta lõpuks massiiv-Charlotte tõi see natuke varem. See on koht, kus me võtame arvesse null indekseerimist. Charlotte, mis on lõpuks massiivi? Mis on indeks aasta lõpuks? [Charlotte] Suurus - 1. Jah, ja mis suurus peaks me kasutame? Kui me kasutame kapitali suurus või väiketähed suurus? Kapitali suurus. Sel juhul saaksime kasutada kapitali suurus. Kui me tahtsime seda funktsiooni kasutada teisaldatavaid ja seda funktsiooni kasutada teistes programmides, saame tegelikult kasutada väiketähti suurus. See on hea ka. Aga Charlotte on täiesti õige, et me tahame suurus - 1. Sel hetkel- [Student] Kuidas on võimalik, et saate suur suurus? Kuidas on nii, et me võiksime kasutada suur suurus? Tuleb välja, et need # määratleb tõesti, kapoti alla, teksti nagu otsida ja asendada, kui see on mõistlik. Kui kompileerida koodi, preprocessing etapp koostaja läbib faili ja ta otsib kõikjal, et olete kirjutanud kapitali suurus, ja see asendab teksti sõna-sõnalt koos 8, just niimoodi. Selles mõttes on see väga erinev muutuja. See ei võta üldse ruumi mälu. See on lihtne teksti asendama trikk. Sel juhul me ei kavatse kasutada suurus. Siit me tahame teha mingi kordus, ja me oleme õigel teel meie tee-samas silmus. Me tahame teha midagi, kuni tingimus ei ole enam ja nagu me nägime, nägime, et see tingimus oli tõesti, et me ei taha lõpuks olla väiksem kui alata. See on meie peatumine seisukorras. Kui see juhtub, me tahame peatada ja kuulutada nagu: "Hei, me ei leidnud midagi." Väljendada seda, me ei taha kasutada mingi loop. Sel juhul oleks see siis do-kui ahela, loop, samas loop? Meil on do-kui ahela siin. Kas te niimoodi lähenemine? Kas sa arvad, me peaksime püüdma teistsugust lähenemist? Kevin, kõik mõtted? Meil võiks olla samas loop sest me teame, maksimaalne oleks suurem kui min alguses niikuinii. Jah, seega ei ole initsialiseerimise, mis peab juhtuma. Need teha-samas silmuseid on suur, kui teil on initsialiseerida midagi enne katseid, kusjuures siin me teame, et me ei kavatse hoida taasinitsialiseeris nii algavad ja lõpevad iga vooru ring. Me teame, et me tahame initsialiseerida neid, siis vaadake meie seisukorras. Sel juhul ma tegelikult minna lihtsa samas silmus. Selgub, et teha-samas silmuseid kasutatakse üsna harva. Palju kohti ei ole isegi õpetada ei samas silmuseid. Nad on head käitlemise kasutaja sisend, nii et me oleme näinud palju neid siiani. Aga normaalne ja samas silmuseid on palju rohkem levinud. Selgub, et see tingimus kirjaliku ei tõesti meile palju head, ja miks see nii on? Mul on kahju, ma ei tea su nime. Mina olen Jerry. >> Vabandust? See on B-O-R-U-I. Oh, okei. Ma ei näe sa mu nimekirjas. Oh, see on sest-oh, see on mõistlik. Kas teil on aimu, miks see samas silmus ei pruugi töötada nagu ette nähtud, nagu kirjutatud tingimus? [Jerry] Mõtled sa tahad kõik asjad pärast see-? Jah, nii see on üks. Oleksime panna kõik selle kraami samas loop, mis on täiesti tõsi. Teine asi, mis on natuke rohkem probleeme, kuigi see, et see tingimus ei tööta. [Student] Sa pead flip ta. Õigus, nii et see tingimus ei ole kunagi tõsi olla esialgu, kuidas me rääkisime sellest. Me tahame teha midagi lõpuni > Plus alustada? [Student] lõpus. Sest see on ainus arvutatud pool pikkust. Peate lisama hakata. [Nate] Mida see arvutab juures? Kui me mõtleme end selle väga esimese iteratsiooni silmus, lõpuks saab olema asendis indeks 7. Alustada on asendis 0. Pea meeles, me otsime kas kohal 3 või positsioon 4. Kui me vaatame seda matemaatikat, vaid teha seda veidi reaalsemaks, panna mõned numbrid siin on meil 7, 0, nii 7-0 ja seejärel / 2 on 3 täisarv rajoon, mis on. Siis me peame siis lisage tagasi meie hakata? Me ei käesolevas asjas. On väga esimese iteratsiooni, siis on see hea, sest alustada on 0. Aga nagu me edu, me teeme tõesti kõik lihtsalt vaja lõppu - alustada / 2. On veel üks trikk siin, ja see on nimelt üks tähtsam. [Student] Kas meil on vaja sulgudes? [Nate] Täpselt, ja see on, sest kui me ei pane neid sulgudes, siis selle rea, siis tõlgendatakse asemel kui (lõpp) - (algus / 2), mida me kindlasti ei taha. Vaata ette nende prioriteetsuse eeskirjad. [Student] Miks ei ole see lõpp + alustada? Miks ei ole see lõpp + alustada? [Student] Miks ei ole seda? Miks see oleks +? Ma arvan, et sul on õigus. [Student] Sest see on keskmine? [Nate] End + alustada, sa oled täiesti õigus. Vau, ma täiesti goofed. Sul on õigus. Kui me teeme miinus, me tahaks lisada alustada uuesti sisse Sel juhul, sa oled väga hea, et me tahame võtta keskmiselt kaks, nii et me ei taha neid lisada, mitte lahutama neid. [Student] Oleks ka tööd kui sa lõpuks - alustada / 2 + alata. See oleks kui me seda teeme, ma usun küll. Näiteks, kui otsisime alustada, ja me nihkunud selle siia kuni 15. Nüüd hakkavad on asendis 2. Lõpp on asendis 7. Kui me lahutame need, saame 5. Jagada, et 2, me saame 2. Ja siis me lisada 2 tagasi, ja mis saab meid 4. kohal, mis on siin, mis on keskpunktis. [Student] Kas meil on vaja hoolitseda ümbriste? Mis mõttes me peame hoolitsema pakkimine? Kui summa või vahe sõltuvalt sellest, kuidas me seda teeme, ei ole paarisarv. Siis arvuti saab segaduses, kas siis, kui see on 2,5; sa liikuda vasakule või paremale, et määrata, milline on keskpunktis? Käes. Tuleb välja, et on täisarv jagunemine, me ei ole kunagi saada neid ujukoma numbrid. Me ei saa kunagi kohaga. See on täiesti hävitada. Kui teil on arvuti jagada 2 int muutuja ja üks on 7 ja teine ​​on 2, sa ei saa 3,5 tulemusena. See saab 3. Ülejäänud ära visata, nii et see on tegelikult ümardamist ei ümmargused, vaid põrandale, kui te olete tuttav, et matemaatika, kus sa täiesti kõrvale kohaga, ja nii sa oled sisuliselt ürita seda allapoole lähima kogu positsiooni, lähima täisarvuni. [Student] Aga see on problemaatiline, sest kui sul on array 7 elementi siis mis teeb automaatselt 3. osa välja keskpunktis asemel 4.. Kuidas me sellega toime tulete? See on problemaatiline, sest kui meil oleks massiivi 7, see valiksid 3. asemel 4.. Kas te võiksite selgitada natuke rohkem? [Student] Sest kui sul on 7 elementi siis 4. osa oleks keskpunktis, eks? Jäta oma kommentaar on null indekseeritud, kuigi. [Student] Jah, nii asukohta 3. See oleks keskpunktis. Jah. Oh, okei. Ma näen, mida sa mõtled. See on selline imelik, nagu me harjuda kogu see mõiste vabanemiseks kümnendkohtade. See on hea punkt. Teeme sellele lõpu üles. Meie arvutused meie keskpunktis. Me katsetame, kas meie nõel on võrdne keskmise väärtuse. Me printida, et me leidsime selle, aga tõesti, mida me tahame teha sellises olukorras? Leidsime ta, et me tahame lase helistaja teate, et me leidsime selle. Meil on funktsioon, mis on tõeväärtus tipitud funktsioon. Kuidas me signaali, helistaja meie ülesanne, et me oleme valmis minema on meil öelda: "Hei, see on tõsi." Kuidas me seda teeme, Kevin? Sa noogutab pead. >> [Kevin] Lisa tagastamise tõsi. [Nate] Täpselt, tagasi true. Nüüd, kui see ei ole võrdne, kuidas me vaatame vasakul pool? Mingeid ideid? Stella, mingeid ideid? Teil tuleb määrata uus positsioon lõpus. Jah. Nii et me peame tegema positsiooni keskpunktis - lõpuks. Suur. Meil on vaja kehtestada uus seisukoht lõpuni vaadata vasakul pool. See oli see, mida me rääkisime enne, kui Hoian minnes tagasi selle näite. Olen algab siin, ja siis on mul lõpuks kogu tee siia. Jällegi, kui me otsime 15, ja meie keskpunktis on kell 16, ja me mõistame, "Oih, 16 on suurem. Me tahame liikuda vasakule poole võrra. " Meil oleks siis liikuda lõpp 15, ja me teeme seda, võttes üks kaugusel keskpunktis ja millega, et meie uus lõpus. Samuti siis, kui me tahame vaadata paremal pool, kuidas me seda teeme? Kas teil on idee? [Student] Sa lihtsalt seatud hakata keskpunktis + 1. [Nate] Tore. Ja nüüd nii, et me ei leia midagi, kas see saada hoolitsenud meie eest? Daniel, kas see saada hoolitsenud meie eest? [Daniel] nr [Nate] Kui me teeme seda läbi kogu massiivi ja me ei leia midagi, kus oleks, et tuleb hoolitseda, või peaks me hoolitseme selle eest? [Daniel] samas seisukorras. [Nate] Jah, samas seisukorras, täpselt. See hoolitseb läbimas kogu antennide massiivi, kui me ei leia midagi. See samas loop lõpeb. Me ei ole kunagi kokku puutunud selle tingimuse, ja me saame tagasi false. Me ei saa jätta ka seda, kui siin niimoodi sest kui see, kui väide on tõene, ja meie funktsioon tagastab, ja nii me sisuliselt katkestada see funktsioon selles punktis kui me tagasi tõsi. Aga mis juhtub selle struktuur here? Kas see töö täielikult, või on mõned loogiline viga on? On mõned loogiline viga on, sellega, kuidas see on loodud. Mis võiks see olla? [Student] Miks sa vajad - ja + 1s? See seab meie massiivi kuni tuleb meie uus vasak pool ja paremal pool. [Student] Aga miks ei võiks sa seda ilma - 1s ja + 1s? [Nate] Võiksime seada see võrdne keskpunktis? Mis võiks olla problemaatiline on? [Student] Ma arvan, et see on ebaefektiivne, sest sa oled kontrollimise väärtus, mis on juba kontrollitud. [Nate] Täpselt nii, Sam on täiesti õigus. Kui seate end ja alustada võrdne keskpunktis asemel - 1 ja + 1 reflektoorselt, mingil hetkel tulevikus me lõpuks kontrollida keskpunktis uuesti. [Student] hakkasin pset, ja siis mul oli midagi sellist kus ma unustasin + 1, ja see takerdunud lõputu silmuse. Jah, sest mingil hetkel sa oled kunagi saada alguse ja lõpu tegelikult kattuvad. Lahe. Seal on veel üks loogiline viga, ja see on, et see peaks kindlasti olema else if. Miks see võiks olla? Põhjuseks on, kui see ei ole else if-sa nägid seda, Kevin? [Kevin] Jah, sest siis muutub ka lõpp-punkti. [Nate] Täpselt. Me muutume tulemusnäitaja, ja kui see on kirjutatud niimoodi-Me teha ruumi vahel- kontrollib ta käesolevas asjas. Sel juhul, kui see õnnestub, siis lakkab välja funktsiooni. Siis vaadake seda järgmisel korral, ja kui see õnnestub, siis reguleerige lõpp, ja siis see jätkub ja kontrollida käesolevas asjas. Aga sel hetkel, me ei taha seda jätkata kontrollimist. Õnneks me ei ole nullitud keskpunktis siin, ja me teame, et sel juhul ei õnnestu. Aga me kindlasti tahame panna muidu kui seal isegi kui see võib-sel juhul kuna me ei kohandades keskpunktis, kas see muudab midagi? Ei, sest need juhtumid on kõik välistavad. Jällegi, minu paha. Me ei, ma arvan, tuleb see if. Me võime seda proovida ja kasutada seda ja vaata, mis juhtub. Ehitus, viga. See on ilmselt seetõttu jätsin need B ja e on siin. Kas mul on veel neid üles ülaosas? See ei näe välja nagu see. Me suumimiseks ehitada, seal ta läheb, nii et nüüd, kui me otsida 15, Jah. Lubage mul suumimiseks 15, jah. Me võime kasutada seda uuesti. Uploading lähtekoodi, hoone, töötab. Me ei saa otsida midagi 13 ja me ei saa midagi printida, nii et see ei leia, et meie jaoks. See on suurepärane, sest see ei ole meie nimekirjas. Meil on nüüd aeg otsa saama. See saab olema see sel nädalal. Täname, ning näeme hiljem. [CS50.TV]