DOUG LLOYD: Dobře. Takže teď pojďme vypořádávat s opravdu velké téma, funkce. Dosud se v průběhu, všechny programy, které jsme byli psaní byly psané uvnitř hlavní. Jsou to docela jednoduché programy. Nemusíte mít všechny tyto větve a všechno děje. Můžeme jen vejde všechno uvnitř hlavní, a to nedostane hrozně ohromující. Ale jak se kurz pokračuje a jak se vám začne rozvíjet programy nezávisle na sobě, oni jsou pravděpodobně bude začít se dostat mnohem více, než 10 nebo 15 řádků. Ty by mohly získat stovky nebo tisíce nebo desítky tisíc řádků kódu. A je to opravdu není ta šílená myšlenka. Jako takový, je to asi není dobrý nápad aby vše vnitřek main. To může být trochu obtížné najít to, co hledáte, pokud to uděláte. Naštěstí, i když C, a do značné míry každý druhý programovací jazyk, který by mohlo fungovat s, umožňuje abychom se psát funkce. A já jsem prostě jít se rychle stranou zde se zmínit, že funkce je Jednou z oblastí informatiky. A uvidíte mnoho více z nich v různé body po celou dobu kurzu a pokud budete pokračovat dál. Tam, kde je hodně synonyma pro stejné slovo. Takže říkáme funkce. Ale můžete slyšet i jejich označovány jako postupy, nebo postupy, zejména, pokud jste někdy neučinily žádné objektově orientované programování before-- a nebojte se Máte-li ne, není velké deal-- ale v audit orientované jazyky jsou často volal metody. Někdy se jim říká podprogramy. Ale oni opravdu všichni se odkazují na stejnou základní myšlence. Pojďme se podívat, co to je nápad. Co je to funkce? No funkce je opravdu nic víc, než černé skříňky. Černá skříňka, která má sadu nula nebo více vstupy a jeden výstup. Tak například tento by mohla být funkcí. Jedná se o funkci s názvem FUNC. A to trvá tři vstupy a, b, c. A v té černé skříňky, my nevím přesně, co to dělá, ale zpracovává vstupy nějakým způsobem, a pak se dává jeden výstup, v tomto případě z. Nyní, aby se to trochu méně abstraktní, my Dalo by se říci, že bychom mají funkci nazvanou Dodávám, že trvá tři vstupy A, B, a c a zpracuje výstup v nějakým způsobem uvnitř černé skříňky do vyrábět jeden výstup. Takže v tomto případě, je-li přidá se 3, 6 a 7. Někde uvnitř přidat funkce, by jsme očekávat, že budou sečteny produkovat výstup, který je 3 plus 6 plus 7 nebo 16. Stejně tak, budete mít funkci nazvanou mult, že vezme dva vstupy, A a B, zpracovává je nějakým způsobem takovém že výstup funkce je produkt dvou vstupů. Tyto dva vstupy násobí. 4 a 5 byly přeneseny do mult, se něco stane, výstup očekáváme je 20. Proč říkáme, že černá skříňka? No, pokud nejsme napsal svého funkce sami, což jsme udělali docela dost tak daleko cs50. Viděli jsme tiskovou f, například, které je funkce, která jsme nepsal sami, ale my používat po celou dobu. Pokud nejsme psát funkce sami, nemáme opravdu potřeba vědět, jak je to skutečně realizován pod kapotou. Tak například černá skříňka I Jen vám ukázal pro násobení, mult a, b mohou být defined-- a to je jen některé pseudocode-- může být definována jako výstup A krát b. To smysl, že jo. Máme-li funkci nazvanou mult, že vezme dva vstupy. Očekávali bychom, že výstup by být dva vstupy násobí, časů b. Ale může být také mult implementován jako je tento, máme proti proměnnou pozor uvnitř mult 0. A pak jsme tento proces opakovat b časy přidat do pultu. Například, pokud budeme násobit 3a 5b, mohli bychom říci nastavit počítadlo na 0, opakujte pětkrát, přidejte 3 do pultu. Takže začneme na 0 a pak děláme tento pětkrát 3, 6, 9, 12, 15. Je to stejný výsledek. My ještě dostat 3 krát 5 jen implementace je jiný. To je to, co máme na mysli když říkáme černé krabici. To jen znamená, že nemáme opravdu péče jak je implementováno pod kapotou tak dlouho, dokud je výstupní, je to, co očekáváme. Ve skutečnosti, že je součástí smlouvy použití funkcí, zejména funkce, které jiní píší. Chování je vždycky pro něž jsou typické, nepředvídatelný založené na název funkce. A to je důvod, proč je to opravdu důležité, když píšete funkcí nebo když jiní lidé napsat funkce, které můžete použít, že tyto funkce mají jasné, poměrně zjevné jména, a jsou dobře zdokumentovány. Což je jistě případ pro funkci tisku, jako je f. Tak proč používat funkce? No, jak jsem řekl dříve, pokud budeme psát všechny naše kódu uvnitř hlavních věcí, může dostat opravdu těžkopádné a opravdu složité. Funkce nám umožňují schopnost zorganizovat věci a rozbít velmi komplikovaný problém do mnohem více zvládnutelné sub náhradní díly. Funkce nám také umožňují zjednodušit proces kódování. Je to mnohem snazší ladění 10 Řádek Funkce versus 100 řádek Funkce nebo funkci 1000 online. Pokud máme jen ladit malé kousky najednou, nebo napsat malé kousky v té době, to dělá, že zkušenosti s programováním mnohem lépe. Věř mi, že jeden. A konečně, pokud budeme psát funkce jsme lze znovu použít tyto jednotlivé díly. Funkce mohou být recyklovány. Mohou být použity v jeden program nebo jiný. Už jste napsal Funkce, vše, co musíte udělat, je říci, že program, kde najít tuto funkci. Byli jsme recyklace a využívání tisknout f více než 40 let. Ale to byl jen napsán jednou. Docela užitečné, vpravo. Dobře. Takže funkce jsou skvělé. Víme, že. Nyní začněme ně psát. Pojďme začít se je do našich programů. Aby k tomu, že první věc, kterou děláme, je deklarovat funkce. Když deklarujete funkci co jste v podstatě děláte říká kompilátoru, hej, jen abyste věděli, Budu psát funkce později a tady je to, co to bude vypadat. Důvodem pro to je, protože kompilátory může pokud dělat nějaké divné věci oni vidí sadu symbolů že nejste obeznámeni s. Takže jsme prostě dát compiler heads up, jsem vytvořit funkci a bude to, jak to udělat. Funkční prohlášení obecně pokud jste organizování kódu způsobem, že ostatní budou moci porozumět a využít, obecně chcete dát všechny vaše deklarace funkce na samém vrcholu vašeho kódu, vpravo předtím, než začnete psát hlavní i. A pohodlně, je tu velmi standardní formulář že každá funkce prohlášení následuje. Všichni skoro vypadat takto. K dispozici jsou tři části do funkce prohlášení, návratový typ, název, a argument, seznam. Nyní je návratový typ je, jaký druh variabilní funkce bude výstup. Tak například, když si myslíme, že dozadu Před minutu násobící dva Čísla funkce, co očekáváme, pokud vynásobíme celé číslo od integer bude výstup Pravděpodobně celé číslo, ne. Násobí dvě celá čísla dohromady, dostanete číslo. Takže návratový typ, který funkce by bylo int. Jméno je to, co chcete, zavoláte funkci. To je pravděpodobně nejméně důležité Součástí deklarace funkce, z hlediska funkčnosti. Ale ve skutečnosti je pravděpodobně jedním z nejdůležitějších částí prohlášení funkce, pokud jde vědět, co vlastně funkce dělá. Pokud název vaší funkce f nebo g nebo h nebo tajemství nebo něco takového, jste pravděpodobně dostanou trochu zakopl nahoru snaží vzpomenout, co ty funkce dělat. Takže je důležité, aby vaše smysluplné názvy funkcí je. Konečně, seznam argumentů čárka oddělený seznam ze všech vstupů do vaší funkce, z nichž každý má typ a jméno. Takže nejen že máte specifikovat, jaký typ proměnné bude funkce výstup, Chcete také zadat jaký typ a typy proměnných funkce bude přijímat jako vstupy. Takže pojďme udělat příklad zde. Pojďme stačí se podívat na konkrétnější jeden. Tak tady je příklad funkce prohlášení o funkci, která Dodávám dvě celá čísla dohromady. Součet dvou celých čísel se chystá být celé, stejně, jak jsme právě projednat. A tak návratový typ, tady v zelené, by int. To nám, že přidání dvou celých čísel jen řekne bude, na konci dne, výstup, nebo vyplivnout zpět k nám, celé číslo. Vzhledem k tomu, co tato funkce dělá my chtějí dát mu smysluplný název. Přidejte dvě celých čísel se zdá je to vhodné, vzhledem k vezmeme dvě celá čísla jako vstupy a doufejme, že je součtem. To by mohlo být trochu těžkopádný jméno a upřímně řečeno, tato funkce pravděpodobně není nutná protože máme přidání operátor, pokud si vzpomínáte z našeho diskuse operátorů, dříve. Ale řekněme, že k zájmu Argument, že tato funkce je užitečná a tak budeme říkat to přidat dvě celých čísel. A konečně, tato funkce trvá dva vstupy. Z nichž každý je celé číslo. Takže máme tento čárka oddělený seznam vstupů. Teď jsme se obecně chceme pojmenovat každého z nich tak, aby mohly být používány v rámci funkce. Jména nejsou strašně důležité. V tomto případě jsme se nemusí nutně mají nějaký smysl s nimi spojené. Takže můžeme jen zavolat jim a a b. To je naprosto v pořádku. Pokud však zjistíte, ocitnete v situaci, kde názvy proměnných ve skutečnosti může být důležité, možná budete chtít volat něco jiného než a a b dát jim něco víc symbolicky smysl. Ale v tomto případě, my opravdu vědět něco jiného o funkci. Chceme jen přidat dvě celá čísla. Tak prostě budeme nazývat ti, celá čísla a a b. To je jeden příklad. Proč si vzít druhou přemýšlet o tomhle, jak byste napsat funkci prohlášení o funkci, která násobí dvěma plovoucí desetinnou čárkou? Vzpomínáte si, co je to číslo s plovoucí čárkou je? Jaká by tato funkce Prohlášení vypadat? Vlastně jsem Doporučuji vám video pozastavit tady a vzít kolik času budete potřebovat. Přemýšlejte o tom, co to deklarace funkce by byla? Co by návratový typ být? Co by smysluplné jméno být? Co by vstupy být? Tak proč si pozastavit video zde a psát-up deklaraci funkce pro funkci, která by se násobí dvě plovoucí čárkou čísla dohromady. Doufejme, že jste pozastavili video. Takže pojďme se podívat na příklad z jednoho z možných prohlášení. Float MULT dva reals float x, float y. Produkt z dvou plovoucí desetinnou čárkou, které jsou připomenout, jak jsme se představují reálná čísla nebo čísla s desetinnými hodnotami v C, bude plovoucí číslo bodu. Když násobit desetinná desetinnou, budete pravděpodobně získat desetinné místo. Chcete-li dát mu příslušný název. Vynásobte dvě reálů zdá být v pořádku. Ale vy jste opravdu mohl nazvat MULT dva plováky, nebo plováky MULT. Něco takového, tak dlouho, jak to dal nějaký skutečný význam na to, co tato černá skříňka se chystá udělat. A opět, v tomto případě, my ne Zdá se, že jakýkoliv význam připojen se jmény Proměnné jsme předáním, a tak jsme jen zavolat jim x a y. Nyní, když jim říkáte něco jinak, to je naprosto v pořádku. Ve skutečnosti, pokud jste toto prohlášení místo pomocí čtyřhře místo plováků, pokud si vzpomínáte že se zdvojnásobí být jiný způsob, jak přesněji specifikovat reálná čísla nebo s plovoucí desetinnou čárkou proměnných. To je naprosto v pohodě taky. Buď jeden z nich by bylo v pořádku. Ve skutečnosti existuje několik různých kombinací způsobů, jak deklarovat tuto funkci. Ale to jsou dvě docela dobří. Jsme vyhlásil funkci, to je skvělé. Řekli jsme si, co to kompilátor je to, co budeme dělat. Nyní pojďme vlastně psát tuto funkci. Pojďme dát definici, tak, že uvnitř černé skříňky předvídatelné chování se děje. Ve skutečnosti jsme se množí dvou skutečných čísla dohromady, nebo přidávání čísel dohromady, nebo dělat, co to je že jsme se zeptali naši funkci dělat. Takže ve skutečnosti, pojďme se pokusit definovat násobit dvě reálů, které jsme právě mluvil asi před druhým. Nyní začátek definice funkce Vypadá téměř přesně stejné jako deklaraci funkce. Mám oba tady. Na vrcholu je deklarace funkce, typ, název, oddělené čárkami argumentace seznam, středník. Středník naznačuje, že že je deklarace funkce. Začátek funkce Definice vypadá téměř přesně stejný, typ, název, oddělené čárkami seznam argumentů, ne středník, Otevřete složená závorka. Otevřená složená závorka, stejně jako jsme dělali s hlavní, Znamená to, že jsme nyní začínají definovat co se děje uvnitř černé skříňky, které jsme se rozhodli zavolat Vícenásobek dvě reálů. Zde je jeden způsob, jak k jeho provedení. Dalo by se říci, bychom mohli vyhlásit nový proměnná typu float s názvem výrobku a přiřaďte této proměnné na hodnotu x krát y. A pak se vrátit výrobek. Co to znamená návrat sem. No návrat je způsob, jsme ukazují, že to, jak jsme absolvování výstup vycouvat. Takže něco vracet, je stejná jako, to je výstup černé skříňky. Tak to je, jak to udělat. Tady je další způsob, jak k jeho provedení. Mohli bychom se vrátit x-krát y. x je float. y je plovák. Takže x krát y je také float. Nemáme ani potřeba vytvořte další proměnnou. Takže to je jiný způsob, jak implementovat přesně stejnou černou skříňku. Nyní se na chvíli, video pozastavit znovu, a pokusit se definovat přidat dvě celých čísel, což je další funkce, které jsme mluvil o před chvílí. Znovu tady, já jsem dal funkci prohlášení, a tak středník, a otevřený složená závorka a uzavřenou vlnité výztuha k označení, kde budeme vyplnit v obsahu přidat dvě celých čísel, tak, že definujeme konkrétní Chování uvnitř černé skříňky. Takže video pozastavit. A vzít tolik času, jak budete muset vyzkoušet a definovat implementace přidání dvou celých čísel, jako je že pokud je funkce, jako výstup, hodnotu, to dělá, ve skutečnosti, návrat součet dvou vstupů. Tak jako v předchozím příkladu, existuje několik různých způsobů, že byste mohli realizovat přidat dvě celých čísel. Tady je jeden. Tady v oranžové barvě jsem prostě musel nějaký comments-- Právě jsem přidal některé Komentáře k označení co se děje na každém řádku kódu. Tak jsem deklarovat proměnnou volal součet typu int. Říkám částka rovná A PLUS b. To je místo, kde jsme skutečně dělá práce přidávání A a B společně. A já jsem se vrátit částku. A to dává smysl, protože součet je proměnná typu int. A co je typ dat, které toto Funkce mi říká, že to bude na výstup? Int. Takže jsem se vrátí částku, která je celé číslo variabilní. A v tom je smysl vzhledem k tomu, co jsme deklarovat a naše funkce dělat. Nyní můžete také definovat funkce tímto způsobem, int částka se rovná plus B- přeskočení, že První step-- a pak se vrátit součet. Nyní můžete mít také implementován to takhle, což jsem velmi nedoporučuji. To je špatné pro jeden styl věc a opravdu špatné konstrukci, ale to dělá, ve skutečnosti práce. Pokud budete mít tento kód, který je int přidat špatné zmije bodů C, a používat ji. Je to vlastně dělá přidat dvě celá čísla dohromady. Je to velmi špatná implementace této konkrétní chování. Ale to funguje. Je tu jen pro ilustraci bod, že my opravdu jedno, co se děje uvnitř černá skříňka, jak dlouho jak to má výstup, který jsme očekávali. To je špatně navržen černá skříňka. Ale na konci dne, to dělá ještě výstup součet plus b. Dobře. Takže jsme prohlášen funkce. A my jsme definované funkce. Tak to je opravdu dobrý. Nyní pojďme začít používat funkce že jsme prohlásil, a my jsme definována. Chcete-li volat function-- je to vlastně hezká easy-- vše, co potřebujete udělat, je předat ji vhodné argumenty, Argumenty typu dat že očekává, a pak přiřadit návrat Hodnota této funkce a tohle-- výmluva me-- přiřazení návratové hodnoty této funkce na něco správného typu. Takže pojďme se podívat na V praxi je v souboru volal zmije 1 bod c, který Mám v cs50 IDE. Takže tady je zmije 1 bod c. Na začátku vidíte, mám My patří, libra patří, Standardní IO, a cs50 tečka h. A pak mám funkci prohlášení. To je místo, kde jsem si říká kompilátoru Jsem bude zapsáním Funkce tzv přidat dvě celých čísel. Bude to výstup an integer proměnná typu. To je to, co tato část je právě zde. A pak mám dva vstupy na to a b, z nichž každý je celé číslo. Uvnitř hlavní, žádám uživatele o vstup tím, že říká, dej mi celé číslo. A oni jsou vyzváni zapomenout int, což je funkce, která je obsažen v knihovně cs50. A to je uložena v x, celé číslo variabilní. Pak jsme přiměli je na další číslo. Dostaneme další číslo a obchod, který v r. A pak, zde na lince 28, je kde jsme, aby naše volání funkce. Říkáme, int Z rovná přidejte 2 celých čísel x čárka y. Vidíte, proč to má smysl? x je celé číslo typ proměnné a y je celé číslo typ variabilní. Tak to je dobře. To smysl s tím, co naše funkce Prohlášení na řádku 17 vypadá. Čárka seznam oddělený vstup očekává, že dvě celá čísla, a a b. V takovém případě můžeme zavolat je, co chceme. Je to prostě očekává dvě celá čísla. A x je celé číslo a y je celé číslo. To funguje. A my víme, že funkce se děje na výstup an celá čísla i. A tak jsme se ukládání Výstup z funkce, přidat dva celých čísel, v typu integer proměnná, kterou voláte z. A pak můžeme říci, součet procent i a procento i je i procento. x, y a z, resp vyplnění těch procentech i je. Jaká je definice přidat dvě ints vypadat? Je to docela jednoduché. Je to jeden z těch jsme právě viděli před druhým, int částka rovná a b vratnou částku. To funguje? Pojďme uložit soubor. A pak tady na mém terminálu Budu dělat výbavu 1, a vymažu obrazovku. Chystám se přiblížit, protože vím, je to trochu obtížné vidět. Tak jsme se sestavit tento program jako zmije 1. Takže můžeme udělat tečku lomítko zmije 1. Dej mi celé číslo, 10. Dej mi ještě číslo, 20. Součet 10 a 20 je 30. Tak jsme udělali funkce úspěšné volání. Můžete spustit funkci znovu, negativní 10, 17 součet záporné 10 a 17, je 7. Tato funkce pracuje. To má chování že očekáváme, že ji. A tak jsme udělali úspěšný funkce, definice, prohlášení, a funkce úspěšný volání. Pár různé Body o funkcích Než jsme došli k závěru této části. Připomeňme z našeho diskuse o datových typů, již dříve, že funkce někdy může trvat žádné vstupy. Pokud tomu tak je, jsme se deklarovat funkce jak mít seznam void argument. Vzpomínáš si, co se Nejběžnější funkce jsme tak daleko, že se viděli seznam void argument? To je hlavní. Připomeňme také, že funkci někdy nejsou ve skutečnosti mají výstup. V tomto případě, my deklarovat funkce jak mít návratový typ void. Pojďme uzavřít tuto část by řešení problému praxe. Tak tady je ten problém stanoveno. Chci, abyste napsat funkci volal platný trojúhelník. Co tato funkce by měla učinit je mít tři reálná čísla které představují délky tří strany trojúhelníku jako jeho parametry, nebo její argumenty, nebo jeho inputs-- další sadu synonym které se mohou vyskytnout. Tato funkce by měla buď výstup true nebo false v závislosti na tom, zda tyto tři délky jsou schopni dělat trojúhelník. Vzpomínáte si na datový typ, který jsme se používá k označení pravdivé nebo nepravdivé? Nyní, jak se vám realizovat to? Dobře vědí, že jsou pár pravidel týkajících se trojúhelníky že jsou skutečně užitečné vědět. Trojúhelník může mít pouze stranách s pozitivní délky. To dává smysl. Jste pravděpodobně říkal, duh. Další věc, kterou si uvědomit, však je, že součet délek kteréhokoliv dvě strany trojúhelníku musí být větší než délka třetí strany. To je vlastně pravda. Nemůžete mít trojúhelník stran 1, 2 a 4, například proto, že 1 plus 2 není větší než 4. Takže to jsou pravidla, která určení, zda je či není tří vstupy mohou teoreticky tvořit trojúhelník. Tak se pár minut a deklarovat a definovat Tato funkce s názvem platné trojúhelník, takže to vlastně má chování zde uvedenou. To bude výstup true, pokud těchto tří stran jsou schopné obsahující trojúhelník, a v opačném případě false Ready to vidět, jak jste? Tady je jedna implementace platných trojúhelníku. Není to jediná. Yours mohou mírně lišit. Ale to člověk dělá, ve skutečnosti, mají chování, které jsme očekávali. My prohlašujeme, že náš funkce u velmi top, bool platný trojúhelník float x float y float z. Takže znovu, tato funkce trvá tři reálná čísla jako jeho argumenty, plovoucí proměnné bodová hodnota, a výstupy pravda nebo lež hodnota, která je logická, odvolání. Takže to je důvod, proč je návratový typ bool. Pak definujeme funkci. První věc, kterou děláme, je zkontrolujte, zda že všechny strany jsou pozitivní. Je-li x je menší než nebo se rovná na 0, nebo v případě, y je rovno 0, nebo pokud z je menší nebo rovno 0, že nemůže být trojúhelník. Nemají pozitivní stránky. A tak se můžeme vrátit false v této situaci. Dále jsme zkontrolujte, zda že každá dvojice vstupů je větší než třetí. Takže pokud x a y je méně než nebo rovno z, nebo-li x a z menší než nebo rovno y, nebo v případě, y a z je menší než nebo se rovná x, to také nemůže být platný trojúhelník. Takže se vracíme opět false. Za předpokladu, že jsme prošli oba kontrol i když, pak se můžeme vrátit pravda. Protože těchto tří stran jsou schopné returning-- vytvoření platné trojúhelník. A to je vše. Nyní jste deklarovány a definován. A můžete být schopni teď použití a volání této funkce. Dobrá práce. Jsem Doug Lloyd. To je cs50.