DOUG LLOYD: Rendben. Így most nézzük megoldania Tényleg nagy téma, funkciókat. Eddig során, mind a programok, amit már írásban írtak belsejében fő. Elég egyszerű programok. Nem kell, hogy mindezen ágak és dolgok történtek. Mi is csak illeszkedjen az egészet belsejében fő és nem lesz rettenetesen nyomasztó. De ahogy a kurzus folytatódik, és Amint elkezd programok fejlesztésére, függetlenül, ők valószínűleg lesz kezdeni, hogy sokkal több, mint 10 vagy 15 sor. Lehet, hogy száz vagy több ezer vagy több tízezer sornyi kódot. És ez tényleg nem hogy őrült gondolat. Mint ilyen, ez talán nem jó ötlet tartani mindent belsejében fő. Ez lehet, hogy egy kicsit nehéz megtalálni mit keres, ha ezt teszed. Szerencsére azonban a C, és elég sok Minden más programozási nyelv, Lehet dolgozni, lehetővé teszi, számunkra, hogy írjon funkciókat. És én csak fog Egy gyors félre itt megemlíteni, hogy funkciók egyik terület a számítástechnika. És látni fogod, több közülük különböző pontjain egész folyamán és ha továbbra is. Hol van egy csomó szinonimáit ugyanazt a szót. Így hívjuk a funkciókat. De talán azt is hallani őket nevezik eljárások, vagy módszerek, különösen, ha valaha történt semmilyen objektumorientált programozás before-- és ne aggódj ha nem, nem egy nagy deal-- de audit orientált nyelvek gyakran nevezik módszerek. Néha ők hívják szubrutinok. De tényleg minden utalnak hogy ugyanazt az alapötletet. Lássuk, mi az ötlet. Mi a funkciója? Nos függvényében valóban nem más, mint egy fekete doboz. Egy fekete doboz, hogy van egy sor nulla vagy több bemenettel és egy kimenettel. Így például, ezt a Lehet, hogy egy függvény. Ez a funkció az úgynevezett funkcionális. És tart három bemenet a, b, illetve c. És benne, hogy a fekete doboz, amit Nem tudom pontosan, hogy mit csinál, de feldolgozza a bemenetek valamilyen módon és akkor ad egyetlen kimeneti, ebben az esetben, z. Most, hogy ez egy kicsit kevésbé elvont, mi Mondhatnánk, hogy talán Van olyan függvény is hozzá, hogy úgy három bemenettel a, b, és c és feldolgozza a kimenet valamilyen módon a fekete dobozban, hogy előállítani egy kimenet. Tehát ebben az esetben, ha add vesz 3, 6, és 7. Valahol a Új funkciót, mi lenne azt várják tőlük, hogy össze kell adni hogy készítsen a kimenet, amely 3 plusz 6 plusz 7 vagy 16. Hasonlóképpen, van olyan függvény is mult, hogy úgy két bemenet, az A és B, feldolgozza azokat valamilyen módon, például hogy a kimenet a funkció a termék a két bemenet. A két bemenet szorozva össze. A 4. és 5. hárítanak át mult, valami történik, akkor a kimenet várunk 20. Miért nevezzük ezt a fekete doboz? Nos, ha nem vagyunk írásban funkcionál magunkat, amely tettünk egy kicsit eddig CS50. Láttuk nyomtatási f, például, amely egy olyan funkció, hogy nem írtunk magunkat, de ne használja minden alkalommal. Ha nem vagyunk írásban A funkciók magunkat, nem igazán kell tudni, hogyan kell ezt ténylegesen végrehajtott a motorháztető alatt. Így például a fekete doboz I csak azt mutatta, hogy a szorzás, Több, b lehetne defined-- és ez még csak Néhány pseudocode-- lehet meghatározása a kimeneti egy alkalommal b. Van ennek valami értelme, ugye. Ha van olyan függvény is Több, hogy úgy két bemenettel. Azt várnánk, hogy a kibocsátást a két bemenet megszorozva együtt, Egy alkalommal b. De mult is lehet végre, mint ez, van egy számláló változót kap meg benne a mult 0. És akkor ismételje meg ezt a folyamatot b szor hozzá a számláló. Például, ha megszorozzuk 3a által 5b, azt mondhatnánk, állítsa számlálóját 0, ismételje meg ötször, adjunk hozzá 3 a számláló. Tehát kezdjük 0 és akkor mi ezt ötször 3, 6, 9, 12, 15. Ez az eredmény ugyanaz. Mi még mindig 3-szor 5 csak a végrehajtás különböző. Ez az, amit értünk amikor azt mondjuk, egy fekete doboz. Ez csak azt jelenti, hogy nem igazán érdekel hogyan is végrehajtott a motorháztető alatt mindaddig, amíg a kimeneti, amit várunk. Tény, hogy ez a szerződés részét Az olyan funkciók használatát, különösen funkciók mások írni. A viselkedés mindig megy jellemzőnek, kiszámíthatatlan alapján a függvény nevét. És ez az, amiért ez tényleg fontos, ha írsz funkciók vagy amikor más emberek írni funkciók, hogy lehet használni, hogy ezek a funkciók már világos, viszonylag egyértelmű neveket, és jól dokumentáltak. Amely minden bizonnyal a helyzet A funkció, mint a nyomtatási f. Szóval miért használjuk funkciók? Nos, mint mondtam korábban, ha írunk minden kedves kód belsejében fő dolog tud igazán nehézkes és nagyon bonyolult. Funkciók lehetővé teszik számunkra a lehetőség szervezni a dolgokat, és szakítani egy nagyon összetett probléma, a sokkal kezelhetőbb al alkatrészeket. Funkciók is lehetővé teszi számunkra, hogy egyszerűsítse a kódolási folyamat. Ez sokkal könnyebb a hibakeresés 10 vonalfunkcióval szemben a 100 vonalon funkciót vagy egy 1000 funkció használatát. Ha már csak a hibakeresés kis darab egy időben, vagy írjon apró darabokra idején, ez teszi, hogy programozási tapasztalat sokkal jobb. Hidd el nekem, hogy az egyik. Végül, ha írunk függvények tudja használni ezeket különböző részein. Funkciók újrahasznosíthatók. Ezeket lehet használni egy program vagy egy másik. Te már írtam A funkciót, akkor kell tennie, hogy elmondja, hogy a program hol találom ezt a funkciót. Már újrahasznosítás és használata print f több mint 40 éve. De ez csak írásbeli egyszerre. Elég hasznos, ugye. Minden rendben. Szóval funkciók nagy. Tudjuk, hogy. Most kezdjük írás őket. Kezdjük egyre azokat a programokat. Ahhoz, hogy ezt megtehessük, az első semmi mást nem csinálnak állapítsa meg a funkciót. Amikor egy függvény amit alapvetően csinál azt mondja a fordító, hé, csak hogy tudd, Én megyek, hogy írásban függvényében a későbbiekben és itt mit fog kinézni. Ennek az az oka az, mert összeállítói is csinálni valami furcsa dolog, ha látnak meg azokat a szimbólumokat hogy ők nem ismerik. Szóval csak adni a fordító egy heads up, hozok létre funkciót és ez meg fog tenni. Funkció nyilatkozatok általában, ha te szervező a kódot módon hogy mások képesek lesznek megérteni és kihasználni, akkor általában akarja tenni az összes a funkció nyilatkozatok legtetején a kódot, jobb megkezdése előtt írásban fő sőt. És kényelmesen, van Nagyon formanyomtatvány hogy minden függvény deklaráció következik. Ezek mind nagyon sokat néz ki. Három részből függvényében nyilatkozatot, visszatérő típus, név, és paraméterek listája. Most a visszatérési típus az, hogy milyen változó a függvény kimenete. Így például, ha azt gondoljuk vissza perce a megszorozzák két szám funkciót, mit várunk, ha megszorozzuk egy egész szám egy egész számmal a kimenet Valószínűleg egy egész, igaz. Szorozni két egész szám együtt, akkor kap egy egész. Tehát a visszatérési típus, hogy funkció lenne int. Név, amit akar felhívni a funkciót. Ez talán a legkevésbé fontos részét a funkciót nyilatkozatot, funkcionális szempontból. De valójában talán egy A legfontosabb alkatrészek A funkció szerinti nyilatkozat hogy tudjuk, mi a funkciója ténylegesen csinál. Ha elnevezni a funkció F vagy G vagy h vagy rejtélyt, vagy valami ilyesmi, akkor valószínűleg fog kapni egy kicsit megbotlott a próbálkozást emlékezni, milyen azok a funkciók csinálni. Ezért fontos, hogy a függvény értelmes nevet. Végül paraméterek listája található A vesszővel elválasztva összes be-, hogy a funkció, amelyek mindegyike egy típus és egy név. Tehát nem csak akkor kell meghatározza, hogy milyen típusú változó A funkció kimenet, Ön is szeretné megadni milyen típusú és típusú változók a funkciót, hogy elfogadtam bemenet. Tehát lássuk példának. Nézzük csak vess egy pillantást Konkrétabban egy. Tehát itt egy példa a függvény nyilatkozat, hogy a funkció Hozzáteszem, két egész együtt. Az összeg két egész számot fog egész szám lehet is, hiszen mi csak tárgyalt. És így a visszatérő jellege, itt a zöld, lenne int. Hogy csak azt mondja, hogy adjunk hozzá két ints fog, a végén a nap, kimenet, vagy köpje vissza ki nekünk, egész szám. Tekintettel arra, amit ez a funkció nem vagyunk akarjuk, hogy ez egy értelmes nevet. Adjunk hozzá két ints tűnik megfelelő, figyelembe véve, elvisszük két egész szám, mint bemenet és remélhetőleg hozzá őket össze. Lehet, hogy egy kicsit nehézkes nevet és őszintén szólva ez a funkció valószínűleg nem szükséges mivel van a kiegészítéssel, üzemben, ha visszaemlékeztek a mi vita a piaci szereplők, a korábban. De mondjuk, a kedvéért érv, hogy ez a funkció hasznos és így fogunk nevezni adjunk hozzá két ints. Végül ez a függvény két bemenet. Amelyek mindegyike egy egész szám. Szóval itt van ez a vessző elválasztott listája bemenet. Most általában szeretnének hogy nevet adjon mindegyik úgy, hogy lehet használni a funkción belül. A nevek nem igazán fontos. Ebben az esetben mi nem feltétlenül nincs értelme tárolni. Így tudjuk csak hívja őket a és b. Ez teljesen rendben. Ha azonban azt találjuk, magát olyan helyzetben, ahol a nevét a változók talán valóban fontos, érdemes felhívni őket valami más, mint az a és b hogy nekik valami szimbolikusan értelmezhető. De ebben az esetben, nem igazán tudom, semmi mást erről a funkcióról. Csak azt akarjuk, hogy két egész számot. Ezért most is csak hívni azok egész számok a és b. Ez egy példa. Miért nem veszel egy második gondolni ezt, Hogyan írnánk egy függvény nyilatkozat, hogy a funkció szoroz két lebegőpontos számok? Emlékszel, milyen lebegőpontos szám? Mi lenne ez a funkció nyilatkozatot néz ki? Igazából javasoljuk, hogy állítsa meg a videót Itt és megteszi, hogy mennyi idő van szüksége. Gondoljunk bele, milyen ez a függvény deklaráció lenne? Mi lenne a visszatérési típus lehet? Milyen lenne egy értelmes nevet lenni? Mi lenne a bemenet legyen? Akkor miért nem szünetelteti a videót itt és írni-up függvényében nyilatkozat Egy funkció, amely megsokszorozza Két lebegőpontos számok együtt. Remélhetőleg Ön szünetelteti a videót. Szóval vessünk egy pillantást az alábbi Az egyik lehetséges nyilatkozatot. Float mult két valós számok úszó x, y úszó. A termék két lebegőpontos számok, amelyek emlékeztetnek a hogyan reprezentálja a valós számok vagy számokat decimális értékeket c, lesz egy lebegőpontos szám. Ha megszorozzuk a tizedes egy tizedes, akkor valószínűleg lesz, hogy a tizedes. Azt akarod, hogy ez egy megfelelő nevet. Szorozni két valós számok úgy tűnik, rendben van. De tényleg nevezni Több két úszik, vagy mult úszik. Bármi hasonló, mindaddig, amíg ez adott néhány valós értelmét, amit ez a fekete doboz akartam csinálni. És ismét, ebben az esetben, mi nem Úgy tűnik, hogy nincs értelme csatolt a nevét változók vagyunk halad, így hívjuk őket, x és y. Most, ha hívjuk őket valami mást, ez teljesen rendben van. Sőt, ha nem ez a nyilatkozat helyett a páros helyett Az úszók, ha visszaemlékeztek hogy páros egy másik módja, hogy pontosabban adja valós számok, vagy lebegőpontos változók. Ez teljesen rendben is. Vagy egy ilyen jó lenne. Tény, hogy számos a különböző kombinációk módon nyilatkozni ez a funkció. De ez a két nagyon jó is. Már nyilvánították funkciót, ez nagyszerű. Már mondtam a fordító mit van, hogy mit fogunk csinálni. Most valóban azt írja, hogy a funkció. Adjunk meghatározását, úgy, hogy a fekete dobozban a kiszámítható viselkedés történik. Sőt, mi szaporodnak két igazi számokat össze, vagy a számok hozzáadását együtt, avagy bármi is hogy arra kértük a funkciót csinálni. Tehát valójában, próbáljuk meghatározni és szorozni két valós számok, amelyek már csak beszélt egy másodperccel ezelőtt. Most az elején függvénydefiníciójában úgy néz ki, szinte pontosan megegyezik függvényében nyilatkozatot. Én mindkettőt itt. Ezek közül a legfontosabb a funkció nyilatkozatot, típus, név, vesszővel elválasztva érv listáját, pontosvessző. A pontosvessző azt jelzi, hogy hogy egy olyan funkció nyilatkozatot. Az elején a funkció meghatározása úgy néz ki, majdnem pontosan ugyanaz, típus, név, vesszővel elválasztva paraméterek listája, nincs pontosvessző, nyissa kapcsos zárójel. A nyitott zárójel, mint ahogy mi már ennek a fő, azt jelenti, hogy most kezdik meghatározni mi történik a fekete dobozban, hogy úgy döntöttünk, hogy hívja mult két valós számok. Itt az egyik módja annak végrehajtására. Mondhatnánk, kijelenthetjük új változó float típusú nevezett termék és hozzá, hogy a változó Az x érték idők y. És akkor vissza terméket. Mit jelent visszatérést jelenti itt. Nos visszatérés az út azt mutatják, hogy ez hogyan mi megy a kimeneti visszakozni. Így vissza valamit, ugyanaz, mint a, Ez a kimenet a fekete doboz. Szóval így csinálod. Itt egy újabb módja annak végrehajtására. Így egyszerűen visszatérhet x-szer y. x egy úszó. y egy úszó. Tehát x-szer y is bontható. Nem is kell, hogy hozzon létre egy másik változó. Szóval ez egy másik módja annak, végre pontosan ugyanazt a fekete doboz. Most egy pillanatra, szünetelteti a videót újra, és megpróbálja meghatározni adjunk hozzá két ints, amely a többi funkció, amit a beszélt az imént. Ismét itt, amit tesz a funkciót nyilatkozatot, és így a pontosvessző, és egy nyitott zárójel és egy zárt göndör zárójel jelzi, hol fogunk tölteni a tartalmát adjunk hozzá két ints, hogy mi határozza meg az adott viselkedését a fekete dobozban. Tehát szünetelteti a videót. És annyi időt, mint meg kell próbálni, és meghatározza egy megvalósítása adjunk hozzá két ints, mint hogy ha a funkció kiad egy értéket, ez nem, sőt, visszatérő az összeget a két bemenet. Szóval, mint az előző példában, számos különböző módon hogy meg tudná végrehajtani adjunk hozzá két ints. Itt van egy. Itt vagyok narancssárga voltam Csak volt néhány comments-- Már csak hozzá némi kommentek jelzésére mi történik az egyes kódsort. Szóval, hogy egy változót nevezett összeget int típusú. Azt mondom összeg eléri a plusz b. Ez az, ahol valójában csinál a munka hozzátéve A és B együtt. És visszatérek összeget. És hogy van értelme, mert összege egy egész típusú változó. És mi van az adatok típusát, hogy ez a függvény azt mondja, ez lesz a kimenet? Int. Úgyhogy visszatérő összeget, amely egy egész típusú változó. És hogy van értelme adni, amit mi már A bejelentett és megadott a funkciót csinálni. Most Ön is meghatározhat A funkció így, int összeg eléri a plusz b-- kihagyom első step-- majd vissza az összeget. Most is lehetett volna végre ezt így, amit én nagyon nem ajánlom. Ez rossz stílus egy dolog, és nagyon rossz tervezés, de ez nem, sőt, a munka. Ha ezt a kódot, amely int add rossz vipera dot c, és használja azt. Ez valójában ez hozzá két egész együtt. Ez egy nagyon rossz végrehajtás ennek a különös viselkedést. De ez nem működik. Csak itt, hogy bemutassa a lényeg, hogy mi nem igazán érdekel, hogy mi történik belül A fekete doboz, mindaddig, mint azt a kimenetet, hogy várunk. Ez egy rosszul megtervezett fekete doboz. De a végén a nap, ez nem Még mindig kimeneti összege plusz b. Minden rendben. Így már bejelentett funkciókat. És mi már meghatározott funkciót. Szóval ez tényleg jó. Most kezdjük használni a funkciókat hogy már bejelentett és mi már meghatározott. Felhívása function-- ez valójában csinos easy-- annyit kell tennie, ez adja át a megfelelő érvekkel, érvek az adatok típusa hogy arra számít, és majd rendelni a visszatérés értéke, hogy a funkció és this-- mentség me-- rendelni a visszatérési értéke, hogy a funkció hogy valamit a megfelelő típusú. Szóval vessünk egy pillantást ez a gyakorlatban egy fájlban úgynevezett vipera 1 pont c, amely Nekem van az én CS50 IDE. Tehát itt van a kiegészítés 1 pont c. Az elején látod én én magában, font közé, szabvány IO, és CS50 pont h. És akkor ott van a függvény deklaráció. Ez az, ahol én vagyok mondja a fordító vagyok fog írni egy nevezett funkció adjunk hozzá két ints. Ez lesz az output egész típusú változó. Ez az, amit ez a rész itt. És akkor már két bemenet, hogy egy és b, amelyek mindegyike egy egész szám. Belül a fő, kérem a felhasználói számára input, mondván, hogy nekem egy egész szám. És kéri, hogy felejtse el int, amely egy olyan funkció, amely benne van a CS50 könyvtárban. És hogy kerül tárolásra x, egy egész szám. Aztán készteti a másik egész. Kapunk még egy egész és tárolja, hogy az y. És akkor itt a 28. sor, a ahol azt, hogy mi funkció hívást. Azt mondjuk, int z egyenlők adjunk hozzá 2 ints x vessző y. Látod, hogy ez miért van értelme? x jelentése egész szám típusú változó és y jelentése egész szám típusú változó. Szóval ez jó. Van ennek valami értelme, amit mi funkcióval nyilatkozatot a 17. sorban néz ki. A vesszővel elválasztott bemeneti lista elvárja két egész számot, a és b. Ebben az esetben tudjuk hívni nekik, amit csak akarunk. Csak arra számít, két egész szám. És x jelentése egész szám, és y jelentése egész szám. Ez működik. És tudjuk, hogy a funkció fog a kimeneti egy egész szám is. És így tárolja a kimenete a funkció, adjunk hozzá két ints, egy egész típusú változó, amit hívsz részt. És akkor azt mondhatjuk, az összege százalékkal i és százalék i százalék i. x, y és z rendre Töltsd azokban százalékkal i-re. Mi az a meghatározás, adjunk hozzá két ints néz ki? Nagyon egyszerű. Ez az egyik az általunk Most láttam egy perce, int összeg eléri a plusz b visszatérő összeget. Működik ez? Mentsük el a fájlt. És akkor itt lent az én terminál Megyek, hogy a kiegészítés 1, és törölhetem a képernyőn. Megyek a nagyítás, mert tudom, ez egy kicsit nehéz belátni. Tehát fordítani ezt a programot, mint a kiegészítés 1. Így nem tehetünk dot perjel kiegészítés 1. Adj nekem egy egész, 10. Adj még egy egész, 20. A összege 10 és 20 30. Így készült a sikeres függvényhívás. Futtathatja a funkció ismételt negatív 10, 17 összege negatív 10 és 17 7. Ez a funkció. Azt a viselkedést hogy elvárná. És így tettünk egy sikeres funkciót, meghatározása, nyilatkozat, és a függvény. Pár egyéb pontok a funkciók mielőtt megkötik ezt a szakaszt. Emlékezzünk a mi tárgyalása adattípusok, korábban, hogy a funkciók Néha nem tesz bemenet. Ha ez a helyzet, állapítsa meg a funkciót mintha egy void paraméterek listája. Emlékszik, amit a leggyakoribb funkció láttuk eddig, hogy vesz void paraméterek listája található? Ez a fő. Emlékezzünk vissza, azt is, hogy a funkció néha valójában nem is egy kimenetet. Ebben az esetben mi állapítsa meg a funkciót mintha egy void visszatérési típus. Nézzük Ebben a részben a tűzésével gyakorlatban problémát. Tehát itt van a probléma lefektetett. Azt akarom, hogy írjon egy funkciót nevű érvényes háromszöget. Mi ezt a funkciót kell tennie A valós számok, hogy három hogy képviselje a hossza a három Egy háromszög oldalai, mint a paraméterei, vagy érveit, vagy inputs-- másik meg a szinonimákat hogy lehet találkozni. Ezt a funkciót vagy kimenet igaz vagy hamis attól függően, hogy az említett három hosszban képesek, hogy egy háromszög. Emlékszel az adatok típusát, hogy szoktuk azt mutatják, igaz vagy hamis? Most hogyan alkalmazza ezt? Nos tudom, van egy pár A vonatkozó szabályok háromszögek hogy valóban hasznos tudni. A háromszög csak akkor lehet fél pozitív hosszúságú. Ennek van értelme. Akkor valószínűleg mondván hülyeség. A másik dolog megjegyezni de az, hogy az összeg hosszának bármely két oldalán a háromszög kell, hogy legyen nagyobb, mint a hossza a harmadik oldala. Ez valóban igaz. Nem lehet egy háromszög oldalainak 1, A 2. és 4., például azért, mert 1 plusz 2 nem nagyobb, mint 4. Tehát ezek a szabályok, amelyek e vagy sem a három bemenetek elképzelhető háromszöget alkotnak. Tehát hogy egy pár percig és állapítsa meg, majd meghatározzák Ez a funkció az úgynevezett érvényes háromszög, mint az, hogy ténylegesen az a viselkedés az itt megadott. Ez kiírja, igaz, ha e három oldalról képesek, amely egy háromszög, és egyébként false Készülj fel, hogy hogyan csinálta? Itt van egy végrehajtásáról Az érvényes háromszög. Ez nem az egyetlen. Tisztelettel esetleg kis mértékben változhatnak. De ez nem, sőt, van azt a viselkedést várunk. Kinyilvánítjuk funkciót a legtetején, bool érvényes háromszög float x float y úszó részt. Szóval megint, ez a funkció úgy három valós számok mint az érvelését, úszó pont értéke változó, és kiad egy igaz vagy hamis érték, amely egy logikai, visszahívás. Tehát ezért a visszatérési típus int. Aztán a függvényt. Az első dolog, amit tennie, győződjön meg róla, hogy az összes oldalról pozitív. Ha x kisebb vagy egyenlő, a 0, vagy ha y értéke 0, vagy ha Z kisebb vagy egyenlő 0, hogy sem lehet egy háromszög. Nem kell a pozitív oldalát. És így is vissza hamis ebben a helyzetben. Következő, győződjön meg róla, hogy minden pár bemenetek nagyobb, mint a harmadik. Tehát, ha x plus y kisebb vagy egyenlő, mint a Z, vagy ha x plus z kevesebb vagy egyenlő, mint Y, vagy ha y plusz z értéke kisebb vagy egyenlő, mint x, hogy szintén nem lehet érvényes háromszög. Tehát return false újra. Feltételezve mentünk mind az ellenőrzések mégis, akkor mi is vissza igaz. Mivel e három oldalról képesek returning-- létrehozásának érvényes háromszöget. És ez az. Már most azt nyilatkozta, és meghatározott. És lehet, hogy most használni, és ezt a funkciót. Remek munka. Én Doug Lloyd. Ez CS50.