[Powered by Google Translate] [§ 3] [menej komfortné] [Nate Hardison] [Harvard University] [To je CS50.] [CS50.TV] Dobre, poďme začať. Vitajte do týždňa 4 CS50. Ak ste otvoriť webový prehliadač a otvoriť PSet 3, Scramble s CS50, budeme začať chodiť prostredníctvom sekcie otázok tam. Rovnako ako minulý týždeň, budeme pracovať v CS50 Spaces, ak budete tiež vytiahnuť, že sa rovnako, a ak budete pokračovať a navštívte tento odkaz, na ktorý som dostal tu hore. Je čas začať. Máme našu malú hi programu tu. Nič blázon. Jedna z prvých vecí, ktoré chcem urobiť s vami dnes prebrať niekoľko riešení k problému Set 1, takým príkladom riešenia, len tak môžete získať pocit, pre to, čo druhy kódu zamestnancov je písanie, aké študentov kódu ostatných píšu, a máte sa na to pozrieť, pretože viem, že je to divné keď zadáte riešenie problému nastavenie a získať pripomienky na svoje vlastné verziu, ale niekedy je to užitočné vidieť, ako ostatní ľudia robili to, najmä tie, ktoré sú pekne vyzerajúce. Pre najviac sa rozdeliť, bol som naozaj ohromený s riešením, ktoré ste produkoval. Ešte som začal hľadať na zoznam 2s Problem Set, ale v prípade, že ste niečo ako prvý, Znamená to, že nič, ale dobré veci. Ak sa pozriete na mojej verzii, začnime celú cestu dole na revízie 1, a budeme sa rýchlo pozrieť na riešenie Mario. Ak budete ťahať doplnila, tieto programy, ktoré budeme prezentovať sú správne. Nebolo správnosť problémy s týmito problémami, ale skôr, chceme hovoriť trochu o rôznych konštrukčných problémov , Ktoré boli použité tu. Jedna z vecí, ktorá bola zaujímavá o riešení je to, že používa tento nový konštrukt s názvom libra definovať, niekedy tiež označovaná ako hash definovať. Dovoľte mi, aby som sa zamerať na to tu. # Define umožňuje dať mená týchto čísel v programe. V tomto prípade je maximálna výška pyramídy v Mario bol 23 a skôr než dávať 23 v mojom kóde, by sme odkazujú na to, ako pevný kódovanie 23 - Namiesto toho dáva názov MAX_HEIGHT na toto číslo, tak, aby sa tu v mojom do-while môžete vlastne sa odkazovať na MAX_HEIGHT namiesto toho, aby počet 23 palcov [Študent] Aká je výhoda robiť, že? To je veľká otázka. Jedným z nich je čitateľnosť. Výhodou použitia tohto # define je čitateľnosť. Keď čítam tento kód, vidím, čo sa deje. Vidím v tomto stave tu testujeme pre výšku je <0, ktoré sme tiež mohol definované byť minimálna výška alebo min výška. Ďalšou výhodou je to, že som si potom prečítať zvyšok riadku vidieť že sme tiež kontrolu, aby sa ubezpečil, že výška nie je väčšia než výška max, pretože budeme pokračovať, zatiaľ čo výška je väčšia než výška max Ďalšou výhodou je, keď som vzdialite trochu sem- keď som spustiť tento program, a ja ho spustiť, povedzme, s 23 práve teraz, vám vypíše všetky riadky 23 len ako, že. Ale povedať, že som chcel zmeniť výšku max, a teraz chcem obmedziť maximálnu výšku pyramíd byť iba povedať-man, ktorý bol zdesený. # Include , # define MAX_HEIGHT, a povedzme, že sme chceli nastaviť výšku 10. V tomto okamihu, všetko, čo som musel urobiť, bolo zmeniť v tomto jednom mieste. Môžem prekompilovať kód, a teraz, keď sa snažím a zadajte 12, to bude výzva ma znovu. V tomto prípade, sme iba pomocou MAX_HEIGHT raz. Nie je to tak veľký problémov ísť a zmeniť ju v cykle while, ak potrebujete. Ale v programoch, kde ste odkazujúce na rovnakej magické číslo znovu a znovu, to # define mechanizmus je naozaj šikovný pretože stačí zmeniť to raz v hornej časti súboru je zvyčajne kam ste ich uložili, a zmena presakuje cez zvyšok súboru. Ďalšie veci, ktoré som chcel poznamenať, v tejto úlohe, že som si myslel, vyzeral naozaj pekné, jeden bol pomenovanie premenných. Vidíte tu, že máme celočíselné premenné s názvom riadku a tzv výšku. Priestory, krížiky, to pomáha, aby sa kód trochu čitateľnejšie, robí to trochu zrozumiteľnejšie, čo sa vlastne deje. Toto je v kontraste k používaniu, povedzme, náhodná písmená alebo len hatmatilka úplne. Posledná vec, ktorú som si zdôrazniť, je, že v pre slučky, často tieto Iterator premenné, tieto pulty, ktoré používate vo vašej pre slučky, je to štandardné a konvenčné štart je buď i a potom j a potom k a ísť na odtiaľ, ak potrebujete viac premenných, a to je len konvencie. Existuje veľa dohovorov. To závisí na programovacom jazyku, ktorý používate. Ale v C, sme zvyčajne začínajú s i To nedáva zmysel používať, povedzme, alebo b v závislosti na situácii. To je to pre tento jeden. Ak teraz vytiahnuť Revízia 2, uvidíte ďalšie Mario, a toto je podobná tej druhej, ktoré sme práve videli, ale to robí niečo celkom fajn. Ak sa pozrieme v tejto sekcii tu vnútri vnútornej slučky for, že používate nejaký šialený hľadáte syntaxe tu práve v tomto odbore. Toto sa nazýva ternárnu operátor. Ak je else zhustené do jedného riadku. Podmienkou je táto časť v zátvorkách. Je to ako tvrdiť, ak j > Sam. Sam. Rovnako ako Sam povedal, že lineárny procesu hľadania bude naozaj pomalé, a namiesto toho s binárne vyhľadávanie, ako to funguje, je, že zakaždým, keď sme sa prejsť iterácie nášho hľadania algoritmu, budeme rozdeliť zoznam na polovicu, v podstate, do dvoch menších zoznamov. A potom na ďalší iterácii slučky, budeme rozdeľovať znova do iných menších zoznamov. Ako môžete vidieť, problém je čím ďalej menší a menší pretože zachovávame škrty polovicu zoznamu zakaždým. Ako to discard prácu? Rovnako ako pripomienka, čo budeme robiť, keď sme boli počítač a my sme boli, povedzme, vyhľadávame pre číslo 5 v tomto zozname je to, že by sme si vybrať číslo uprostred. V strede tohto zoznamu, pretože tam sú 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 čísel, by sme vybrať číslo buď na 4. mieste alebo na 5. pozícii, a my by sme zavolať, že uprostred nášho zoznamu. Vyberte číslo uprostred. Potom, rovnako ako Sam povedal, budeme testovať, či toto číslo sa rovná na číslo, ktoré chceme získať, alebo si požadované číslo. Ak je to rovnaké, potom sme ho našli. Vyhrali sme. Ak to nie je rovnaké, potom existuje pár prípadov. Tieto dva prípady sú buď číslo musí byť väčší ako počet tých, ktoré sa práve pozeráte, alebo je to menej než. Ak je to väčšia, sme sa presunúť doprava. A ak je to menej, sme sa presunúť doľava. A potom sme celý proces opakovať znovu buď na pravej, alebo na ľavej polovice polovice zoznamu. Prvý problém v dnešnom oddielu je zistiť, ako môžeme skutočne začať vyjadrovať toto v C kód. Máme pseudokódu tu. Čo budeme začať robiť je, že som si vytiahnuť úplne nový priestor, uložiť túto revíziu tak, že máme tieto poznámky na neskôr, budeme mazať, to všetko a potom skopírovať a vložiť z problémového súboru táto informácia do našich priestorov, a dúfajme, že to nepraskne. Perfect. Ak ste všetko robiť, skopírujte a vložte tento kód do nového priestoru, do prázdnu. Poďme skúsiť Daniel. Ak skompilovať a spustiť tento program, to funguje? Nie >> Čo to hovorí? To hovorí, že ovládanie dosiahne konca non-void funkcie. Jo, tak mi dovoľte skúste ju spustiť. Už ste videli toto? Viete, čo to znamená? Dobre, poďme rozobrať to trochu. Je to povedal na file.c na riadku 9, stĺpec 1 máme chybu, rovnako ako ste povedal, a hovorí, že je to vyplývajúce z chyby varovania a spiatočnej typu varovanie. Vyzerá to, že sa niečo deje s návratový typ, ktorý dáva zmysel. Máme non-void funkciu, čo znamená, že máme funkciu že nevracia neplatné. Void funkcia je ten, ktorý vyzerá takto: void foo (), a je to neplatná, pretože návratový typ je void, čo znamená, že ak by sme mali niečo tu ako návrat 1, mali by sme sa chyba kompilátora pre to. Avšak, máme non-void funkcie. Naše non-void funkcia v tomto prípade je naša vyhľadávacie funkcie pretože má návratový typ bool. Keď to hovorí, že kontrolné dosiahne koniec non-void funkcie, je to preto, že hľadanie nemá return. Nie je to vracia nič typu bool. Môžeme opraviť to, a čo vy na to vyhľadávanie by sa mal vrátiť v predvolenom nastavení? Aký by mal byť predvolený návratová hodnota hľadanie? Vzhľadom k tomu, že to, čo môžeme dať na koniec. Charlotte, máš nejaké-? Pravda alebo lož? >> Pravda alebo lož. Ktorý z nich? False. Neviem. False? Poďme to skúsiť. Prečo si to return false? To je skvelé intuíciu. [Charlotte] Neviem. Budeme sa vrátiť false v tomto prípade, pretože to bude náš východiskový ak z nejakého dôvodu je zoznam prázdny, alebo je ihla že sme hľadali neexistuje. Potom na samom konci, keď nemáme vráti true skôr v tejto funkcii, vždy vieme, že táto funkcia bude hovoriť Nie, to nie je v poli. Nie je to v kope sena. Teraz, keď sme sa zostaviť a spustiť to, dovoľte mi, aby som uložiť to tak môžeme vytiahnuť ho hore. Teraz, keď sme sa zostaviť a spustiť náš program, buduje. Dostaneme našu malú riadku. Ak som trafil 4-uh-oh. Nebolo vytlačiť nič. Vyzerá to, že všetko skončilo dobre. Musíme vyplniť tento palcov Hovorili sme o tom algoritmu v pseudokódu trochu skôr. Ukážte, uložte tento, a ja vytiahnuť, že algoritmus opäť prebudí. Ideme toho chlapa. Nie. Tu to je. Ako to urobíme? Čo by byť dobrá stratégia pre rozjazd tento kód? Musíte vybrať číslo uprostred. Ako sme si vybrať číslo uprostred poľa? Nejaké návrhy? [Študent] strlen deleno 2. Strlen deleno 2. To je veľký. Strlen práce s špeciálnymi druhmi polí. Aké druhy polí? String pole, pole znakov. Je to ten istý druh konceptu, ktorý chceme použiť, ale nemôžeme použiť strlen, pretože nemáme pole znakov. Máme rad ints. Ale čo strlen si pre nás? Viete, čo to bude pre nás? [Študent] strlen získa nám dĺžku. Presne tak, to bude nám dĺžku. Strlen dostane dĺžku poľa pre nás. Ako sme sa dostali, že v našom programe binárne vyhľadávanie? Ako by ste si dĺžku poľa? [Študent] strlen? Môžete si dĺžku správne formátovaný poľa reťazca C s strlen. Problém však je, že nemáme pole reťazcov. Ak sa pozrieme späť na tento kód, máme túto integer poľa. Ako môžeme vedieť, ako dlho to je? [Študent] Je tam ekvivalent jeden pre koncový bod, ako je int l alebo tak niečo? Ukazuje sa, že v skutočnosti nie je, a tak v istom zmysle to je jedna z tých vecí, ktoré je len dobré vedieť o C, že neexistuje žiadny spôsob, ako dostať dĺžku poľa ak všetko, čo som vám je pole. Dôvod, prečo to funguje s reťazcami, dôvod strlen práce, Je tomu tak preto, ak reťazec je správny formát, bude mať zvláštne, že \ 0 znak na samom konci. Môžete si tiež predstaviť, ak máte nesprávne formátovaný reťazec a nie je tam žiadny \ 0 znak tam, potom celá vec nefunguje. [Študent] Môžete pridať \ 0? My by v tomto prípade. Mohli by sme pridať nejaký \ 0 alebo nejaký znamenať charakter a potom ju využiť. Ale to nie je úplne to fungovať pretože \ 0 je pre char typu, a tu máme ints. Druhá vec je, ak by sme mali použiť špeciálne hodnotu ako -1 označiť koniec poľa potom by sme mohli po uložení -1 v našich celočíselných polí. Mali by sme byť prilepené. Ukazuje sa, že jediný spôsob, ako sa dostať dĺžku z poľa v C je skutočne pamätať keď ho nastaviť a potom prejsť okolo s poli tak, že kedykoľvek mám funkciu, ktorá to urobí nejakú prácu na pole celých čísel alebo plavákmi alebo štvorhra, alebo to, čo ste, Tiež som dať táto funkcia Array na dĺžku, a to je presne to, čo sme urobili tu v vyhľadávacie funkcie. Keď sa pozriete, čo sme urobili, keď sme sa prejsť v našom poli tu, sme tiež prejsť v dĺžke, veľkosti. Proste sa to stane, že sme nazvali túto premennú tu, tento parameter alebo argument. To sa nazýva funkcia, je zoznam argument alebo parameter zoznam, a títo sú tiež nazývaní argumenty alebo parametre. Ľudia používajú rôzne termíny v rôznych časoch. Niekedy striedať je sám. To len tak sa stane, že táto premenná je tu pomenované podobne k tomu # define tu. Ale nie sú to isté. Kapitalizácia záleží. Ak sa pozriete na to, čo sa tu deje, prehlasujeme naše int pole, ktoré sme len čísla. Dali sme to na našu veľkosť, ktorá zodpovedá nášmu # definovať až na vrchole. Bude to byť 8. A potom, keď sme sa potom zavolať na našu funkciu vyhľadávania dole, sme sa prejsť v počte chceme hľadať, ktoré sme vyzvaní, dostal od užívateľa. Míňame v poli, tento čísla, a potom tiež musíme prejsť vo veľkosti poľa, a potom je hodnota veľkosti 8 je uložená alebo odovzdané k tejto celočíselné premenné nazvanej veľkosti. Máme veľkosť poľa. Teraz, keď sa vrátime k tomu, čo hovorili predtým, Myslím, že Missy vychovaný myšlienku, že to, čo sme potrebovali urobiť, je dostať dĺžku poľa a rozdeliť ju 2, a že nám dá polovicu. Poďme sa pozrieť,. Môžem mať niekto napísať, a uložte ho vo svojom vesmíre? Ako o Leila? Môžem mať píšete to v? Napíšte prvý riadok, kde budete mať dĺžku poľa a získať polovicu a uložiť ho do novej premennej. Dám vám pár sekúnd. Ste pripravení? [Študent nepočuteľný] Iste, mohol som ťa vypočítať stred z Haystack poľa vnútri vyhľadávacie funkcie pomocou dĺžku Haystack poľa, čo je veľkosť variabilný? Nič zložité tu. [Leila] Len veľkosť / 2 a just- A uložiť ho, a stlačte tlačidlo Uložiť tu hore, a my vytiahnite ju. Perfect. Tam ideme. Awesome. Ako je, že sa to zostaviť? [Leila] No, to musí byť vyššia. [Nate] Jo, tak čo budeme robiť? [Leila] Ako int stred, alebo tak niečo. Awesome. Jo, poďme to urobiť, int midpoint = veľkosť. Bude to zostaviť? Poďme zmazať tento komentár a dostať ju z cesty. Čo sa to skompilovať o tom? Nerobíme nič s integer, takže musíme ju vytlačiť, alebo niečo také. Jo, presne tak. Dostaneme nepoužívané premenné. Čo iného sa nebude pracovať o to? Myslím, že si hovoril niečo, Sam. Bodkočiarkou. Jo, som tu chýbajú tie bodkočiarkami. Je to bude konštantná vec v celom priebehu funkčného obdobia. Posledná vec urobím je, že som si dal nejaký biely priestor na oboch stranách tohto operátora tu, pretože to je zvyčajne, ako to robíme podľa nášho štýlu sprievodcu. Máme polovicu nášho poľa. Teraz, keď si spomenieme späť do nášho algoritmu, čo bol druhý krok, ktorý sme museli robiť, keď máme stred? [Študent] Ak to je väčší [nepočuteľné]. Jo, takže musíme urobiť nejaký porovnanie, a to, čo sme porovnaním tu? Hovoril ste, že ak je väčší ako. Čo je v tejto vete na mysli? Počet, že príde, ak je to väčšie ako stredu, potom sa do poľa? Presne, tak číslo, ktoré prichádza, keď sme- Ihla, takže sme v porovnaní s ihlou, a čo sme porovnaním proti ihly? Vzhľadom k tomu, ihla je to, čo sme hľadali. Sme porovnaní sa dostať do stredu. Ale to zmysel skontrolovať, Ak needle = stred? Dáva to zmysel? Má niekto nesúhlasí? Poďme to skúsiť, ak (ihla == stred). [Študent] Páči printf ste ju našli. [Nate] printf ("Našli sme ju \ n!"); Inak-Idem začať robiť niečo iné tu. Chystám sa začať dávať rovnátka okolo if celú dobu len preto, že keď pridáme ďalšie veci, potom nemáme sa kompilátory. Jo, Sam. Máš pravdu. Problém je, že stred predstavuje pozíciu v poli, ale môžete dostať ktorá predstavuje hodnotu v tejto polohe v poli. To je skvelé miesto. Bolo všetci počuli, čo povedal Sam? On hovoril, že stred, ako je predstavuje len miesto v poli, ale nie je to skutočný prvok poľa. Ak si myslíte, že informácie o kóde, ako písomné teraz, Ak sa pozrieme na tomto poli sa sem, ktorý má 8 elementy v tom, čo je hodnota stred bude v tejto funkcii? [Študent] 4. [Nate] 4. Ak sa pozrieme na čísla 4 - a my môžeme len spustiť tento kód a dať trochu smutný tvár v tú pretože sme nenašli to, keď narazíme tento kód ako je teraz, nahrať, stavebniny, dovoľte mi, aby som prejdite nadol, a keď sa pozrieme na čísla 4, sme ho našli, ale my sme nedostali to printf áno. Jedným z dôvodov je to, že sme nemali vrátiť true, ale sme naozaj nájsť číslo 4? A Sam sa hovoriť nie. Čo sme zistili? Sme naozaj našli stred, ktorý, ak sa pozeráme na pole tu dole, to bude prvok na indexe 4, že sa pozeráme na, ktorá je 23. Ako sa vlastne dostať, že prvok v stredu a nie len stred sám? [Študent] Radi by sme zadať char, alebo tak niečo? Čo by to bolo, len zo zvedavosti? Môžete upresniť, trochu viac? Musíte zmeniť pozíciu v počte, takže musíš robiť niektoré pripojenie Myslím, že je to char, ale to nemusí byť. Jo, to je dobrá pripomienka. Robili sme veľa tohto konvertujúceho pozícií do znakov, tieto znaky, v prvých dvoch problémových súborov. Ukazuje sa, že tu je to takmer podobné prístup k Ith znak v reťazci, ak to dáva zmysel. Tu chceme získať prístup k midpoint prvok. Ako to urobíme? Kevin, máte nejaké návrhy, ako by sme mohli urobiť, že? Dalo by sa to kôpka sena, otvorený držiak, stredná, uzavretá držiak. Môžete napísať, že pre nás? Uložte ho tu, a my vytiahnuť, že až. Pozeráme sa na tomto riadku 9, a my sme si uvedomili, že nechceme porovnávať ihlu do stredu, ale namiesto toho, chceme porovnať ihlu k prvku v polohe stredu v našej Haystack poľa. Cool. Tam ideme. Jo, to vyzerá celkom dobre, ak (ihla == Haystack [midpoint]). Našli sme ho. Teraz, keď sme sa spustiť na code-Dáme späť do trochu- zostavuje, beží, a teraz keď sa pozrieme na 4, nenašli sme ho, pretože teraz sme vlastne stále číslo 23. Sme získanie hodnoty 23, a to je to, čo sme v porovnaní s našou ihly. Ale to je dobre. To je krok správnym smerom. To je to, čo sa snažíme robiť. Nesnažíme sa tieto ihlu proti pozícií v poli ale proti skutočných prvkov v poli. Ak sa pozrieme späť hneď na ďalší krok v našom algoritmu, aký je ďalší krok? Leila už spomenul krátko. [Študent] Skontrolujte, či je to väčšie alebo menšie ako a potom sa rozhodnúť, akým spôsobom sa pohybovať. [Nate] Jo, to by tak ako to urobíme? Môžete dať do nejakej-Ja zachrániť túto revíziu, a potom, keď dáte v niektorých liniek, ktoré budú robiť, že. Jo, Charlotte. >> Mám dotaz. Nemal by to byť stred - 1, pretože prvá vec, ktorú je je to 0 indexované, takže keď dáme 4, že to nie je v skutočnosti charakter sme hľadali? Áno, a ďalší problém s tým je- to je skvelý úlovok, pretože to, čo sa chystá skončiť sa deje možná ak budeme ďalej a my už nikdy nastaviť pôvodne? Myslím, že to, čo by sme mohli skončiť robiť sa pokúša získať prístup prvok na 8. pozícii poľa, ktorý je v tomto prípade neexistuje. Budeme chcieť urobiť nejaké účtovníctva za to, že máme nejakú nulovú indexovanie. [Charlotte] Ospravedlňujem sa, myslel som polovicu - 1 v hranatých zátvorkách. Môžeme to urobiť, že. Vrátime sa k tejto otázke v len trochu. Akonáhle začneme sa dostať do skutočnej slučky, to je, keď budeme naozaj vidieť vstupujú do hry. V súčasnej dobe, môžeme to urobiť, ale ty si úplnú pravdu. To nula indexovanie bude mať vplyv, že musíme robiť. Poďme sa pozrieť,. Ako je väčší ako a menšie ako-? [Študent] som si, ako to urobiť väčšie ako a menšie ako druhé. Len som si nebol istý, čo tlačiť, ak zistíte, že je to menej ako Haystack stredu alebo väčšia ako. Tu môžem zachrániť, čo I've- [Nate] Jo, ak si zachrániť to, čo máte, a my vytiahnite ju. Tam ideme. [Študent] A dal som otázniky, čo som nevedel. [Nate] To vyzerá skvele. Tu máme otázniky, pretože stále nevieme čo budeme robiť docela ešte. Čo by sme chceli robiť, pardon, máme nejaké zátvorky všetci funky na nás. Budeme opraviť tieto rovnátka. Tam ideme. A tak to, čo chceme robiť, podľa nášho algoritmu, ak nebudeme nájsť ihlu? Povedzme, že v prípade, že ihla je menšia ako to, čo sme pri pohľade na. Kevin. Len sa pozrieť na ľavej polovici. Dobre, takže budeme dať komentár tu hovorí "pozri sa na ľavej polovici." A v prípade, že ihla je väčšia ako kope sena na stredu, čo chceme robiť? [Študent] Potom sa pozriete na pravej polovici. Pozrite sa na pravej polovici, "pozri sa na pravej polovice." Nie je tak zlý. Dobre, takže v tomto bode, čo hľadáte celkom dobre. Problém s kódom písaným je to, čo? [Študent] Nemáte koncové body pre polovíc. Dobre, nemáme koncové body pre polovíc. Tiež sme sa len ísť cez to raz. Sme ešte len vo chvíli, sa pozrieť na jeden stred. Buď prvok je tam, alebo to nie je. V záujme dokončenia tohto, budeme musieť urobiť nejaké opakovanie. Musíme neustále opakujú, kým nezistíme, že buď element je tam preto, že sme zúžil a nakoniec zistil, že je, alebo je to tam nie je, pretože sme sa pozrel cez všetky veci, v príslušných polovíc pole a zistil, že nič je tam. Kedykoľvek sme dostali toto opakovanie deje, čo budeme používať? [Študent] slučka. Nejaký slučky. Áno. [Študent] Môžeme urobiť do-while, a mať to robiť, a potom pri ihla nie je rovné-nie som istý, kde som išiel s tým. Ale niečo ako to, že tak dlho, ako to robí nie rovnaká hodnota, ktorú užívateľ vstup. Jo, tak sa poďme pozrieť, ako to môže písať sám? Povedal si, že ideme použiť do-while. Kde sa to začalo? [Študent] Hneď po veľkosť / 2. [Nate] Dobre, a čo budeme robiť? Budeme vyplniť chvíľu neskôr. Čo budeme robiť? [Študent] Vari chceme robiť všetky tie veci, ktoré máme v prípade časti? [Nate] Do všetky tie veci, skvelé. Kopírovanie a vkladanie. Oh, človeče. Uvidíme, či to funguje, či to pôjde karta to znova. Krásne. Dobre, a šetríme to tak vy si to. Dobre, a my sa chystáme urobiť to pri- čo bolo, keď podmienka, že si po? [Študent] Kým sa ihla nie je rovné, tak ako výkričník. Ale nie som si istý, čo presne to je ešte. [Nate] Jo, to je jeden spôsob, ako to urobiť. Sam, máte napísať komentár? [Sam] som si spomenul, keď som sa pozrela na videá, Vzal som si screenshot z jedného z-ako keď sme robili pseudokódu pre to, tam bol nejaký vzťah medzi max a min. Myslím, že to bolo niečo ako keď max je stále menej ako min. Mám to. [Sam] Alebo ako keď max nie je menšia ako min alebo niečo také, pretože to by znamenalo, že ste hľadali všetko. Jo, tak čo to znieť ako max a min boli na mysli? [Sam] Hodnoty že-celé čísla, ktoré sa chystáte zmeniť vzhľadom k miestu, kde sme dali polovicu. Presne tak. [Sam] V tomto bode, bude to [nepočuteľné] výpočet max a min. Stred je to max a min nápad. Dáva to zmysel, aby ľudí? Ak by sme mali začať uvažovať o tom, ako budeme robiť túto iterácii, máš úplnú pravdu, že chceme použiť nejaký do-while. Ale myslím, že ak by sme si spomenúť, čo sa deje na mieste tohto poľa a čo sa vlastne deje, ja sa chystám napísať sem- pri prvom opakovaní binárneho vyhľadávania, máme- Budem používať B a E na označenie začiatku. A potom koniec nášho poľa. Vieme, že začiatok je na 4 tamto, a vieme, že koniec je na 108. Povedzme, že hľadáte pre číslo 15. Prvýkrát sme to, ako sme videli skôr, stred je buď bude 16 alebo 23 v závislosti na tom, ako vypočítať veci. Vzhľadom k tomu, rovnomerne rozdeliť v polovici by nám tento priestor medzi 16 a 23, nemôžeme rovnomerne rozdeliť alebo rozdeliť a dostať na pravej stredu. My sa pozrieme na 16. Budeme si uvedomiť, "Hey, 16> 15, ktoré sme hľadali." Potom pohľad na ľavej polovici poľa čo skončíme robí, je odhadzovať celý tento horná časť a povedal: "Dobre, teraz naše koncový bod bude tu." Ďalšie iterácie nášho slučky, sme teraz pozrieme na tomto poli, efektívne, čo ste vylúčili túto časť, pretože teraz ak budeme brať polovicu byť rozdiel medzi začiatkom a koncom, nájdeme naše stred na 8, ktoré potom môžeme otestovať 8 vidieť, kde je vo vzťahu k počtu sme hľadali, 15, zistíme, že 15 je väčšia, takže sa musíme presunúť do pravej časti zoznamu, ktoré poznáme, pretože sme ľudia, a my môžeme vidieť to. Vieme, že pravá časť bude tam, kde sme ho nájsť, ale počítač nevie, že, takže to, čo budeme robiť, je my budeme skutočne sa to ísť hore, a teraz na začiatku a na konci sú rovnaké miesto, takže stred sa stáva iba číslo v zozname v tomto bode, ktorý je o 15, a našli sme ho. Znamená to, že vrhnúť nejaké svetlo na tom, kde to celé max a min zápis sa deje, sledovanie koncových bodov pole, aby sa zistiť ako zúžiť veci dole? Čo by sa stalo, keby to nebolo rovné 15 teraz? Čo keď sme hľadali 15, a namiesto toho, toto číslo bolo tiež 16? Radi by sme povedať: "Ach, to je väčšia. Chceme sa vrátiť doľava. " A my by sme presunúť náš e doprava, na ktorom mieste máme koncový bod, ktorý by bol konfliktný. To by nebolo možné vyhľadať akékoľvek ďalšie prvky pretože teraz máme koncový bod a naše počiatočný bod, naša max a naše min, sú teraz prevrátený. Hľadáme cez celé pole. Nemôžeme nič nájsť. To je bod, v ktorom by sme chceli povedať, "Dobre, budeme zastaviť tento algoritmus. Nenašli sme nič. My vieme, že to tu nie je. " Ako sa to deje? [Študent] Ako presne sa počítač prepne do konca? Ako koniec skončiť pred začiatkom? Koniec skončí pred začiatkom pretože matematiky, že budeme robiť zakaždým, keď sme sa to urobiť. Spôsob, akým sme sa vymeniť, je, keď sa pozriete na prvýkrát sme urobiť swapu kde máme začiatok na 4 a koniec celú cestu dole na 108 a naše stred, povedzme, na 16 - Chystám sa obnoviť túto späť do 15 Ak hľadáme pre 15, vedeli sme, že to, čo sme urobili, keď sme skontrolovali 16 a videl, že to bolo väčšie a chcel odhodiť celú pravú časť zoznamu, sme videli, že to, čo sme chceli urobiť, je presunúť tento e tu. Účinne, dostal e dojatá k jednému pred stredom. Podobne, keď sme robili túto iteráciu algoritmu a stred bol v 8, Zistili sme, že 8 <15, a tak sme chceli presunúť b jedna minulosť stredu. Teraz, na začiatku a na konci sú obaja spoločne v tomto 15. Ak by sme sa deje sa pozrieť na inú hodnotu, nie 15, alebo ak je to 15 miesto toho bol 16, by sme zistili, že e chceme presunúť jeden pred stredom. Teraz e by sa tam hodil menej ako b Prejdime ako sme vlastne skončili kódovanie tohto algoritmu. Vieme, že chceme mať túto midpoint výpočet. Vieme tiež, že chceme sledovať začiatok a koniec poľa z nášho aktuálneho poľa, takže môžeme zistiť kde tento ľavá polovica zoznamu a kde pravá polovica zoznamu je. Robíme, že sa buď začína a končí, alebo môžeme im hovoriť min a max Budem používať začínať a končiť tentoraz. Keď začneme, ak sa pozrieme späť na náš príklad tu dole, náš začiatok bol nastavený na samom začiatku poľa, ako prírodné. Čo index to bolo? Čo by naše začať byť? Daniel. [Daniel] Haystack [0]. [Nate] Jo, takže sme mohli nastaviť rovná kope sena [0]. Problém však je, že tento nám nie pozíciu prvého prvku. To nám dáva index prvého prvku alebo skutočnou hodnotou v tejto prvej pozícii. [Študent] To bude konvertovať na 0,20? [Nate] Čo to bude robiť, je-dobre, nebude to robiť žiadne konverzie. Čo to bude robiť, je to uloží 4 v začatí, a potom to bude veľmi ťažké, aby sa porovnanie proti začatiu pretože begin usporiada hodnotu 4, čo je začiatok nášho poľa, ale chceme sledovať indexy v poli oproti hodnotám. Budeme vlastne používať 0, takhle. Pre ukončenie pole-Charlotte priniesla to až o niečo skôr. To je miesto, kde sa budeme brať do úvahy nulovú indexovanie. Charlotte, čo je koniec poľa? Čo je index na konci? [Charlotte] Veľkosť - 1. Jo, a akú veľkosť by sme mali používať? Mali by sme použiť kapitálu veľkosti alebo malými písmenami veľkosť? Capital veľkosť. V tomto prípade môže byť použitie kapitálové veľkosti. Ak by sme chceli túto funkciu je prenosný a používajte túto funkciu v iných programoch, môžeme skutočne využiť malé písmená veľkosti. Je to taky v pohode. Ale Charlotte je úplne správne, že chceme mať veľkosť - 1. V tomto bode, [Študent] Ako je to, že môžete použiť veľká veľkosť? Ako je možné, že by sme mohli použiť veľká veľkosť? Ukazuje sa, že tieto # definuje sú naozaj, pod kapotou, text ako nájsť a nahradiť, ak to dáva zmysel. Pri kompilácii kódu, predspracovanie fázy prekladača prechádza súboru, a vyzerá to všade možne, že ste napísali kapitálu veľkosti, a nahrádza tento text doslova s ​​8, rovnako ako to. V tomto zmysle je veľmi odlišné od premennej. Neznamená to však trvať nejaké miesto v pamäti. Je to jednoduchý textový nahradiť trik. V tomto prípade, budeme používať veľkosť. Odtiaľ sme chceš robiť nejaké opakovanie, a my sme na správnej ceste s našou do-while. Chceme urobiť niečo, kým podmienka neplatí už, a ako sme videli skôr, videli sme, že táto podmienka bol naozaj, že nechceme koniec byť menšia než začne. To je naše zastavenie stav. Ak k tomu dôjde, chceme zastaviť a vyhlásiť ako, "Hele, my sme nič nenašli." Ak chcete vyjadriť, my chceme použiť nejaký slučky. V tomto prípade, že by bolo do-while, pre slučky, zatiaľ čo slučka? Máme do-while tu. Páči sa vám chalani páči tohto prístupu? Myslíte si, že by sme mali skúsiť iný prístup? Kevin, nejaké myšlienky? Mohli by sme mať while, pretože vieme, že maximálna by boli vyššie ako min na začiatku tak ako tak. Jo, takže to nie je inicializácia, ktorá sa musí stať. Tieto do-while slučky sú skvelé, keď máte inicializovať predtým skúšanie, vzhľadom k tomu, tu vieme, že nebudeme mať reinitializing ako začať a skončiť každé kolo zo slučky. Vieme, že chceme inicializovať, potom navštívte naše podmienky. V tomto prípade, to som vlastne ísť s jednoduchým slučke while. Ukazuje sa, že do-while slučky sú používané docela zriedka. Mnoho miest ani učiť sa while. Sú dobré pre spracovanie vstupov užívateľa, takže sme videli veľa z nich tak ďaleko. Ale normálne a while sú oveľa častejšie. Ukazuje sa, že táto podmienka, ako sú písané nebude naozaj nám veľmi dobre, a prečo je to? Je mi ľúto, ja neviem, ako sa voláš. Som Jerry. >> Ľúto? Je to B-O-R-U-I. Oh, dobre. Nevidím ťa na mojom zozname. Oh, je to preto, že-oh, to dáva zmysel. Máte predstavu o tom, prečo táto while nemusí fungovať, ako bolo zamýšľané, ako je napísané s podmienkou? [Jerry] Myslíš ako chcete všetky tie veci po ňom do-? Jo, takže to je jedna. Mohli by sme dať všetky tieto veci do slučky while, čo je úplne pravdivé. Ďalšia vec, ktorá je trochu problematickejšie, aj keď, je to, že táto podmienka nebude fungovať. [Študent] Musíte odhodiť. Správne, takže táto podmienka nebude nikdy platiť spočiatku ako sme o tom hovorili. Chceme urobiť niečo do konca > Plus začať? [Študent] Na konci. Vzhľadom k tomu, je to len počíta polovica dĺžky. Musíte pridať začať. [Nate] Čo by to spočítať pre nás? Ak budeme uvažovať o konci tejto úplne prvej iterácii slučky, end bude v polohe indexe 7. Začnite v pozícii 0. Pamätajte si, že my hľadáme buď pozícia 3 alebo 4 pozíciu. Ak sa pozrieme na tento matematike, len aby to trochu viac konkrétne, dať nejaká čísla tu, máme 7, 0, tak 7-0, a potom / 2 je 3 v celé číslo, ktoré je. Potom si musíme potom pridať späť naše začať? Nevieme v tomto prípade. Na prvom iterácii, bude to v poriadku, pretože end je 0. Ale ako sme pokrok, robíme naozaj všetko stačí end - začať / 2. Je tu ešte jedna Trik je tu, a to je práve jedna z priorít. [Študent] Potrebujeme zátvorky? [Nate] Presne tak, a to preto, že ak sa nám nepodarí dať tieto zátvorky, potom táto linka bude vykladať miesto ako (koniec) - (začiatok / 2), ktorý sa rozhodne nechceme. Dajte si pozor na tie pravidlá prednosť. [Študent] Prečo nie je koniec + začať? Prečo nie je koniec + začať? [Študent] Prečo je to tak, že? Prečo by to bolo +? Myslím, že máš pravdu. [Študent] Vzhľadom k tomu, že je to priemer? [Nate] End + začatí, máš úplnú pravdu. Wow, som totálne podelal. Máš pravdu. Ak by sme robili mínus, by sme chceli pridať začať znovu prihlásiť V tomto prípade ste veľmi správne, že chceme, aby sa priemer dvoch, tak sme si chceš pridať, ako protichodný k odpočítať je. [Študent] To by tiež fungovať, ak ste koniec - začať / 2 + začať. To by, keby sa do-myslím, že áno. Napríklad, ak sme sa pozerali na začiatok, a my posunul ho sem na 15. Teraz môžete začať na pozíciu 2. Koniec je na pozíciu 7. Ak odpočítame je, dostaneme 5. Rozdeľte že 2, dostaneme 2. A potom pridáme 2 späť, a že nás dostane na 4. pozíciu, ktorá je práve tu, čo je na stred. [Študent] Páči sa musíme postarať o balení? V akom zmysle sa musíme postarať o balení? Ak súčet alebo rozdiel medzi v závislosti na tom, ako to urobiť, je to párne číslo. Potom počítač dostane zmätený, či je to 2,5; sa presuniete vľavo alebo vpravo určiť, ktoré je na stred? Mám to. Ukazuje sa, že s delení, nemáme vôbec dostať tieto plávajúcou desatinnou čiarkou čísla. Nikdy sme sa desatinu. Je to úplne zlikvidovať. Ak máte počítač delenie dvoch int premenné, a jeden je 7, a druhý je 2, nezískate 3,5 ako výsledok. Bude sa 3. Zvyšok budú zahodené, tak je to skutočne zaokrúhlenie nie je bicykel, ale podlaha, ak ste oboznámení s tým v matematike, kde ste úplne zbaviť desatinné, a tak ste v podstate skracovať ju nadol na najbližšiu Vcelku pozície, na najbližšie celé číslo. [Študent] Ale potom je to problematické, pretože ak máte pole 7 prvkov potom to automaticky berie tretí prvok z stredu miesto 4.. Ako sa s tým vysporiadať? Je to problematické, pretože ak sme mali rad 7, to by som vyzdvihnúť 3. miesto 4.. Mohli by ste vysvetliť trochu viac? [Študent] Pretože ak máte 7 prvkov potom 4. prvok by byť stredom, nie? Nezabudnite svoj komentár o tom, že nula indexované, hoci. [Študent] Jo, tak v polohe 3. To by bolo na stred. Jo. Oh, dobre. Chápem, čo máte na mysli. Je to trochu divné, ako sme si zvyknúť na celej tejto predstave ako sa zbaviť desatinných miest. To je skvelé miesto. Poďme dokončiť túto hore. Sme počíta náš stred. Testujeme, či naše ihla rovná strednej hodnote. Sme tlač, že sme ho našli, ale naozaj, čo chceme robiť v tejto situácii? Našli sme to, a tak chceme, aby volajúci, že sme ho našli. Máme funkciu, ktorá je boolean zadaný funkcie. Ako sme signál k volajúcemu našej funkcie, ktoré sme pripravení ísť je povieme, "Hele, to je pravda." Ako by sme to robili, Kevin? Ste kývol hlavou. >> [Kevin] Pridať return true. [Nate] Presne tak, vráti true. Teraz, ak to nie je rovnaké, ako by sa pozrieme na ľavej polovici? Nejaké nápady? Stella, nejaké nápady? Musíte nastaviť novú pozíciu pre koniec. Jo. Takže musíme urobiť pozície stredu - koniec. Great. Musíme nastaviť novú pozíciu na konci pozrieť sa na ľavej polovici. To bolo to, čo sme o tom hovorili pred, kde Stále sa vracia k tomuto príkladu. Mám začať tu, a potom som sa nakoniec všetci cestu cez tú. Opäť platí, že ak sme hľadali 15, a náš stred je 16, a my si uvedomiť, "Oops, 16 je väčší. Chceme presunúť na ľavú polovicu. " Potom by sme presunúť koniec 15, a my, že tým, že jeden od stredu a nastavení, ktoré ako náš nový konci. Podobne, ak sa chcete pozrieť na pravú polovicu, ako by to robili? Máte nejaký nápad? [Študent] Stačí nastaviť začať midpoint + 1. [Nate] Great. A teraz v prípade, že sme nič nenájdeme, to, že sa postaral o pre nás? Daniel, to, že si postarané o nás? [Daniel] č [Nate] Ak by sme robiť to cez celé pole a my nič nenájdeme, kde by to byť postarané, alebo by sme mali postarať sa o to? [Daniel], kým podmienka. [Nate] Jo, a zároveň podmienka, presne. To sa bude starať o prechádza celé pole, ak nenájdeme nič. Tento cyklus while skončí. Nikdy nebudeme sa stretli túto podmienku, a môžeme sa vrátiť false. Môžeme tiež nechať túto možnosť, ak tu takto pretože ak túto možnosť, ak tvrdenie je pravdivé, a naša funkcia vráti, a tak budeme podstate preruší táto funkcia v tomto bode keď sa vrátime true. Ale čo sa stane s touto štruktúrou tu? Bude to fungovať úplne, alebo je tam nejaký logický chyba tam? Tam je nejaký logický chyba tam, s tým, ako to nastaviť. Čo by mohlo byť? [Študent] Prečo potrebujete - a + 1s? , Ktorá stanovuje našu ponuku tak, aby boli naše nová ľavá polovica a pravá polovica. [Študent] Ale prečo by nemohla to urobiť bez toho, aby - 1s a + 1s? [Nate] Dalo by sa nastaviť rovná stredu? Čo by mohlo byť problematické, že? [Študent] Myslím, že je to neefektívne, pretože máte kontrolu hodnotu, ktorá je už skontrolovať. [Nate] Presne tak, Sam je úplne pravdu. Ak sa nastaviť koniec a začne sa rovná stredu miesto - 1 a + 1 zamyslene, v určitom okamihu v budúcnosti budeme nakoniec kontrolu stred znova. [Študent] Začal som PSet, a potom som mal niečo také kde som zabudol + 1, a to uviazol v nekonečnej slučke. Jasne, pretože v určitom okamihu budete nikdy dostať začať a skončiť skutočne prekrývajú. Cool. Je tu ešte jedna logická chyba, a to je, že by to malo byť určite else if. Prečo by to mohlo byť? Dôvodom je, pokiaľ to nie je inak, ak-si videl, Kevin? [Kevin] Jo, pretože meníte koncový bod. [Nate] Presne tak. Meníme koncový bod, a ak je to napísané takto-Dáme aby medzery medzi- bude kontrolovať tento prípad. Tento prípad, ak sa podarí, zmizne, z funkcie. Potom to bude kontrolovať túto ďalší prípad, a ak je to podarí, upraví na koncový bod, a potom to bude pokračovať a zistiť tento prípad. Ale v tomto bode, nechceme, aby aj naďalej kontrolu. Našťastie, sme sa obnoviť polovicu tu, a vieme, že tento prípad nebude úspešná. Ale my určite chceme dať else, ak tam aj napriek tomu, že by mohol v tomto prípade pretože nie sme nastavenie stredového bodu, by to robiť rozdiel? Nie, pretože tieto prípady sú exkluzívne. Opäť, môj zlý. Nechceme, myslím, je potrebné túto else if. Môžeme to skúsiť a spustiť ho a uvidíte, čo sa stane. Budova, došlo k chybe. Je to pravdepodobne preto, že som opustil to b je a ŽP tu. Mám viac tých, ktorí sa na vrchole? To nevyzerá to. My oddialiť, vybudovať, tam to ide, takže teraz, keď hľadáme 15, Áno. Dovoľte mi, aby som Zoom 15, áno. Môžeme spustiť znova. Nahranie zdrojový kód, stavebné, beh. Môžeme hľadať niečo ako 13, a nemáme dostať niečo vytlačiť, tak to nie je zistenie, že pre nás. To je skvelé, pretože to nie je v našom zozname. Sme teraz oneskorene. To bude mať to pre tento týždeň. Vďaka za vstup, a uvidíme sa neskôr. [CS50.TV]