[Powered by Google Translate] [Oddelek 3] [manj udoben] [Nate Hardison] [Harvard University] [To je CS50.] [CS50.TV] V redu, začnimo. Dobrodošli v tednu 4 CS50. Če vidva odprla spletni brskalnik in odprla pset 3, Boj z CS50, bomo začeli dogaja z delom vprašanja tam. Tako kot prejšnji teden, bomo delali v CS50 prostorov, če boste tudi, da potegnite navzgor, kot tudi, in če greš naprej in obiščite to povezavo, da sem dobil tu na vrhu. To je čas, da bi začeli. Imamo našo malo hi programa tukaj. Nič noro. Ena od prvih stvari, ki jih želim storiti z vami danes je šel čez nekaj rešitev Set za Težava 1, naravi primer rešitev, samo zato, da boste dobili občutek za kakšne vrste osebja kode piše, kakšne kode drugimi učenci pišejo, in so si lahko pogled na to, ker vem, da je čudno ko boste poslali rešitev nekega problema niz in dobil pripombe na svojo različico, ampak včasih je koristno, da vidite, kako drugi ljudje to storil, še posebej tisti, ki so lepo videti. Za večino del, sem bil res navdušen nad rešitvami, ki proizvaja fantje. Nisem še začeli iskati svoje 2s Set problem, ampak če si kaj takega prvi, to ne pomeni nič, ampak dobrih stvari. Če pogledate moje revizij, začnimo vso pot navzdol na revizije 1, in bomo na hitro pogledamo na rešitev Mario. Če potegnem gor, ti programi, da se bomo predstavili pravilna. Ni bilo pravilnost vprašanja s temi problemi, ampak, želimo govoriti malo informacij o različnih vprašanjih načrtovanja da so bili tu uporabljeni. Ena od stvari, ki se je zanimivo rešitev je, da se uporablja ta nov konstrukt, imenovan funt opredeliti, včasih imenujemo tudi hašiš opredeliti. Naj približati tem tukaj. # Define vam omogoča, da imena teh številk v programu. V tem primeru je največja višina piramide v Mario je 23 in ne 23, kot da bi v moji kodi- mi bi jo, kot trdi kodiranje 23 - Namesto tega daje ime MAX_HEIGHT na to številko, tako da tukaj v moji do-while zanko lahko dejansko nanašajo na MAX_HEIGHT namesto da bi število 23 palcev [Študent] Kaj je prednost s tem? To je veliko vprašanje. Ena je berljivost. Prednost uporabe te # define je berljivost. Ko berem te kode, vidim, kaj se dogaja. Vidim, da sem v takem stanju, da smo testiranje za višino pa <0, ki bi jih lahko opredelili tudi da je najmanjša višina ali višina min. Druga prednost je, da lahko potem preberite preostanek proge za prikaz da smo tudi preverjanje zagotoviti, da višina ne presega višine max, ker bomo še naprej, medtem ko je višina večja od višine maks. Druga prednost je, če sem pomanjšanje malo tu- če sem teči ta program in ga poženem, recimo, z 23 prav zdaj, se bo izpisal vse vrstice 23, tako kot to. Ampak rekel sem želel spremeniti višino max, in zdaj želim, da se omeji maksimalno višino piramide da je edini pravi človek, da je funky. # Vključujejo , # define MAX_HEIGHT, in recimo, da smo želeli določiti ga je enak 10. Zdaj v tem trenutku, vse, kar sem moral storiti je spremeniti v tej enem mestu. Lahko prevedem kodo, in zdaj, če sem poskusil in vnesite 12, bo uren mi še enkrat. V tem primeru, bomo le z uporabo MAX_HEIGHT enkrat. Saj ne, da je velik šop trave, da gredo v in ga spremenite v while zanko, če želite. Toda v programih, kjer se sklicujete na isto čarobno številko znova in znova, to # define mehanizem je zelo priročen ker ste spremenili to enkrat na vrhu spisa, je običajno, kjer ste postavili ju- in spremembe giblje skozi ostale datoteke. Druge stvari, ki sem jih želel opozoriti na to nalogo, da sem mislil videti res lepo, 1 je poimenovanje spremenljivk. Vidite tukaj, da imamo celih spremenljivke, imenovane vrstice in ti višina. Prostori, haše, saj pomaga, da koda malo bolj berljivo, Zato je malo bolj razumljivo, kaj se dejansko dogaja. To je v nasprotju z uporabo, na primer, naključnih črk ali pa samo klobasanje v celoti. Zadnja stvar, bom poudaril, da je v for zanke, Pogosto so ti Iterator spremenljivke, ti števci, ki jih uporabljate v vašem for zanke, je standard in konvencionalne jim začne z i in nato J in nato k in bo od tam, če potrebujete več spremenljivk, in to je samo konvencija. Obstaja veliko konvencij. To je odvisno od programskega jezika, ki ga uporabljate. Toda v C, smo ponavadi začnejo z i. To nima nobenega smisla uporabljati, recimo, ali b odvisno od situacije. To je bilo za to. Če zdaj dvigni Revizija 2, boste videli drugo Mario, in to je podoben drugemu tistega, ki smo ga pravkar videli, vendar pa nekaj nekako kul. Če se ozremo na tem oddelku, tukaj notri notranja zanka, oni z nekaj norega videti sintakso prav v tej vrstici. To se imenuje ternarna operater. To je, če drug izjavo strniti v eno vrstico. Pogoj je ta del v oklepajih. To je enako rekel, če j > Sam. Sam. Kot Sam je dejal, da je linearen proces iskanja se bo res počasi, in namesto z binarnega iskanja, kako to deluje, je, da vsakič, ko gremo skozi ponovitev naše iskalno algoritem, bomo razdelili seznam na pol, v bistvu, v dve manjši sezname. In potem v naslednji ponovitvi zanke, ga bomo ponovno delijo v drugih manjših seznamov. Kot lahko vidite, je težava ohranja vse manjši in manjši saj bo v tem izloči polovico seznama vsak čas. Kako to zavreči deluje? Tako kot opozorilo, kaj bomo storili, če bi bili računalnik in smo bili, recimo, iskanje števila 5 na tem seznamu je, da bi izbrali številko v sredini. V sredini tega seznama, saj so 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 številk, da bomo izbrali številko ali na 4. mestu ali na 5. mestu, in bi rečemo, da je na sredini našega seznama. Izberite številko v sredini. Potem, tako kot Sam je dejal, bomo test, da vidim, če je to število enako na številko, ki jo želimo dobiti ali naši želeno številko. Če je enaka, nato pa smo ga našli. Zmagali smo. Če to ni enako, potem obstaja nekaj primerov. Oba primera sta bodisi število mora biti večje od števila Iščemo, ali pa je manj kot. Če je več, gremo na desno. In če je manj, gremo na levo. In potem ponoviti celotni postopek še enkrat bodisi na desni polovici ali levi polovici seznama. Prvi problem v oddelku današnji je, da ugotovimo kako lahko dejansko začeli izražati to oznako C. Imamo psevdokod tukaj. Kaj bomo s tem začeli ukvarjati se bom dvigni popolnoma nov prostor, razen tega pregleda, tako da imamo te zapiske za kasneje, bomo izbrisati vse to, potem pa kopirate in prilepite iz problemskega sklopa ta podatek v naših prostorih, in upajmo, da to ne zlomi. Popolno. Če vi vsi storili, kopiraj in prilepi to kodo v svoj novi prostor, v prazno eno. Poskusimo Daniela. Če Prevedite in poženite ta program, ne deluje? Ne >> Kaj je rekel? Pravi nadzor doseže konec ni nična funkcijo. Ja, zato naj ga poskusite teče. Ste vi videli to? Ali veste, kaj to pomeni? V redu, secirati to malo. To je rekel na file.c v vrstici 9 stolpca 1 smo napako, tako kot si rekel, in pravi, da je izhajajoč iz napake opozorila in opozorila povratnega tipa. Izgleda, da se nekaj dogaja s povratno tipa, ki ima smisel. Imamo ne nična funkcijo, kar pomeni, da imamo funkcijo da se ne vrne neveljavne. Void funkcija je tista, ki izgleda takole: nična foo (), in to je ničen, ker je donos tip nična, kar pomeni, da če bi imeli kaj tukaj kot zameno 1, bi dobili prevajalnik za to napako. Vendar pa imamo non-nična funkcijo. Naša ni nična funkcija v tem primeru je naša funkcija iskanja ker ima povratno tip int. Ko se govori, da je nadzor izteče brez void funkcijo, to je zato, ker iskanje nima povratnega izjavo. To se ne vrača ničesar tipa int. Mi lahko popraviš, in kaj mislita Iskanje treba vrniti privzeto? Kakšna bi morala biti privzeta vrnjeno vrednost iskanju? Ker to je tisto, kar bomo lahko na koncu. Charlotte, imaš vse,? Drži ali ne drži? >> Drži ali ne drži. Katera? False. Ne vem. False? Poskusimo. Zakaj bi rekli, da vrnitev ne drži? To je dobro intuicijo. [Charlotte] Ne vem. Bomo vrne false v tem primeru, saj bo to naš privzeto če iz nekega razloga je seznam prazen, ali pa se igla da iščemo, ne obstaja. Potem pa čisto na koncu, če se ne bomo vrnili res že v tej funkciji, smo vedno vedeli, da bo ta funkcija rekel Nope, to ni v polje. To ni v kopici sena. Zdaj, če želimo zbrati in prost dostop to, kaj mi rešiti to, da bomo lahko ga potegnite navzgor. Zdaj, če želimo pripraviti in voditi naš program, se gradi. Smo dobili našo malo uren. Če sem zadel 4-uh-oh. Ni natisniti ničesar. Zdi se, kot da je vse končalo dobro. Moramo izpolniti to noter Pogovarjala sva se o algoritmu v Psevdokoda malo nazaj. Naj vidim, razen tega, in jaz bom pritisnil na algoritem spet nazaj. Gremo tega tipa. Ne. Tukaj je. Kako to storiti? Kaj bi bilo dobro strategijo za zagon te kode? Moraš izbrati številko na sredini. Kako izbrati številko v sredini niza? Vsi predlogi? [Študent] strlen deljeno z 2. Strlen deljeno z 2. To je eno veliko. Strlen dela s posebnimi vrstami nizi. Kakšne vrste polj? String nizi znakov polja. To je ta ista vrsta koncepta, ki ga želimo uporabiti, vendar ne smemo uporabljati strlen, ker nimamo niz znakov. Imamo vrsto ints. Toda kaj strlen dobil za nas? Ali veste, kaj je dobil za nas? [Študent] strlen dobi nam dolžino. Točno tako, da postane nam dolžino. Strlen dobi trajanja niza za nas. Kako bomo to dosegli, da je v našem programu binarnega iskanja? Kako bi dobil dolžino array? [Študent] strlen? Lahko dobite dolžino pravilno oblikovano niz niz C s strlen. Problem pa je, da nimamo niz niz. Če se ozremo na to oznako, imamo to celoštevilsko matriko. Kako vemo, kako dolgo je to? [Študent] Ali obstaja ekvivalent 1 za končne točke, kot so int l, ali kaj? Izkazalo se je, da pravzaprav ni, in tako na nek način je to ena od tistih stvari, ki je samo dobro vedeti o C, da ne obstaja način, da dobite dolžino niza Če vse, kar vam je matrika. Razlog, da deluje s strunami, razlog strlen dela, Kajti če je niz pravilno oblikovana, da bo imel ta poseben 0 \ znaka na samem koncu. Prav tako lahko predstavljate, če imate nepravilno oblikovan niz in ni \ 0 znakov ni, potem je vsa stvar ne deluje. [Študent] Lahko dodate \ 0? Lahko bi v tem primeru. Lahko bi dodali neke vrste \ 0 ali nekakšen ki pomeni znak in nato uporabimo. Ampak to se ne bo delovalo dokaj ker \ 0 je za char tipa, in tukaj imamo ints. Druga stvar je, če smo bili, da uporabite posebno vrednost kot -1, ki označuje konec matrike potem nikoli ne bi shranjevanje -1 v naših celih nizi. Mi bi obtičala. Izkazalo se je, da je edini način, da dobite dolžino od array v C je dejansko zapomniti Ko ga je ustanovil in ga prenesti okoli z matriko tako da, ko sem imel nalogo, da se dogaja, da naredite nekaj dela na paleto cela ali pa na vodi ali podvoji ali kaj ste, Prav tako je treba, da je funkcija array dolžine, in to je točno to, kar smo storili tukaj, v iskalno funkcijo. Če pogledamo, kaj smo storili, ko se peljemo v naši matriki tukaj smo tudi pass po dolžini, velikosti. Prav tako se zgodi, da smo jo poimenovali to spremenljivko tukaj, ta parameter ali argument. To se imenuje funkcija, je argument seznam ali seznam parametrov, in se to imenuje tudi trditve ali parametri. Ljudje uporabljajo različne izraze, ob različnih časih. Včasih zamenjajte jih sam. Samo tako se zgodi, da se ta spremenljivka tukaj imenovan podobno za to # define tukaj. Ampak oni niso ista stvar. Kapitalizacija ne zadeva. Če pogledamo, kaj se dogaja tukaj izjavljamo, Naša int matrika, ki smo ga imenuje številke. Mi smo mu dala svojo velikost, ki ustreza naši # define na vrhu. To se dogaja, da je 8. In potem, ko smo potem pokličete našo funkcijo za iskanje spodaj, peljemo v številu želimo iskati, ki smo ga pozove, gotten od uporabnika. Peljemo v polju, to številke, in potem imamo tudi prehod v velikosti matrike, in potem se shrani vrednost velikosti 8 ali opravil s tem celo spremenljivko imenovano velikosti. Imamo velikost matrike. Zdaj, če gremo nazaj na to, kar smo govorili že prej, Mislim, da Missy pripeljal poudaril, da tisto, kar je potrebno storiti, je dobil dolžino niza in ga delimo z 2, in da nam bo dalo srednjo. Pa poglejmo. Ali imam lahko nekdo napisati in ga shrani v prostoru? Kaj pa Leila? Ali imam lahko pišete to? Napišite prvo vrstico, kjer ste vzeli na dolžino niza, in dobili srednjo vrednost in ga shranite na nove spremenljivke. Dam ti nekaj sekund. Ste pripravljeni? [Student neslišno] Seveda, bi sem vam izračuna srednjo vrednost v senu matrike znotraj funkcije iskanja z dolžino senu niz, ki je spremenljiva velikost? Nič zapleteno tukaj. [Leila] Samo velikost / 2 in samo- In jo shranite, in kliknite na gumb Save tu na vrhu, in bomo ga potegnite navzgor. Popolno. Takole. Neverjetno. Ker je to sestaviti? [Leila] Ne, to mora biti višja. [Nate] Ja, kaj moramo narediti? [Leila] Kot int sredini ali kaj podobnega. Neverjetno. Ja, kaj je storil, int sredina = velikost. Bo to sestaviti? Naj izbrisati komentar in ga spraviti ven s poti. Kaj ne bo sestavil o tem? Ne delamo nič s celo število, zato moramo natisniti to ali kaj podobnega. Ja, točno tako. Dobili bomo neuporabljeno spremenljivke. Kaj vse še ne bo šlo za to? Mislim, da si nekaj rekel, Sam. Podpičji. Ja, manjka ti podpičji. To se dogaja, da je stalnica v življenju ves čas mandata. Zadnja stvar, bom naredil je, da bom dal nekaj praznega prostora na obeh straneh tega subjekta v tej zadevi, ker je to običajno, kako to storiti po našem slogu priročnika. Imamo srednjo vrednost našega matrike. Zdaj, če se spomnimo nazaj na naš algoritem, kaj je naslednji korak, da smo morali storiti, ko bomo imeli srednjo vrednost? [Študent] Če je to večji [neslišno]. Ja, zato moramo narediti neke vrste primerjave, in kaj smo primerjali tukaj? Rekel si, če je večji od. Kaj je v tem stavku se nanaša na? Številka, ki pride gor, če je to več kot v sredini, nato pa pojdite do array? Točno tako število, ki pride, ko- Kazalec, tako da smo v primerjavi z iglo, in kaj smo primerjali glede na igli? Ker je igla je tisto, kar smo iskali. Mi smo ga primerjali, da bi dobili na sredini. Toda, ali je smiselno, da preverite, Če igla = sredina? Ima to smisel? Ali kdo ne strinja? Dajmo mu poskusiti, če (igla == sredini). [Študent] Ali printf si ga našel. [Nate] printf ("Našli smo ga \ n!"); V nasprotnem primeru, grem, da začnete delati nekaj drugega tukaj. Jaz bom za začetek dajanja izjav naramnice okoli, če ves čas samo zato, ker če bomo dodali še več stvari, potem ne bomo dobili prevajalniki. Ja, Sam. Imaš prav. Težava je v tem, da je sredina predstavlja položaj v matriki, vendar pa lahko dobite, da je vrednost v tem položaju array. To je odlična točka. Ste vsi slišali, kaj Sam je rekel? Dejal je, da je to srednji predstavlja le položaj v matriki, vendar to ni dejanski element v matriki. Če menite, da o kodeksu kakor je zapisano zdaj, če se ozremo na tem polju tukaj, ki ima 8 elementov v njem, Kakšna je vrednost sredina bo v tej funkciji? [Študent] 4. [Nate] 4. Če se ozremo na številko 4 - in bomo lahko šele prost dostop to kodo in dal malo žalosten obraz tukaj saj ni zdelo, če vodimo to kodo kot je sedaj, ga naložite, stavbe, naj se pomaknite navzdol in če gledamo na številke 4 smo ga našli, pa nismo dobili to printf ja. Eden od razlogov je, da se nismo vrnili res, vendar pa smo res našli številne 4? In Sam ne govorim. Kaj smo našli? Smo res pokazala srednjo vrednost, ki je, če gledamo na matrike tukaj, to se dogaja, da je element na indeksu 4, ki jih gledaš, kar je 23. Kako bomo dejansko dobili ta element v sredini in ne samo sredina sama? [Študent] želimo vnesti znak ali kaj? Kaj bi to naredil, samo iz radovednosti? Lahko poveste malo več? Moraš spremeniti položaj v številu, Tako moraš narediti neka povezava, mislim, da je znak, vendar ne bi bilo. Ja, to je dobro izhodišče. Smo bili delaš veliko tega konvertaze mest v znakov, teh znakov, V prvih dveh problemskih sklopov. Izkazalo se je, da je tukaj, je to skoraj podobno dostop do wi znak v nizu, če je to smiselno. Tu želimo dostopati v sredini elementa. Kako bomo to storili? Kevin, ali imate kakšne predloge, kako bi lahko to naredil? Lahko bi naredil senu, oklepaj, v sredini, zaprta nosilec. Lahko napišete, da je za nas? Shranite jo v tukaj in potegnite bomo tako naredili. Iščemo tej progi 9, in smo spoznali, da si ne želimo primerjati iglo na sredini, namesto tega pa smo želeli primerjati iglo elementu na sredini položaja v naši senu matrike. Kul. Takole. Ja, to izgleda precej dobro, če (igla == senu [sredina]). Našli smo ga. Zdaj, če želimo zagnati kodo bova nazaj gor, malo- se pripravlja, da teče, in zdaj, če pogledamo na 4, nismo našli, ker zdaj smo dejansko dobili številko 23. Gremo na vrednost 23, in to je tisto, kar smo v primerjavi z našo iglo. Ampak to je dobro. To je korak v pravo smer. To je tisto, kar smo poskušali narediti. Ne bomo poskušali primerjati iglo proti pozicije v matriki ampak glede na dejanske elemente v matriki. Če se ozremo nazaj, zdaj na naslednji korak v našem algoritmu kaj je naslednji korak? Leila že omenil na kratko. [Študent] Preverite, če je večja ali manjša od in se nato odloči, v katero smer se premika. [Nate] Ja, kako bi to naredili? Ali lahko dal v nekaj-Bom rešiti to revizijo, in potem, če si dal na nekaterih progah, ki bo naredil to. Ja, Charlotte. >> Imam vprašanje. Ali ne bi bilo sredini - 1, saj je prva stvar, ki je to je 0 indeksira, tako da, če damo 4, to dejansko ni znakov, ki ga iščemo? Ja, in drugi problem pri tem je, To je velik ulov, saj je, kaj se bo zgodilo na koncu morda če bomo naprej in se ne bomo nikoli prilagodijo na začetku? Mislim, kaj bi lahko na koncu delaš poskuša dostopati element na 8. mesto matrike, ki v tem primeru ne obstaja. Bomo želeli narediti neke vrste računovodstva za to, da imamo neke nič indeksiranja. [Charlotte] Oprosti, mislil sem srednjo - 1 v oglatih oklepajih. To lahko storimo. Vrnila se bova k temu vprašanju v zelo malo. Ko smo začeli, da bi dobili dejanski zanka, da je, ko bomo res videli to pride v poštev. Za zdaj, bomo to naredili, ampak ti si popolnoma prav. To bo nič kazalo vpliva, da moramo obračunati. Pa poglejmo. Kako je večja od manj kot-? [Študent] bom, kako to storiti, in več kot manj del. Pravkar sem bil prepričan, kaj natisniti, če se vam zdi, da je manj kot v senu sredini ali več. Tukaj lahko shranite kar I've- [Nate] Ja, če shranite kar imaš, in bomo ga potegnite navzgor. Takole. [Študent] In sem dal vprałaje za kar nisem vedel. [Nate] To izgleda super. Tu imamo vprałaje, ker še vedno ne vem kaj bomo narediti še precej. Kaj bi želeli narediti-ups, imamo nekaj funky naramnic vse na nas. Mi bomo popraviti te aparata. Takole. In tako se kaj želimo narediti, glede na naš algoritem, Če ne bomo našli igle? Recimo v primeru, da je igla manj od tistega, kar smo iskali na. Kevin. Samo poglej levo polovico. Točno, tako da bomo dal komentar v tukaj, ki pravi "pogled na levo polovico." In če je igla večja od senu na sredini, kaj želimo storiti? [Študent] Potem pogledaš na desni polovici. Pogled na desni polovici, "pogled na desni polovici." Ne preveč slabo. Ok, tako da na tej točki, so stvari videti precej dobro. Težava z oznako kakor je zapisano, kaj? [Študent] Nimaš končne točke za polovicama. V redu, nimamo končne točke za polovicama. Prav tako so le, da bo šel skozi to enkrat. Mi smo le, da bo pogled na eno sredini. Ali je element obstaja, ali pa je ni. Za dokončanje tega, bomo morali narediti neke vrste ponovitev. Moramo se ponavljajo, dokler ne ugotovijo, da bodisi element je tam zato, ker smo zožil in končno našel, ali to ni tam, ker smo pogledal skozi vse stvari, v ustreznih polovici polja, in ugotovila, da ni nič tam. Kadarkoli smo dobili to ponavljanje dogaja, kaj bomo za uporabo? [Študent] zanka. Neke vrste zanke. Da. [Študent] Lahko naredimo do-while zanko in jo naredil, nato pa igla ni enako-Nisem prepričan, če sem šel s tem. Ampak nekako kot to, da dokler ni enaka vrednosti, ki jih uporabnik vložek. Ja, pa poglejmo, kako bi to sama napišem? Rekel si, da greva uporabo do-while zanko. Če pa to začelo? [Študent] Takoj po velikosti / 2. [Nate] Ok, in kaj bomo storili? Bomo izpolnite časa kasneje. Kaj bomo naredili? [Študent] Ne želimo storiti vse stvari, ki jih imamo v if dela? [Nate] Ali vse te stvari, super. Kopiranje in lepljenje. Oh, človek. Poglejmo, če to deluje, če bomo lahko jeziček tole. Čudovito. Ok, to rešimo tako vi ga imate. V redu, in bomo to naredili ob- kaj je pa pogoj, da si potem? [Študent] Medtem ko se igla ni enako, tako kot klicaj. Ampak ne vem točno, kaj je še. [Nate] Ja, to je eden od načinov, da to storite. Sam, imate komentar? [Sam] sem se spomnil, ko sem pogledal video posnetke, Vzel sem screenshot enega od podobnih, ko smo naredili psevdokod za to, je bilo nekaj razmerje med max in min. Mislim, da je bilo nekaj podobnega, če max je vedno manj kot minuto. Razumem. [Sam] Ali je všeč, če max ni manj kot minuto ali kaj podobnega, saj bi to pomenilo, da je vse, kar ste iskali. Ja, pa kaj se sliši kot max in min so bili nanaša? [Sam] Vrednosti da-cela števila, ki se bodo spremenile glede na katerih smo dali srednjo vrednost. Točno tako. [Sam] Na tej točki, da se bo [neslišno] izračunati max in min. Središčna točka je to max in min ideja. Ali to smiselno ljudje? Če bi začeli videti, kako bomo to storiti ponovitev, imaš popolnoma prav, da želimo uporabiti neke vrste do-while zanko. Ampak mislim, da če se spomnimo, kaj se dogaja na kraju samem te matrike in kaj se pravzaprav dogaja, grem, da napišete tukaj, na zelo prvi ponovitvi binarnega iskanja, imamo- Bom uporabila B in E, ki označuje začetek. In potem je konec naše matrike. Vemo, da je začetek pri 4 pravici tukaj, in vemo, da je konec na 108. Povejte nam iščete številko 15. Prvič smo to naredili, kot smo videli prej, sredina, bodisi bo 16 ali 23 odvisno od tega, kako izračunamo stvari. Ker enakomerno razdelitev na sredini bi nam ta prostor med 16 in 23, ne moremo enakomerno razdelite ali ga je treba razdeliti in se ob pravem sredini. Bomo pogled na 16 let. Bomo spoznali: "Hej, 16> 15, ki ga iščemo." Če pa pogledaš na levi polovici matrike kaj bomo na koncu delaš je zavržemo ta celoten zgornji del in rekel: "V redu, zdaj je naša končna točka je, da bo tukaj." Naslednja ponovitev naše zanke, smo sedaj si ogleduje ta niz, dejansko ko se zavrže ta del, ker zdaj če smo vzeli srednjo vrednost, da razlika med začetkom in koncem, smo ugotovili, da naši sredini, da je 8, , ki jih lahko nato test 8, kje je v primerjavi s številom, ki ga iščemo, 15, ugotovili, da je 15 več, Tako smo se preselili na desnem delu seznama, za katero vemo, ker smo ljudje, in smo ga lahko videli. Vemo, da je pravica del se bo, če ga najdemo, vendar računalnik ne ve, da je to tisto, kar bom naredil, je, da bomo dejansko so to gor, zdaj pa je začetek in konec so na istem mestu, tako da je sredina postane le številka na seznamu na tej točki, kar je 15, mi pa smo ga našli. Ali to delno osvetlile o tem, kje je vsa ta max in min zapis se dogaja, sledenja končne točke v niz, da bi ugotovili, kako zmanjšati stvari dol? Kaj bi se zgodilo, če bi bilo to ni enako 15 zdaj? Kaj pa, če smo iskali 15. in namesto tega, da je ta številka bila tudi 16? Mi bi rekli, "Oh, to je več. Želimo, da se vrnete na levi strani. " In sva se premaknete naš e na desno, Takrat imamo končno točko, da bi bilo nasprotujoče. Ne bi mogli iskati vse več elementov ker zdaj imamo končno točko in začetno točko, naše Naša največja in naša min, zdaj obrnilo. Iščemo prek celotnega niza. Ne moremo najti ničesar. To je točka, na kateri bi se želimo povedati, "Ok, bomo ustavili ta algoritem. Nismo našli ničesar. Vemo, da je ni tukaj. " Kako se to dogaja? [Študent] Kako točno se računalnik preklopi na koncu? Kako koncu končal pred začetkom? Konec konča pred začetkom zaradi matematike, ki ga bomo narediti vsakič, ko to stori. Pot smo zamenjali je, če pogledamo zelo prvič to storimo swap kjer imamo na začetek in konec 4 vso pot navzdol na 108 in naša sredina, recimo, na 16 - Jaz grem v prikrivati ​​to nazaj do 15-če iščeš 15, smo vedeli, da to, kar smo storili, ko smo pregledali 16 in videl, da je večja in želel zavreči celoten desni del seznama, smo videli, da tisto, kar smo želeli storiti, je premakniti e tukaj. Dejansko dobil e preselil v 1 pred sredini. Tudi, ko smo to ponovitev algoritma in sredina je bila ob 8, smo ugotovili, da je 8 <15, zato smo želeli premakniti b 1 preteklosti sredini. Zdaj, začetek in konec sta skupaj v tem 15. Če bi se dogajalo, da si za kakšno drugo vrednost, ne pa 15, ali če bi to bil 15 namesto 16, smo ugotovili, da bi se e želimo premakniti 1 pred sredini. Zdaj bi e tam obrnil manj kot b. Sprehodimo se skozi kako smo dejansko na koncu to kodiranje algoritem. Vemo, da želimo, da je to razpolovišča izračun. Vemo tudi, da želimo slediti začetek in konec polja, našega trenutnega niza, tako da lahko ugotovimo, če je to leva polovica seznama je in če je desna polovica seznama je. Mi, ki bodisi z začetka in konca, ali lahko rečemo min in max. Uporabil bom začeti in končati ta čas. Ko smo začeli, če se ozremo nazaj v našem primeru tukaj, naš začetek je bil na samem začetku niza, kot je naravna. Kaj je indeks to? Kaj naj bi začeli naše? Daniel. [Daniel] Haystack [0]. [Nate] Ja, tako bi jo lahko postavi na senu [0]. Problem pa je, da nam ni položaj prvega elementa. To nam daje indeks prvega elementa ali dejansko vrednostjo v tistem prvem mestu. [Študent], ki bo pretvoriti v 0,20? [Nate] Kaj bo to storiti, je, dobro, da ne bo naredil nobene konverzije. Kaj bo naredil, je, da bo shranjevanje 4 leta začeli, in potem bo težko za primerjavo pred začetkom ker se bo začelo se ima vrednost 4, ki je začetek našega niza, vendar želimo, da bi spremljali indeksi v matriki v nasprotju z vrednotami. Bomo dejansko uporabo 0, kot je ta. Za konec array-Charlotte prinesel to gor malo prej. To je, če bomo upoštevali nič indeksiranja. Charlotte, kaj je konec niza? Kaj je indeks na koncu? [Charlotte] Velikost - 1. Ja, in katera velikost moramo uporabiti? Moramo uporabiti kapitalsko velikosti ali male črke velikosti? Kapital velikost. V tem primeru bi lahko uporabili kapitalske velikosti. Če bi želeli to funkcijo za prenosne in uporabo te funkcije v drugih programih, lahko dejansko uporabljajo male črke velikosti. Saj je v redu preveč. Ampak Charlotte je popolnoma prav, da želimo imeti velikost - 1. Na tej točki, [Študent] Kako to, da lahko uporabite velike črke velikosti? Kako to, da smo lahko uporabite velike črke velikosti? Izkazalo se je, da gre res # določa, pod pokrovom motorja, kot je bil tekst in jih zamenjajte, če je to smiselno. Ko prevedete kodo, predobdelava faza od prevajalnika gre skozi spisa, in išče povsod, da ste napisali kapitala velikosti, in nadomešča besedilo, da dobesedno z 8, kar tako. V tem smislu je to zelo razlikuje od spremenljivke. To ne zavzame nobenega prostora v pomnilniku. To je enostavno besedilo zamenjajte trik. V tem primeru, bomo uporabljati velikost. Od tu si želimo narediti neko vrsto ponavljanja, in da smo na pravi poti z našimi do-while zanko. Želimo nekaj narediti, dokler pogoj ne drži več, in kot smo videli prej, smo videli, da je ta pogoj je res, da ne želimo konec na manj kot začeti. To je naša ustavljanja stanje. Če se to zgodi, želimo ustaviti in razglasi kot, "Ej, nismo našli ničesar." Če želite izraziti to, si želimo, da uporaba neke vrste zanke. V tem primeru bi bilo do-while zanko, zanke for, while zanko? Imamo do-while zanko tukaj. Ali ste vi, kot ta pristop? Ali menite, da bi morali poskusiti drugačen pristop? Kevin, vse misli? Lahko bi imeli while zanko, saj vemo, največ bi bila večja od min na začetku nekako. Ja, tako da ni inicializacijo, da se mora zgoditi. Ti do-while zank so super, če imate kaj za inicializacijo pred tem testiranje, ker je tukaj vemo, da ne bomo, da bo tako reinitializing začne in konča Vsak krog zanke. Vemo, da jih želimo inicializacijo, potem preverite naše stanje. V tem primeru bom dejansko šel s preprosto zanko, medtem ko. Izkazalo se je, da se naredi medtem ko zanke uporabljajo precej redko. Veliko krajev sploh ne učijo, medtem ko se zanke. Oni so dobri za ravnanje vnos uporabnika, tako da smo videli veliko od njih doslej. Ampak normalno, in medtem ko zanke so veliko bolj pogosti. Izkazalo se je, da je ta pogoj kot je zapisano Ne bo nam res veliko dobrega, in zakaj je to? Žal mi je, ne vem tvojega imena. Jaz sem Jerry. >> Prosim? To je B-O-R-U-I. Oh, v redu. Jaz ne vidim na mojem seznamu. Oh, to je zato, ker, oh, to ima smisel. Imate idejo, zakaj to, medtem ko zanke ne bodo delovali kot je bilo predvideno, kot je napisano s pogojem? [Jerry] Misliš, da želite vse stvari, potem ko je v samem? Ja, to je ena. Morda bomo morali dati vse te stvari v while zanko, ki je popolnoma res. Druga stvar, ki je malo bolj problematično pa je, da ta pogoj ne deluje. [Študent] Moraš ga flip. Točno, tako da ta pogoj ne bo nikoli res prvotno pot smo se pogovarjali o tem. Želimo nekaj narediti do konca leta > Plus začeti? [Študent] Na koncu. Ker je izračunana le polovico dolžine. Dodati morate začeti. [Nate] Kaj bi to izračunali za nas? Če razmišljamo o koncu o tem zelo prvi ponovitvi zanke, konec se bo položaj v indeksu 7. Začeti je na položaju 0. Ne pozabite, da smo iskali bodisi Stališče 3 ali 4 položaj. Če pogledamo ta matematika, samo, da bi bilo malo bolj oprijemljivo, dal nekaj številk, imamo 7, 0, Tako 7-0, nato pa / 2 je 3 leta celo delitev, da je. Potem se moramo vrniti nato dodajte naša začeti? Mi v tem primeru ni. Že prvi ponovitvi, bo to v redu, ker je 0 begin. Toda, kot smo napredek, bomo res vsi potrebujejo samo Konec - Začetek / 2. Še en trik tukaj, in da je to ena od prednosti. [Študent] Ali potrebujemo oklepaje? [Nate] Točno tako, in da je zato, ker če ne bomo dal te oklepaje, potem se bo ta postavka razlagati namesto kot (konec) - (začetek / 2), ki vsekakor ne želimo. Pazi za tiste, pravila prednost. [Študent] Zakaj se ne konča + začeti? Zakaj se ne konča + začeti? [Študent] Zakaj ni tega? Zakaj bi bilo +? Mislim, da imaš prav. [Študent] Ker je to povprečje? [Nate] Konec + začeti, si popolnoma prav. Vau, sem popolnoma zaspal. Prav imaš. Če bomo delali minus, bi želeli dodati začel nazaj noter V tem primeru, ste zelo prav, da želimo, da se povprečje dveh, tako da nam jih želite dodati, v nasprotju z njihovo odštevanje. [Študent] Prav tako bi delovalo, če si konec - Začetek / 2 + začeti. Poleg tega bi bila, če mi-Verjamem. Na primer, če smo iskali na začetek, in jo preusmerila tja do 15 let. Začele so se na mestu 2. Konec je na mestu 7. Če jih odštejemo, dobimo 5. To delite s 2, dobimo 2. In potem dodamo 2 nazaj, in da nam pride na 4. mesto, , ki je tukaj, ki je sredina. [Študent] Ali moramo poskrbeti za zavijanje? V kakšnem smislu pa moramo skrbeti za zavijanje? Če vsota ali razlika med odvisno od tega, kako to storiti, ni sodo število. Potem se računalnik zamenjati, ali ko je 2,5; ne premaknete v levo ali v desno, da ugotovita, ki je sredina? Razumem. Izkazalo se je, da s celo enoto, ne bomo nikoli dobili te številke s plavajočo vejico. Nikoli nismo dobili decimalke. To je popolnoma zavreči. Če imate računalnik delite 2 int spremenljivke, in ena 7, druga pa 2, ne boste dobili 3,5, kot rezultat. To bo dobil 3. Preostanek bodo zavržene, tako da je dejansko zaokroževanje ni okrogla, ampak tla, če ste vi poznate, da pri matematiki, če ste popolnoma zavreči decimalke, in tako si v bistvu ga oklesti navzdol na najbližjo celota položaj, na najbližje celo število. [Študent] Ampak potem je to problem, ker če imate paleto 7 elementov Takrat samodejno posname 3. element iz sredini namesto 4.. Kako ravnati s tem? To je problematično, saj če bi imeli niz 7, da bi izbrali v 3. namesto na 4. mestu. Ali lahko pojasnite, malo več? [Študent] Ker če imate 7 elementov, potem 4. element bi bila sredina, kajne? Ne pozabite, vaš komentar o tem, da nič indeksirane, čeprav. [Študent] Ja, tako na 3. položaju. To bi bila sredina. Ja. Oh, v redu. Vem, kaj misliš. To je čudno, saj navadimo na to celotno idejo kako se znebiti decimalk. To je odlična točka. Končajmo to gor. Mi smo našo izračuna srednjo vrednost. Mi smo testiranje, da vidim, če je naša igla je enaka srednji vrednosti. Mi tiskanje, ki smo ga našli, ampak res, kaj želimo narediti v tem primeru? Mi smo ga našli, zato smo želeli, da naj klicatelj vedel, da smo ga našli. Dobili smo nalogo, ki je logična funkcija tipkal. Pot nas opozori s pojasnilom našega delovanja, da smo pripravljeni za odhod se mi rekel: "Hej, ali je to res." Kako bi to naredil, Kevin? Ti premikajočo glavo. >> [Kevin] Dodajte vrnitev res. [Nate] Točno tako, return true. Zdaj, če to ni enako, kako bi se ozremo na levo polovico? Vse ideje? Stella, vse ideje? Morate določiti nov položaj za konec. Ja. Zato moramo narediti položaj sredini - konec. Čudovito. Moramo določiti nov položaj za konec pogled na levo polovico. To je tisto, kar smo že prej govorili, kjer Držim vrača v ta primer. Sem začel tukaj, in potem sem na koncu vse poti tukaj. Tudi, če iščemo 15, in naša sredina je na 16, in se zavedamo, "Ups, je 16 več. Želimo, da se premaknete na levo polovico. " Mi bi premaknite na konec 15, in delamo, da jih jemljemo 1 iz srednje in nastavitve, ki, kot je naš novi konca. Prav tako, če bomo želeli videti na desni polovici, kako bi to naredili? Imate idejo? [Študent] Vi samo nastavite začeli razpolovišča + 1. [Nate] Čudovito. In zdaj, v primeru, da ne najdemo ničesar, ne da bi dobili poskrbljeno za nas? Daniel, ne dobite, da je poskrbljeno za nas? [Daniel] No [Nate] Če nam bo uspelo skozi celoten niz in ne najdemo ničesar, če bi se ta poskrbljeno, ali pa bi morali poskrbeti za to? [Daniel] pa pogoj. [Nate] Ja, medtem ko je stanje, točno. To bo poskrbel, da bi šel skozi celoten niz, če ne bomo ničesar našli. To pa zanka se bo končala. Nikoli nismo naleteli bo to stanje, in se lahko vrnemo false. Mi lahko pustite tudi to, če sem takole ker če je to res, če izjavo, in bo naša funkcija vrne, in tako bomo na osnovi prekiniti ta funkcija na tej točki Ko se vrnemo, res. Toda kaj se zgodi s to strukturo tukaj? Bo to delovalo v celoti, ali pa je nekaj logično napaka tam? Tukaj je nekaj logično napako tam, s tem, kako se je ustanovljena. Kaj bi lahko bilo? [Študent] Zakaj potrebujemo - in + 1s? To postavlja našo paleto gor, da je naša nova leva polovica in desno polovico. [Študent] Ampak zakaj nisi mogel to storiti brez - 1s in + 1s? [Nate] Lahko bi ga postavi na sredini? Kaj bi lahko bilo problematično glede tega? [Študent] Mislim, da je neučinkovito, ker ste preverjanje vrednosti, ki je že potrjeno. [Nate] Točno tako Sam je popolnoma v redu. Če nastavite konec in začeti enako sredini namesto - 1 + 1 in refleksivno, na neki točki v prihodnosti bomo končali srednjo preverjanje znova. [Študent], sem začel pset, nato pa sem imel nekaj takega kjer sem pozabil + 1, in je obtičala v neskončno zanko. Seveda, ker na neki točki nikoli ne boš, da se začne in konča dejansko prekrivata. Kul. Še ena logična napaka, in to je, da bi to zagotovo if. Zakaj bi to lahko bilo? Razlog za to je, če ni drugega, če-si videl to, Kevin? [Kevin] Ja, ker ste spreminjanje končne točke. [Nate] Točno tako. Mi smo spreminja končno točko, in če je napisal, kot je ta-Bomo lahko presledke med- da bo preveril ta primer. Ta primer, če mu ne uspe, bo preklic, iz funkcije. Nato bo preveril to naslednji primer, in če to uspe, bo nastavitev končne točke, nato pa se bo nadaljevalo in preverite ta primer. Toda na tej točki, ne želimo, da še naprej preverjam. Na srečo nismo ponastaviti srednjo tukaj, in vemo, da v tem primeru ne bo uspelo. Ampak definitivno želim postaviti drugega, če tam čeprav je morda, v tem primeru saj smo ne prilagaja srednjo vrednost, bi to pomembno? Ne, ker so ti primeri so na voljo samo. Še enkrat, moja napaka. Ne, mislim, da potrebujem drugega, če. Lahko, da ga poskusite in ga zaženite in videli, kaj se bo zgodilo. Zgradba, je prišlo do napake. To je verjetno zato, ker sem pustil ti b in e je tukaj. Ali imam vse več tistih, ki na vrhu? To ne izgleda tako. Mi pomanjšati, gradnjo, tam gre, tako da zdaj, če iščemo 15, ja. Naj povečate palca 15, ja. Lahko ga ponovno zaženete. Nalaganje izvorne kode, gradnjo, tek. Mi lahko iščete nekaj kot 13, in ne bomo dobili ničesar tiskanje, tako da to ni ugotovila, da za nas. To je super, ker to ni v našem seznamu. Zdaj smo prepozno. To se dogaja, da se je za ta teden. Hvala za vstop, in se vidimo kasneje. [CS50.TV]