[Powered by Google Translate] [Návod] [Problém Set 3]
[Zamyla Chan] [Harvard University]
[To je CS50.] [CS50.TV]
Dobře, vítejte všichni na Walkthrough 3.
Pset 3 je opravdu legrace jeden.
Je to nový, kdo CS50 tzv. Scramble,
takže pokud jste někdy hráli skrumáž nebo podobný stolní hru vylekat
v podstatě je to hra, kde musíte mřížku dopisů,
a v přiděleném čase budete muset najít co nejvíce
2-dopis nebo delší slova, která existují na palubě,
a tak existují určitá pravidla, jako je můžete používat pouze jedno písmeno
v mřížce, jeden blok v mřížce jednou, a můžete se vrátit zpět k němu.
Můžete vytvářet písmena propojením sousedních písmen,
takže to bude opravdu zábava Pset, tak se pojďme podívat na naši nástrojů.
>> Opět, je spotřebič stále aktualizována, takže se ujistěte,
pokaždé, když vstoupí přístroj doprava otevřete okno terminálu
a na svorkách udělat příkaz sudo yum-y update.
To je důležité také, pokud chcete mít možnost
spustit služební řešení, které jsme rozhodně doporučujeme.
Někdy je to dobré, jakmile skončíte svůj kód
to vyzkoušet proti zaměstnanci řešení, ujistěte se, že vše, co
zadáte do personální řešení, co přijde tam,
totéž, co se stane s vaším kódem.
Dobře, takže se ujistěte, aktualizujte si spotřebič.
Nyní, i, protože jsme řešení s mřížkou v tomto případě
jsme vlastně bude se pustíme do 2-rozměrné pole.
My jsem se zabýval 1-rozměrné pole,
ale nyní budeme rozšiřovat je tak, že mají
více řádků, stejně jako více sloupců.
Pak budeme určitě používat funkce v tomto PSet,
v podstatě volání funkce, odesílání některých parametrů z
a pak se dostat návratovou hodnotu zpět.
A v Scramble jsme vás nežádám, aby skutečně udělat celou věc od začátku,
ale spíše jsme vlastně dává vám něco, co nazývá distribuce kód,
tak kód funkce, které jsme již napsali, že druh stanovuje
kostra PSet stejně jako se provádějí některá z tvrdších věcí
že budete určitě moci přečíst a pochopit
ale nemusí zcela, aby to ještě.
>> Chcete-li rychle předělávka nad 1-rozměrné pole.
Pole jsou datové struktury, které drží více hodnot stejného typu,
a jako připomínka, tato pole jsou nulové indexované,
takže většina z vás pravděpodobně obeznámeni s řadou, jako je tato.
Pokud bychom chtěli int pole s délkou 3,
pak bychom mohli ji inicializovat s int hodnot
a pak hranaté závorky označující délku tom,
a pak bychom přiřadit hodnoty specifických prvků v daném poli.
Zde máme int pole s první index na indexu 0, 2,
index 1 je 4, index 2 je 6.
Řekněme, že jsme chtěli větší pole a držet více hodnot.
Pak bychom mohli mít 2D pole.
Nyní, to je velmi podobná naší 1-rozměrné pole.
Je to 0 indexovány, takže to znamená, že první sloupec
je indexována na 0.
Další je na 1, a pak další je na 2,
a poté podobně máme řádky, a tak vidíte, že když jsme
prohlásit naší nabídku také, stejně jako před-jsme uvedli velikost pole.
Také podobně ukazují velikost, kde první držák
udává, kolik řádků máte, a druhá označuje
kolik sloupců.
>> Dobře, v tomto PSet budete chtít mít možnost
iteraci 2D pole, přístup k každý element
v této 2D pole, takže v podstatě chcete dosáhnout
všechny možné kombinace řádku a sloupce hodnot.
Chceme dosáhnout řádek 0 ve sloupci 1, 2, 3 a.
Chceme dosáhnout řádek 1 ve sloupci 0, 1 a 2.
Musíme mít nějaký struktury, která nám umožní
iteraci přes všechny řádky a všechny kombinace
sloupců v rámci které.
Tady mám 2D int pole.
Má 3 řádky a 3 sloupce,
a tak je rychlý způsob
najít celou 2D pole.
Říkám první řadě bude mít 2, 4, a 6,
druh obdobné jako v předchozím příkladu v tomto snímku.
Pak budu mít 2. řádek je 3, 6, 9,
a pak 3. řádek je 4, 8, 12.
Máme 2D pole,
a víme, že to vypadá takhle.
Máme 2, 4, 6,
3, 6, 9,
4, 8, 12.
Nyní, když přidáme do indexů,
by to bylo řádek 0.
To by bylo řádek 1.
To by bylo řádek 2.
Podobně máme sloupec 0,
sloupec 1 a sloupec 2.
Ano.
[Muž] Které tři jsou sloupce, a který z nich je řádek?
Sloupce jsou tyhle,
takže vaše sloupce jsou tyhle.
To je sloupec 0, a to je ve sloupci 1.
To je sloupec 2.
[Muž] Kolik v prohlášení int ke stolu [3] [3]?
Když jste s prohlášením o 2D pole, pak první číslo v hranatých závorkách
bude, kolik řádků máte,
a pak druhý bude kolik sloupců.
>> Skvělé, tak chceme nějakou strukturu,
nějaký smyčky, co se děje, aby nám všechny možné kombinace.
Řekněme, že jsme se začít tím, v pořádku, přejděte něco v tomto řádku,
řekněme, podívej se na tuto řádku pro tuto chvíli.
Jedná se o řádky zde.
Víme, že náš index řádku bude 0,
ale k této prvku je to na 0. řádku a sloupci 0.,
takže pak bychom přistupovat indexem [0] [0].
Pak je tato jedna, podobně, je stále na prvním řádku,
ale je to na druhém sloupci, takže jsme přístup, že [0] [1].
Pak poslední by [0] [2].
Kdykoliv jsme na konkrétní řádek budeme chtít
iteraci všech možných hodnot sloupců.
Pojďme začít s pro smyčce
že začíná na hodnotě 0, a jde do délky, kolik řádků máme.
To je na kole přes každý řádek.
Pak to, co chceme udělat, je v to, že
když jsme na konkrétní řádek chceme procházet všechny dostupné sloupce,
takže pak budeme mít další smyčku.
Říkejme tomu j.
I, j a k jsou velmi časté řadové proměnné indexování smyčka,
takže můžete použít tyto, pokud se vám líbí.
Také se snaží, aby se zabránilo pak-li se tyto proměnné běžně používané ve smyčkách
snažte se vyhnout jejich použití jako jsou názvy proměnných pro jiné věci ve vašem kódu
jen proto, že je to obyčejná konvence používat i, j, a k. uvnitř smyčky nebo indexy.
Dobře, pak zde máme pro smyčce, která iteruje přes všechny řádky.
Pak pokaždé, když je to na jiném řádku
budeme iteraci všech různých sloupců.
Tímto způsobem můžeme skutečně dostat do všech možných kombinací
z 0, 1 a 2 s 0, 1 a 2.
To smysl?
Tímto způsobem jsme schopni pro přístup přes každou hodnotu.
Nyní, mohli jsme se rozhodli udělat sloupce první i.
Je to opravdu nezáleží na tom, jak dlouho budete iterovat
všechny sloupce a všechny řádky.
>> Teď pojďme něco udělat s těmito hodnotami.
Řekněme, že tisk.
Nyní se pojďme tisknout své celá čísla
a pak se proměnná na tomto místě je-to bude hodnota n tabulka.
Nyní konkrétní index řádku bude i proto, že jsme, že k iteraci našich řadách,
a potom j iterovat prostřednictvím našich sloupcích.
Nyní pojďme udělat 2D.
Teď, když jsme se spustit 2D vypíše všechny hodnoty
v pořadí, v jakém se výše uvedené,
tak vidíte, že to jde přes všechny řádky první,
tak, že je to na řádek 0, a pak se vytiskne všechny hodnoty v této řadě
a pak pokračuje.
To je příklad způsobem, jakým iteraci
a provádět akce na hodnotách v rámci 2D pole.
Skvělé, teď, co uvidíme v distribuční kódu je mnoho funkcí,
a tak některé z těchto funkcí bude boolean funkce
kde oni se vrátí boolean pro vás.
>> Některé z nich jsou celá čísla, například, a tak v podstatě
Přezkum funguje trochu zásadě to funguje tak mají
návratová hodnota, jméno, pomocí kterého můžete použít k volání programu,
a pak může mít libovolný počet parametrů.
V podstatě při volání funkce v rámci další funkce,
v podstatě jako říkáš teď chci, abyste tuto funkci provedete,
musíte projít v určitých hodnotách, takže v tomto případě je naše funkce foo
bude muset vzít 2 celá čísla, a do této funkce pak
bylo by k nim mají přístup, se na ně odkazovat jako x a y.
Podobný příklad je nižší funkce
které jste možná použity ve vašem programu kryptografické,
a tak v podstatě tyto funkce již byly psány pro vás,
ale v závislosti na jejich zpáteční typu můžete použít ve funkcích.
Řekněme, že máte logickou funkci nazvanou foo.
Pak byste mohli použít, protože víte, že to bude představovat boolean.
V podstatě, když říkáte, že se vrátí zpět boolean,
takže můžete léčit, že to bude představovat boolean.
V rámci svého stavu, můžete jednoduše říct
pokud foo, a pak předat ve svých požadovaných parametrů,
5 a 9 například, 2 celá čísla,
pak víte, že se vrátí true nebo false,
a tak pak můžete použít jako svého stavu sám.
Podobně můžete také říci, foo (5, 9) == true
nebo == false, nebo něco takového,
ale, že je o něco zbytečné, protože samotnou funkci
již hodnoty buď true nebo false.
Budeme mít na paměti, když vidíme několik příkladů v distribučním kódu.
>> Dobrá, zpět k Scramble poté, co jsme se 2D pole
a pochopení funkce v rámci našich pásů.
V Scramble podstatě budete mít mřížku dopisů,
a pak budete pomáhat realizovat program
přičemž uživatel může zadat různé dopisy, které vidíte na roštu,
tak to také znamená, že vy jste také bude muset čerpat hrací desku.
Pak bude uživatel zadáním určitá slova,
ale budete muset zjistit,, zda tato slova jsou platné ve slovníku,
nebo B, se, že skutečně existují v desce, lze nalézt v desce.
Pak v distribuční kódu půjdeme přes, že ve druhé.
Uvidíte, co už za vás,
a pak se v daném struktury distribuční kódu přidat funkce.
Existují některé funkce, které jsou ponechány prázdné.
Existují některé funkce, které stačí jen přidat do.
Určitá funkce, které budete pracovat s je remíza,
takže budete muset implementovat funkce Draw,
vlastně čerpání všechna písmena na desce.
Budeš muset implementovat vyhledávací funkci, kdy budete muset zkontrolovat
zda řetězec, že ​​zadává uživatel je platný slovo,
a tak potom, jak jsem se zmínil výše, která zahrnuje ať už je to ve slovníku, nebo ne
stejně jako to, zda je to platné hra tah.
Pak budete provádět skrumáž
kde do hry, pokud je uživatel, například, potíže najít jakékoliv slovo
pak v případě, že psát v "Scramble" do řádku
pak hrací skutečně otáčí o 90 °,
zachování stejných písmen, ale jen otáčením po směru hodinových ručiček 90 °.
A pak konečně budeme zabývat s pouzdrem a citlivosti,
v podstatě, když všechny ze slov ve slovníku součástí distribučního kódu
jsou uloženy jako velká, ale chceme-li umožnit uživateli, například,
když se do směsi v malých a velkých
nebo jen malá písmena a pak, pokud to slovo je platné
pak by měly mít možnost získat body za to stejně.
>> Dobře, tak distribuční kódu, může to být trochu těžké se dostat přes na první pohled.
Možná se vám nebude chtít číst všechno a jen tak rovnou do
psaní programu, ale prosím, přečtěte si to jednou,
číst dvakrát, přečetl třikrát, přečtěte si ji znovu a znovu
tak, že budete mít dobrý pocit, a může cítit opravdu pohodlně
s kódem, i když jste nenapsal tyto funkce sám,
že tak nějak vědí, co dělají, a můžete očekávat
tak, že by mohly interagovat s funkcemi, které vám umožní realizovat.
Bez dalších okolků, pojďme skutečně dostat do tohoto distribučního kódu,
a já ti pomůžu vy v tom nějaký smysl.
Jsem již stáhli distribuční kód.
Můžete to udělat.
Tam je návod na spec, kde budete muset vytvořit svůj vlastní adresář pro PSet 3,
a pak, pokud spustíte příkaz, který je nalezen v spec
pak budete moci stáhnout slova souboru,
který obsahuje v podstatě soubor slovníku, pokud se jen podívat na to rychle.
To v podstatě obsahuje celý seznam slov, která se bude náš slovník.
>> Dobře, pojďme začít nahoře.
Také zde si všimnete, že dobrý styl tohoto distribučního kódu
Je v náš prospěch, protože můžeme vidět komentáře
že vysvětlit, jak je tento kód používán.
Máme to, včetně našich knihoven.
Všimněte si, že tady jsme # include ,
a tak, aby knihovna nám umožňuje sledovat čas, protože
v Scramble budete muset zadat v podstatě v co nejvíce slov, jak je to možné
v daném časovém rámci.
Zde máme několik proměnných.
Doba trvání hry jsme nastavili, že na 30 sekund.
My říkáme, že rozměr mřížky-je to čtverec grid-
bude 4 x 4.
Říkáme, že existují slova, počet slov ve slovníku,
nikde mohou mít pouze maximálně 29 písmen.
Pak tady je soubor s názvem log.
V podstatě budeme se automatizuje některé z výsledků z kódu,
tak zkuste neměnit nic do činění s log, protože budeme zabývat s tím.
Nemusíte se docela pochopit, že přesto,
ale jen se snaží neměnit nic do činění s log.
Povšimněte si, že zde tato proměnná mřížka, která je 2D pole znaků,
Je prohlášen ven z našeho hlavní funkce,
tak to je to, co nazýváme globální proměnná.
Vzhledem k tomu, máme co do činění s hrou tady,
pokud si vzpomínáte celou cestu zpět k poškrábání
když jsme měli něco jako skóre, například,
když jsme se zabývali hrou, která musela být přístupné
Mnoho z různých skriptů, takže podobně, máme tuto proměnnou
které musí být přístupné k mnoha funkcích v našem programu,
takže síť je zde 2-rozměrné pole, které bude ukládat
písmena v Scramble hře.
Později uvidíme, využití později,
ale pak jsme také 2D pole booleans názvem značky,
a tak v podstatě, když jdeme do kontroly, zda je slovo
je platná, nebo ne, co potřebujeme vědět, zda jsme byli navštíveni určitý blok,
navštívil určitou dopis, a tak pak značky v podstatě se bude
obsahují buď true nebo false v daném indexu,
tak to bude, dejte nám vědět, jestli jsme tam byli předtím,
zda jsme navštívili tento dopis během našeho určité kontroly,
a tak značky, jak uvidíte později,
bude v podstatě přesně zrcadlit mřížku.
>> Zde jsme se rozhodli, že bychom chtěli naše vlastní datový typ.
Nebyli jsme spokojeni jen s řetězcem.
Vlastně jsme chtěli něco, co nazývá slovo,
takže máme tento typedef struct sem,
a pak v něm, že má boolean názvem nalezeno,
tak, zda tento výraz bylo nalezeno, nebo ne.
Pak to má řadu znaků,
v podstatě na slovo, že je.
Nyní pak, slovo je skutečný nový datový typ, který jsme udělali,
takže může mít řadu slov, například,
nebo můžeme vytvořit slovo a mít více instancí z nich.
Ale máme pouze jednu slovník, a tak to je důvod, proč máme jen
struct volat slovník jak protichůdný k typedef struct.
Struct má celé číslo s velikostí slovníku
stejně jako pole slov, a znovu,
používáme tento globální proměnné slova, která je definována výše,
být počet slov, která je ve skutečnosti v našem slovníku.
Zde máme celý seznam prototypů, funkčních prototypů,
v podstatě říká, dobře, nyní můžete očekávat, že
všechny tyto funkce později v programu.
Budu mít void funkci nazvanou jasné,
boolean funkce se nazývá procházení, která bere v
řetězec a pak 2 celá čísla, et cetera, takže byste vidět něco podobného.
Také pěkný rys v gedit je, že po boku zde
pokud byste se ujistit, že jste vybrali tuto funkce kartu zde,
Zdrojový kód karta, pak to bude ve skutečnosti ukáže všechny funkce
že máte v programu.
To vám ukáže několik věcí, které můžete použít.
Například, tady to má, že jste definovali nový datový typ nazvaný slovo
a pak některé globální proměnné, které mají.
Ale to funguje karta je velmi užitečná, protože můžete kliknout sem a tam
a skok na určité místo programu.
>> Dobře, jsme na hlavní funkci nyní.
Když uživatel zadá v příkazovém,
v podstatě mohou buď říci. / scramble,
nebo se mohou také vstoupit do řady po tom, aby v podstatě naznačují
které rada chtějí hrát.
Obvykle když zadáte pouze v jednom argument příkazového řádku
pak je to jen tak, aby vám náhodný prkno, ale říkají, pro účely ladění
chcete, aby se ujistil, že jste právě zjistili, zda stejný desku znovu a znovu
pak to, co můžete udělat, je jen říct ./scramble1, například,
a bude vždy vám stejnou desku.
Tady je to zajištění řádného používání,
takže pokud uživatel zadá ve více než 2 argumenty příkazového řádku,
pak to bude instruovat je o tom, jak správně používat program
a potom ukončete.
Zde, pokud argc je 2, to znamená, že v případě, že uživatel zadává číslo
specifického slova, které chtějí použít pak
v podstatě, když program později je náhodný desku
pak jsme v podstatě se dávat to semeno, něco jako nutit ji
použít určitou hodnotu.
Pak jsme tady nahrát naše slova souboru.
V podstatě, pokud nelze otevřít slovník, pokud se něco pokazí,
pak se vrátí 1.
Jsme inicializaci mřížky. My se podíváme do této funkce později.
Nastavili jsme skóre 0.
Počítáme-li hra skončí,
tak to je 30 sekund, jak jsme si stanovili.
Pak tu je opět log soubor, který nemusíte měnit.
>> Zde je maso z programu, kde máme while (true) smyčku,
takže si všimnout, že pokud stačí mít while (true) smyčku sám o sobě
pak to bude jen se udržet na provedení, co je v jeho těle,
ale jak uvidíte později, jsme vlastně mít přestávku
takže jsme vlastně dovolit to-máme nějaký způsob, jak to vlastně vypadla
z funkce a neprovádí navždy.
První, co se stane, je obrazovka smaže
takže můžete nakreslit nové desky, a pak to bude mít funkci s názvem draw.
Opět platí, že to log, takže v podstatě pokaždé, když to jde přes tuto smyčku
to bude hlásit skóre pro vás.
Zkontrolujte, zda hra by měla být konec,
ať už jste mimo čas, nebo ne, a pak oznámí, kolik času ještě zbývá
v případě, že hra je stále ve hře.
Pak tu máme výzvu pro slovo,
a pak máme GetString funkci,
tak, že je místo, kde uživatel skutečně vstupy slovo pro vás.
Pak v podstatě v případě, že jste skutečně zadali slovo, pokud to není null,
pak se program bude zaznamenávat ji.
Pak si chcete zkontrolovat, zda je nutné vyškrábat mřížky,
takže v podstatě když zadáte do příkazového rvačky, Word Scramble,
pak to bude otočí o 90 °.
Pak jinak, pokud to není slovo scramble
pak to, co chcete udělat, je budete chtít podívat na slovo.
(Zde (slovo) je pravda. Půjdeme do této funkce později.
A pak budete chtít podívat se nahoru, takže v podstatě je to na roštu,
a je to ve slovníku?
A pokud je tomu tak, pak to bude zvýšit své skóre podle počtu písmen
že slovo je.
To je náš hlavní funkce tam.
>> Tohle je v podstatě jako únikový kód,
takže nemusíte se bát, že tak moc,
ale v podstatě vždy, když zavoláte jasné, že bude jasné, terminál
a přesunout kurzor zpět a druh mazání bez ohledu na to psal předtím.
Pojďme jít lézt docela ještě ne.
Místo toho budeme posouvat dolů a vidět funkce Draw tady,
která je vaším úkolem TODO.
V podstatě budete muset vytisknout mřížku v jeho současném stavu,
takže jsme se už postarala o skutečně inicializaci mřížky,
a tak si nemusíte dělat starosti, kterou dopisy, aby v mřížce
nebo něco takového, ale v kreslení funkci budete chtít
vytisknout všechno, co je v mřížce.
Pak zde máme logickou funkci nazvanou najít,
které jsme viděli výše v hlavní funkci.
Je-li slovo bylo zjištěno, a byl také podíval do slovníku,
pokud oba ti vrátil to pravda, pak by zvýšení skóre.
Zde je najdete funkce, kde se bere v slova jako řetězec,
a to musí být 2 nebo více znaky,
a pak to, co to dělá, je, že prohledává síť pro dané slovo.
Zde vidíme příklad iterace každý prvek v síti
kde iteraci řádků a pak v rámci této iteraci sloupců.
Zde si na znacky 2D pole, které v podstatě ukládá buď true nebo false
zda jsme byli na tento dopis již.
V podstatě to resetuje všech ochranných známek, protože jsme obchoduje pouze s ochrannými
pokaždé, když jsme kontrolu konkrétní slovo.
Pak sem jednou jsme obnovit všechny značky
skutečně hledá slovo, a tak se podívejte na slovo
to je, kde budeme používat procházení funkcí, takže pojďme zpět k procházení
a podívat se na něj.
Co procházení dělá, je, že má v řetězci tzv. dopisy
stejně jako v podstatě x a y, které je počáteční index
, kde má uživatel řekl slovo.
V podstatě kontroluje, zda x je <0 nebo> rozměr
v podstatě to znamená, že tento index ve skutečnosti neexistuje v naší hry,
tak pak to vrátí false.
Pokud jste již navštívili vybrané písmeno
pak, že se to vrátí false dobře, protože pravidlo v Scramble
je, že když máte
písmeno zde, například,
se můžete připojit dopis tím, že půjdete nahoru nebo diagonální takhle,
takže v podstatě svůj další písmeno mohou být v libovolné z těchto přilehlých bloků,
ale to, co nemůžete udělat, například, je jít k tomuto dopisu
a vrátit se do, takže můžete použít pouze každé písmeno pouze jednou.
Pak to dává smysl, že jsou zde známky, že pokud jsme byli už dřív,
Pokud se stopy je nastavena na hodnotu true, pak to není platné slovo.
>> Pak to, co dělá, je, že kontroluje.
To říká, že jdu zkontrolovat, zda v tomto konkrétním místě
dopis, který chceme je tam.
Pokud tomu tak není, vrátí false.
Vzhledem k tomu, že už četl, že blok, pak to bude nastavit značku
v tomto konkrétním bodě jako pravdivé.
Nyní se kontroluje, že v podstatě, pokud budeme pokračovat
to znamená, že budeme hledat další písmeno
ve slově, že uživatel se snaží předložit.
Zde připomenout zpět s pravidly.
Snažíte se kontrolovat všechny sousední hodnoty,
ty nahoře, dole, vlevo a vpravo, stejně jako úhlopříčky,
a tak podobně, když jsme si mysleli, ze iterace 2D pole
, kde jsme chtěli iteraci všechny možné a zkontrolujte
všechny možné permutace mezi řádků indexů a sloupců indexy
zde chceme zkontrolovat všechny možné kombinace,
, pokud je to na levé straně písmene, přímo nad, nebo na pravé straně.
Zde vidíme, že smyčka kontroluje doleva
když jsem je -1.
Když je to na 0 zkontroluje na stejném sloupci, že dopis je,
a pak v případě i = 1, který je jeho konečná hodnota, pak se kontroluje na pravé straně,
a pak, že to není dost, ne?
Je třeba kontrolovat všechny svislých hodnot,
takže pak zde máme smyčku, která se dostane ověřila, zda to jde pod
na stejné úrovni nebo výše, tak pak kombinace, která
bude přístup každý přilehlý blok na A.
Nicméně, to také zkontroluje blok zde na,
takže pak chceme, aby se ujistil, že nemáme kontrolu, že jeden.
Nyní tedy, aby skutečně zkontrolujte, zda předchozí slova jsou platné, nebo ne
pak chceme udělat stejný postup pro zbytek slova
Blokování ten, který jsme již udělali, tak pak je zde předchůdce funkce.
To volá sama sebe, a dostaneme se do toho trochu později,
ale provádí stejný proces pro všechny následné řetězce.
Mluvili jsme o tom najít funkci.
Chápeme, co to dělá.
Je to v podstatě kontrolu, zda toto slovo, které uživatel dal
skutečně existuje na palubě a zda je to oceňují tah.
Zde máme initialize funkci.
Všimněte si, že je to neplatné, takže to nebude návratu nám nic,
ale je to jen bude dělat něco pro nás.
>> Zde vypnutí Wikipedie je tu frekvenci
pro každé písmeno v abecedě na základě toho, jak často
to je používáno v anglickém jazyce.
Ty vidět, že e je, například, jeden z nejpopulárnějších používaných písmeny.
Chceme naplnit mřížky.
Co tato funkce dělá, je naplnění mřížky s písmeny
druh vzhledem k jejich frekvenci v tomto poli.
Nyní, to je použití tohoto jazyka zde
říká velikost frekvencí,
Je to druh pouze v konkrétním případě.
Můžeme skutečně použít velikost frekvencí, takže když si opravdu chcete
najít délku pole pravděpodobně nebudete používat velikosti
ale spíše jen pomocí pole délky.
Můžete požádat své TFS, s tebou mluvit trochu víc o tom,
ale jen vím, že to syntaxe je zde více o zvláštní případ.
Nyní, pro každý prvek v síti
chceme, aby dopis, a to se bude pseudonáhodné,
tak náhodně, ale ne tak docela.
V podstatě to, co to dělá je, že jsme-li nastavit nový double
s náhodnou hodnotou mezi 0 a 1.
Na základě toho budeme mapovat, že
tak říci, že d je nastavena na 0,6, například.
Pak, pokud d je 60% v roce
pak budeme dívat na všechny ty dopisy a najít
vzhledem k tom, jak často jsou zvyklí
Co je 60% v.
Není to jen 60% z abecedy, ale spíše
zabírá tolik místa, a pak b zabírá tolik,
a pak se e, například, zabere tolik.
Na základě relativních délek nebo frekvencí
z těchto dopisů se budeme mapovat tuto náhodnou hodnotu
mezi 0 a 1 na konkrétním písmenem.
To je to, co tento kód dělá tady,
a pak je tu k je jako posun, kde spolu
v dopise chceme být, a tak se nastavit znak v mřížce
být + k.
>> Všimněte si, že zpět myslet na nenasytní
jsme museli použít kulatý funkci řešit s plovoucí desetinnou čárkou nepřesnosti zde,
tak podobně jsme museli vzít v úvahu, že se někdy
plováky nejsou přesně to, co chceme, aby byly,
tak chceme, aby se úlovek za to.
Pak jdeme do souboru I / O, v podstatě čtení a zápis do souborů,
které se dostanete do vyšší, ale ne tak docela,
takže v podstatě to otevře soubor slovníku, přečte, co je v něm,
a pak nastaví ji do pole.
Všimněte si, že jsme se vydali do struct, že jsme deklarované, slovník struct,
a tak slovník má řadu s názvem slova s ​​ním spojené,
tak co to dělá říká slovník, slova v tomto konkrétním indexu
jsou takové a takové hodnoty.
Pak už jsme skoro hotovi s distribuční kódem.
Konečně máme vyhledávací funkci, kde máte připomínky
poučil vás o tom, co, že kodex by měl dělat.
Vyhledávací bude vyhledat slovo ve slovníku
a tak dlouho, jak to slovo nebylo nalezeno již
pak vlajky to jako záznam, takže uživatel může použít znovu
ale také se vrátí skutečný myšlení zpět na hlavní funkci znovu,
vrátí true, tak říká, že to slovo může být bodován.
>> A pak konečně máte Scramble funkci,
což je další void funkce, protože je to něco
ale nevrací nic, takže to, co scramble funkce bude dělat
je otočte mřížku 90 ° ve směru hodinových ručiček.
Vím, že by mohl být trochu drsný, ale je to důležité udělat.
Sledujte mě děje prostřednictvím distribuční kódu,
ale také, zkuste projít sami.
To, co jsem chtěl udělat, je zmapovat to pochopit
co tento program se všemi těmito funkcemi vlastně dělat?
Pokud bych měl jít přes distribuční kód znovu,
Nyní, že jsem tak trochu smysl pro to, co se děje pak bych řekl,
začneme s naší hlavní funkcí,
a pak jsem si první věc, která to dělá, je to volá zatížení,
takže hlavní vyzývá zatížení, ale zatížení je neplatné funkce,
Tak co mám dělat, což znamená, že je jen uvedení jednu šipku
ukázal načíst, protože hlavní nazývá.
Další věc je inicializovat.
Hlavní volání inicializace,
a pak, pokud se podíváme zpět do našeho hlavního funkce
Myslím, že tento další věc, která to dělá,
tady jsou tuny různých věcí, které hlavní je volání,
ale teď jsem jen se zaměřením na nejvíce ty nejdůležitější
relevantní kódu, takže jsem bez na I nebo podobné věci.
Pak další věc, která to dělá je to vymaže ji,
a pak se čerpat,
a tak vím, že remíza je něco, co budeme dělat.
To je remíza funkce.
Později vidíme, že další je bit-
takže pak máme rvačku.
A pak jsme najít, takže najít je další funkce.
Vidíme, že zde je-pokud si vzpomínáte zpět, že je to booleovská funkce,
takže to vlastně bude něco vracet zpět k nám.
Pak tady jsem naznačují, že by jsme najít,
a pak jsme také vyhledávání.
Ale pak si uvědomit, že je tu i tato Funkce procházení
že se nezdá k byli voláni v main,
tak to znamená, že některé další funkce volá procházení,
a pokud hledáte zpět přes distribuční kódu
vidíte, že zde je ten, který používá procházení,
takže pak najít pak také odkazy na procházet,
což je logická hodnota, která vrací něco,
tak jsem přidat další věc, a pak od procházení je rekurzivní
také tvoří záda na sobě.
>> Pak, pokud vidíte tady jsem nakreslil obrázek o tom, co náš program vypadá,
takže pochopení vztahů mezi určitými funkcemi,
a návrat k tomu také viz usnesení ze hry
a logika, jak se hra programu bude pokračovat.
Četli jsme distribuční kód.
První funkce, které budete chtít realizovat,
nebo jedna z funkcí, které chcete implementovat je remíza,
a tak zde máte skutečně trochu svobody s tím.
Podíváme-li se na zaměstnance na řešení
Jdu otevřít okno terminálu, vlastně,
pset3/scramble.
Scratch, že. Myslím, že je třeba aktualizovat svůj přístroj.
Pokud budete hrát se zaměstnancem řešení Scramble-
pokyny jsou v spec pro že-
pak můžete vidět, jak že jsem vytisknout na hrací desku,
ale v podstatě to, co dělají, je, že dát mezery mezi jednotlivými postavami,
ale máte trochu svobody s tím, takže pokud chcete tisknout linky, například,
mezi nimi pak můžete dělat, že.
Chcete-li si vzpomenu, jak jsme iteraci všechny prvky 2D pole,
a budete chtít vytisknout ty, ujistěte se, že máte smyčku
a mít své tiskové funkce, jako že tisknete ve správném pořadí.
Pokud chcete, aby vaše iterační smyčku, když iteraci nad ním
a použít indexy ujistěte se, že tisknete ve správném pořadí.
>> Jednání s 2D poli zpočátku může být trochu matoucí,
tak tady na tomto snímku jsem udělal tabulku, která vám ukáže,
pro každou daném místě v 2D poli, co indexy jsou,
takže pokud chcete vrátit zpět k tomu pro rychlou kontrolu
nebo s odkazem, nebo něco takového, pak můžete použít tento.
Sloupce jsou v modré, a řádky jsou v červené barvě.
Vyhledávací funkce je dvojí.
Vyhledávací a to booleovská funkce, bude nám
true nebo false, zda uživatel-předložil slovo
může být přijata jako platná hodnota,
a tak slovo v vyškrábat je platný pouze
pokud je to ve slovníku, a pokud je to ve skutečnosti nalézt v desce,
a tak si pamatujte, že vyhledávání, musíte provést toto sami,
takže chcete zkontrolovat obě věci,
zda slovo je vlastně ve slovníku a zda to bylo zjištěno již.
Připomeňme zpět do globální proměnné slovníku,
který je struct že jsme vytvořili, který v podstatě nemá int názvem velikosti
s ní spojené, stejně jako pole slov,
kde slovo je nový typ dat.
Tak pro přístup, například, je velikost slovníku nebo slova pole,
pak to, co můžete udělat, je jen napsat "dictionary.size,"
podobným způsobem, který by jen použít jakoukoli jinou proměnnou.
Takže pokud dictionary.size představuje velikost slovníku,
Podobně, dictionary.words představuje pole.
Takže pokud byste chtěli, aby přístup k určité slovo ve slovníku,
pak budete muset přidat index
protože budete muset říct "dictionary.words na indexu i"
a pak něco na základě které.
Tak s vědomím, že slovník má určitou velikost s ním spojené,
stejně jako pole slov, a zkontrolujte, jestli se něco děje ve slovníku,
pak budete muset interate nad slovníku
zkontrolovat, zda to slovo se nachází.
>> Nyní, pokud si myslíte, že zpět k přednášce, když jsme hovořili o různých způsobech, jak vyhledávat věci,
pak si vzpomeňte, že lineární vyhledávání asi není vždy nejlepší způsob, jak jít.
Ale rozhodně to je jeden způsob, jak něco hledat.
Někdy možná zjistíte, že vám realizovat svůj Najít funkci s
lineární vyhledávání na první a pak si zbytek váš program bude.
A pak o něco později se můžete vrátit zpět a změnit způsob, jakým se prohledávat na slovo.
Takže řeší - v podstatě věděl, že - vědět, jak se přístup k
Slova pole slovníku, který řeší chtějí vidět
zda je toto slovo je ve skutečnosti ve slovníku, nebo ne.
Ale pak musíme také řešit, zda je toto slovo na palubě.
A zda to byl nalezen již.
Takže už máme najít funkci, nezapomeňte.
Ukazuje su, ale to, co je slovo?
To není filosofická otázka, ale spíše, podívejte se na definic typu.
Máme boolean názvem 'nalezeno ", jakož i řada znaků
, který představuje to slovo.
Takže když se vrátíte vyhledávání, budete chtít zkontrolovat, zda to slovo byl nalezen nebo není.
Nyní, protože věděl, že našel boolean - našel je název boolean
, který je spojen s každým slovem - jak pak můžete přistupovat k této proměnné,
vzpomínal na to, jak jsme přístup k proměnné v rámci slovníku?
Tak tady jsme měli slovník, a pak jsme si řekli dot velikost, ne?
Podobně, když mají slovo a, v tomto případě, být opatrní, protože
Slovo je jen jiný typ dat, stejně jako int nebo řetězec.
Takže nemůžete prostě říct "slovo", pokud je to jméno jeho.
Budeš muset mít proměnnou s názvem, a pak až budete mít to,
říci, že se říká foo, například, pak si můžete říct "foo.found,"
a že se vrátí vám booleovskou hodnotu, zda to slovo byl nalezen nebo není.
>> Takže další část PSet je realizovat tahanice,
přičemž pokud uživatel vstupy vyškrábat - a to je již zabýval
zde v distribuční kódu - stačí implementovat
funkce tahanice, která již pokyn otočit desku 90 ° po směru hodinových ručiček.
Jak na spec, pokyny říkají, že Rada se otáčí o 90 ° ve směru hodinových ručiček
tak, aby hodnota v mřížce [0] [0] a pak se přesune do sítě [0] [dimenze -1.]
V tomto případě se pro kódování, naše rozměr je 4, takže 0-0 by pak mapovat 0-3.
Pojďme remíza na to, aby viděli, co by to mohlo vypadat.
Nebudu dělat 4 x 4 mřížky, ale spíše 3 x 3 jeden.
Řekněme, že je to palec 2D pole.
Já jsem prostě jít jen mít - v pořádku.
Takže říci, chceme vyškrábat to, chceme otočit o 90 ° ve směru hodinových ručiček.
Víme, že jako výchozí bod, hodnota na 0-0, což je v tomto případě je číslo 0,
bude mapovat do řádku 0, pak sloupec rozměr -1.
A tak, že v tomto případě, rozměr je 3.
Takže 0 by se stěhoval do řádku 0, sloupec 2.
Takže máme číslo 0 tam.
V podstatě to, co děláme, je bereme to,
fyzicky otočením, takže pak 2 by jít do tohoto rohu,
8 by pak jít na tomto rohu, na 6 na tento jeden.
A pak to ostatní bude vypadat -
Takže to, co síť vypadá, když jste úspěšně míchaná ho.
Když jste se provádí Scramble funkci, co budete chtít dělat
je vidět, dobře, jak mohu nahradit tyto hodnoty?
Je tam nějaký vzor nebo nějaký druh vzorce pro stanovení
kde zejména index jde?
Například, já bych mohl vypadat vidět, že 3-4-5 je zde řada.
Kde jinde nevidím 3-4-5?
No já si ji prohlédnout zde.
Podobně, vidím 6-7-8 jako řádek, ale pak je to vlastně sloupec tady.
To je model, který jsem vidět hned, ale tam jsou asi několik dalších z nich.
Na základě toho, že z nějakého druhu vzoru, nějaké cesty.
Jakmile jste identifikovali jednu, pak budete chtít obnovit hodnoty v mřížce.
Takže mřížka 0-0 stane 6, bude mřížka 0-1 stanou 3.
Ale pamatujte si, že budeš - například, když znovu to hned,
říci, že síť 0-2 stává 0 teď, potom ztratíte to, co 2 tam byl.
Tak vzpomínal, že to nestačí jen přiřadit hned.
Pravděpodobně budete chtít, aby se dočasné kopie něco
než je skutečně dát jej na správném místě.
>> Poslední věc, kterou je implementace případ necitlivosti.
Když se podíváte zpět, podívejte se na místě v spec, kde uživatelské vstupy řetězec.
Pokud si vzpomínáte zpět, vzpomínal na - oh, jsem vymazal mapu.
Pokud si myslíte, že zpět na mapu vašeho programu, je to v rámci hlavní funkce,
tak se podívejte, kde máte co do činění s uživatelsky zadaném řetězci,
a pak v tam, myslím, že z nástrojů, které jste se naučili z vašeho
crypto Pset, Pset 2, a pak přemýšlet o způsobech, které by vás mohly být schopni
umožnit vstup uživatele jako smíšené.
Aby mohli mít kombinaci uppercases a velkých písmen, ale to by mělo být stále v platnosti.
Ve slovníku, vzpomínám, když jsme otevřeli tento soubor, byl každé slovo uložen jako všechna velká.
Ale nechceme, aby měl uživatel na vstupu velkým celou dobu.
Může někdo myslet tak, že bychom mohli být schopni umožnit uživateli,
i když vloženy všechny malá písmena, například? Jo?
[Student] Dalo by se udělat to horní?
Jo, přesně tak. Dalo by se udělat to horní.
Takže byste mohli převést všechny dopisy na velká písmena, a pak
Tímto způsobem můžete zajistit, že bude přesná kopie
z co je ve slovníku, pokud je to ve slovníku.
Great. Máme trochu času vlevo.
>> Takže některé věci, které se mohou vyskytnout v tomto PSet je potřeba znát
jaké jsou vaše proměnné jsou v určitém okamžiku v čase.
Protože v spec máme jasnou funkci, která v podstatě
vymaže, co jste nakreslili na tabuli, vymaže to vše a pak přepíše na vrcholu, že
můžete, zatímco vy píšete svůj PSet, opravdu nechci aby se to stalo.
Vzhledem k tomu, že budete chtít vidět, jo, jednou jsem vstoupit do této tahanice, například,
jednou jsem vstoupit do rvačky, co to dělá a co to bylo předtím, jen pro referenční.
Takže to, co budete chtít udělat, je jít zpátky do své hlavní funkce
a zakomentujte jasné, například.
Takže pak při spuštění programu příště,
váš program nebude jasné, že místo toho, a bude pokračovat v tom, tisk na vrcholu toho.
Existují některé další způsoby, jak ladit také.
Co můžete udělat, je, že můžete zahrnout příkazy tisku f, myslím.
Jedna věc, kterou jsem viděl v psets, že jsem se stupněm bylo, že lidé včetně prohlášení tiskové f
vytisknout proměnných v určitém okamžiku sledovat.
Ale jen se ujistěte, že na konci, poté, co jste dopsal všechny vaše prohlášení tiskové f
pro vás sledovat věci, které jste komentář ven poté,
nebo je odstranit, jakmile jste hotovi.
To je další způsob, jak byste mohli udělat něco, vy jste mohli jen psát v prohlášení tiskové f
někde, že je to důležité a uvidíme, na základě toho, co terminál vytiskne,
co to proměnná je.
>> Dalším způsobem, jak to udělat, že půjdeme do detailů během přednášky,
je GDB, který je ladicí nástroj.
V podstatě, když ho spustíte, bude to jít do svého programu, a můžete jej mít předem
jeden krok v době, namísto vyhodnocování všechno.
Takže pak může zlomit to až do malých krocích, a pak na základě cestě -
a pak po cestě tiskové věci a uvidíme, jaké hodnoty jsou.
A že vám pomůže zjistit, kde chyba v kódu může být.
To, co jsme mohli udělat právě teď rychle napsat funkci a pak
vidět, jak bychom mohli být schopni používat GDB, aby viděli, co se děje.
Takže pojďme se mají int main, a pak to, co máme jako parametry main?
Máme int arg c, a string arg v.
Jdu zachránit to v návodu, jak GDB.z. Dobrá.
Budu mít návratnost 0.
Tak jak o tom pojďme si jen tak jednoduchý pro vedení; pojďme se 12.
Pojďme mít také int s názvem counter, a
můžeme začít že při 0. Dobře.
Takže v každém bodě pro smyčce, řekněme, že chceme zvýšit počítadlo
nebo vynásobte to o co jsem je.
To je docela krátký funkce.
Pojďme udělat GDB. Oh! A pak - zvonění je chytrý.
Říká mi, že jsem neměl obsahovat cs50.h.
Dobrá. Takže teď chceme -
Vlastně, je mi líto kluci. Chystám se přejmenovat soubor jen proto, že je to trochu matoucí.
>> Dobrá. Takže teď to, co chceme udělat, je, chceme začít GDB.
Řekl jsem "GDB ladění," takže v podstatě to bude nastavena zaměřit se na tomto ladění,
ladění souboru.
Jdu dát zarážku.
V podstatě, program bude běžet, dokud nenarazí na určité zarážky.
Jdu říct přestávku na hlavní funkci.
Takže teď budu provozovat ladění, takže uvnitř GDB mohu spustit kód.
Je to běh programu, a to i když hlavní je jednou z prvních věcí, které jsme udělali,
máme také hlavičkové soubory,, tam se věci děje již.
To má zarážku na hlavní.
Řekněme, že "další," takže můžeme pokračovat.
To říká, že "int counter = 0".
Já řeknu "tisk proti."
To je zvláštní. Takže v podstatě očekáváme čítače je 0,
ale GDB je jeden krok zpět, takže kdykoliv se říct dál,
říká int counter = 0. To je další věc, že ​​to bude provádět.
Dále klikněte - můžete říct dál znovu, nebo si můžete jen říct 'n',
a teď, pokud tisknete, počítadlo je 0, jak jsme očekávali.
V podstatě, to vytváří svůj vlastní druh proměnných pro něj, ale bez ohledu na to, že -
Líbí tady, to je to, co proti představuje.
Takže budu klepněte na tlačítko Další, a já chci vědět, co jsem je.
Budete tisknout i, i = 0, jak jsme očekávali.
Další, to znamená, že to bude přes smyčky for znovu,
takže když jsem vytisknout i, například, vidím, že jsme na -, že i je 1 v současné době.
Takže je to tak, že pokud nastavíte zarážku na určité funkce
a pak pokračovat dál další, a pak kontrola, co jsem je,
Máte-li odhadovat, že možná někde něco není děje, jak by měl,
a máte podezření, že je to možná na první indexu nebo k poslednímu indexu, nebo tak něco,
můžete použít GDB, mějte na tisk i, aby bylo možné zkontrolovat, co tyto hodnoty.
Takže, v GDB, protože tisk a další jsou takové běžné argumenty,
běžné příkazy, stejně jako já zkráceno u n,
Také mohu jen říct, s. pult, který je stále 0.
Pak jsem klepněte na tlačítko Další. Chci vytisknout počítadlo znovu.
No, tak to je stále 0.
>> A ty jsi trochu přemýšlel - no, chci rozporu se funkce pro výpočet faktoriálu.
Proč - jen v technikách ladění - proč by to mohlo být?
Proč se čítač není zvýšení jejich hodnoty?
Proč je pobyt v 0?
No, tady mám - zpátky sem Já říkám counter = counter x i.
Takže když jsem se vrátit na začátek mé funkce,
Vidím, že když jsem vytiskl i, i je 0, a to, co je 0 x něco?
To je 0, ne? Takže to je asi důvod, proč counter
se nikdy nebude žádné jiné číslo.
Tak co bych mohl chtít udělat, je jít zpátky do mého fuction,
řekněme, dobře, dobře vlastně chci spustit na 1.
Je to, že bude řešit věci?
Ne tak docela, protože čítač je stále 0 zde.
Tak pojďme nastavit, že k 1.
Chceme obnovit naši ladění nástroje, tak se pojďme přestat.
A pak to, co můžeme udělat, je, že jsme si GDB ladění znovu,
dát přestávku na hlavní, a pak spustit ladění znovu, next, next, next.
Jdeme příští několikrát, a pak budeme tisknout pult, vidět, že -
jsme neměli správně, aby soubor znovu.
I když jsme změnili zdrojový kód, pak jsme vlastně
neaktualizoval náš spustitelný.
Věřím, že můžete udělat - jo.
V GDB sám, můžete skutečně udělat soubor.
Takže nemusíte přestat GDB znovu.
Můžete se vrátit do zdrojového souboru, uložte jej, zpět v GDB, můžete jej znovu.
Great. Tak pojďme běžet ladění.
Chceme začít od začátku, protože máme novou spustitelný.
Můžeme projít několikrát, a pak vytisknout i, tisk čítač pokračovat.
Dobrá. Takže teď je vidět, že proti je skutečně zvyšuje svou hodnotu, jak chceme, aby.
>> To je jen malinké bite-sized příklad toho, jak můžete použít GDB
zadejte kód, tisknout určité hodnoty, klepněte na tlačítko Další pokračovat na další řádek,
a zkrátit ji a vytisknout.
Je zřejmé, že kód v vyškrábat je trochu složitější, než to, ale co se dá dělat
je nastavit zarážku na - můžete nastavit zarážku na seznam vyhledávacích funkcí, něco takového.
Takže vždy, když se dostane do bodu, kdy potřebuje vypadat up,
pak GDB poběží vše až do tohoto bodu, a pak můžete začít s tiskem hodnoty ven.
Stejně jako je značky v tomto bodě falešné, nebo je to pravda?
To je asi něco, co budete chtít použít.
GDB, nemusíte zdůrazňovat příliš mnoho o tom,
protože jsme se jít do větších podrobností v přednášce,
ale jen jsem chtěl, aby jste věděli, jak byste měli být schopni používat
pokud jste Začínáme s PSet a chci pochopit
lepší způsob, než jen uvedení prohlášení tiskové f a odhazování je to vše prostřednictvím vašeho kódu.
S GDB skutečně jej pro Vás natiskneme a být schopen nastavit tyto zarážky
tak, aby váš program může běžet až do určitého bodu
a pak vám umožní opravdu krok do něj a zjistit problém tam.
>> Právo. Takže když se podíváme zpět do tahanice, jsme četli distribuční kód.
Mluvili jsme o způsobu, jak iterovat přes 2D pole, a budete určitě
bude chtít iteraci 2D pole, když přijedete do výkresu herní mřížku.
Mluvili jsme o tom vyhledávací funkci, o tom, jak chceme, aby se ujistil o pár věcí.
Chceme se ujistit, že jsme nebyli na slova před.
Chceme také, aby se ujistil, že je to vlastně ve slovníku.
Pak jsme mluvili o rvačce, o tom, jak chceme otočit desku.
A s vědomím, že budete chtít vytvořit kopii něco
aby bylo možné pohybovat.
Nakonec, jsme hovořili o případu a citlivosti, o tom, jak se chcete ujistit,
že i přes jakákoliv kombinace případě, že uživatelské vstupy,
pokud je to platné slovo ve slovníku,
pak to bude nalézt správné.
Takže všechno dohromady je scramble Pset, a že je průchod 3.
Díky všem za účast, a hodně štěstí s bojem.
CS50.TV