DOUG LLOYD: Okei. Vaatame nüüd käsile tõesti suur teema, funktsioonid. Seni käigus kõik programmid, mis meil on kirjalikult on kirjutatud sees peamine. Nad on üsna lihtne programme. Sa ei pea olema kõik need oksad ja asju juhtub. Me võime lihtsalt sobib see kõik sees peamine ja see ei saa kohutavalt suur. Aga muidugi läheb edasi ja kui sa hakkad arendada programme iseseisvalt, nad ilmselt läheb alustada, et saada palju rohkem kui 10 või 15 rida. Te võite saada sadu või tuhandeid või kümneid tuhandeid rida koodi. Ja see on tõesti ei ole mis hull mõte. Nagu näiteks, see ilmselt ei ole hea mõte hoida kõike sees peamine. See võib natuke raske leida mida te otsite, kui teil seda teha. Õnneks küll C, ja päris palju iga teine ​​programmeerimiskeel, mis Võib töötada, võimaldab meil kirjutada funktsioone. Ja ma olen lihtsalt kavatse võtta kiire kõrvale siin mainida, et funktsioonid on ühes valdkonnas infotehnoloogia. Ja te näete palju rohkem neid erinevates punktides vältel ja kui sa jätkata. Kui on palju sünonüümid sama sõna. Nii me nimetame funktsioone. Aga siis võiks kuulata ka neid nimetatakse protseduure, või meetodeid, eriti, kui sa oled kunagi teinud ühtegi objektorienteeritud programmeerimine before-- ja ärge muretsege kui sa ei ole, ei ole suur deal-- kuid Auditi orienteeritud keeltes sageli nimetatakse meetodeid. Vahel nad nimetatakse alamprogrammid. Aga nad tegelikult tähendavad kõik sama põhiidee. Vaatame, mis see mõte on. Mis on funktsioon? Noh funktsioon on tõesti midagi enamat kui musta kasti. Must kast, mis on seatud null või mitme sisendi ja ühe väljundi. Nii näiteks, käesoleva võiks olla funktsioon. See on funktsioon, mida nimetatakse funkts. Ja see kestab kolm sisendite a, b ja c. Ja sees, et musta kasti, me ei tea täpselt, mida ta teeb, kuid ta töötleb sisendite mingil moel ja siis annab üks väljund, sel juhul, z. Nüüd, et muuta see veidi vähem abstraktne, me Võiks öelda, et äkki me on funktsioon nimega lisada, et võtab kolm sisendite a, b, ja c ja töötleb väljund kuidagi sees musta kasti toota ühte väljundit. Nii sel juhul, kui lisage kestab 3, 6 ja 7. Kuskil sees lisada funktsiooni, oleksime oota neid liita toodangu valmistamiseks, mis on 3 pluss 6 pluss 7 või 16. Samamoodi on funktsioon nimega mult, mis võtab kaks sisendit, a ja b, töötleb neid mingil moel, näiteks et väljund funktsiooni on toode kahest sisendist. Kaks sisendit korrutada. 4 ja 5 on läinud mult, midagi juhtub, väljund ootame on 20. Miks me nimetame seda musta kasti? Noh, kui me ei ole kirjalikult toimib ise, mis me oleme teinud üsna natuke seni CS50. Me oleme näinud print f, näiteks mis on funktsioon, et me ei kirjuta ise, kuid me ei kasuta kogu aeg. Kui me ei kirjuta funktsioone ise, me tõesti ei pea teadma, kuidas see tegelikult ellu kapoti alla. Nii näiteks musta kasti ma Näitasime teid korrutamine mult a, b võiks olla defined-- ja see on lihtsalt mõned pseudocode-- võiks olla defineeritud väljund korda b. Mis mõtet, eks. Kui meil on funktsioon nimega mult, mis võtab kaks sisendit. Loodame, et väljund oleks olema kaks sisendit korrutatud koos, kordi b. Aga mult võiks olla ka rakendada niimoodi, meil on counter muutuja saada määratud sees mult 0. Ja siis me kordame seda protsessi b korda lisada, et counter. Näiteks, kui me korrutame 3a 5b, võime öelda seatud valikule 0, korrata viis korda, lisada 3 counter. Nii hakkame 0 ja siis me teeme Selle viis korda 3, 6, 9, 12, 15. See on sama tulemus. Me ikka 3 korda 5 lihtsalt rakendamiseks on erinev. See, mida me mõtleme kui me ütleme must kast. See lihtsalt tähendab, et me tõesti ei hooli kuidas see ellu kapoti alla niikaua väljund on see, mida me eeldame. Tegelikult, see on osa lepingust kasutades funktsioone, eriti funktsioone, mida teised kirjutavad. Käitumine on alati saab iseloomustavatest, ettearvamatu põhineb funktsiooni nimi. Ja see on põhjus, miks see tegelikult oluline, kui sa kirjutad funktsioonid või kui teised inimesed kirjutavad funktsioone, mida võib kasutada, et need funktsioonid on selge, suhteliselt selge nimed, ja on hästi dokumenteeritud. Milline on kindlasti nii funktsiooni nagu print f. Miks me kasutame funktsioone? Noh, nagu ma ütlesin, kui me kirjutame kõik meie koodi sees peamine asjad saab tõesti tülikas ja tõesti keeruline. Funktsioonid võimaldavad meil võimalus korraldada asju ja lõhkuda väga keeruline probleem sisse palju paremini hallatavaks sub osad. Funktsioonid võimaldavad ka meil lihtsustada kodeeriva protsessi. See on palju lihtsam silumiseks 10 line funktsioon versus 100 rida funktsiooni või 1000 rida funktsiooni. Kui meil on ainult siluda väikesteks tükkideks korraga, või kirjuta väikesteks tükkideks ajal, see teeb, et programmeerimise kogemus palju parem. Usu mind, et üks. Lõpuks, kui me kirjutame funktsioonid me saab taaskasutada need erinevad osad. Funktsioone saab taaskasutada. Neid saab kasutada in ühe programmi või teise. Sa oled juba kirjutanud funktsiooni, kõik, mida pead tegema, on öelda, et programmi kust leida selle funktsiooni. Me oleme ringlussevõtu ja kasutades print f üle 40 aasta. Aga see oli ainult kirjutatud üks kord. Päris kasulik, õige. Hästi. Nii funktsioonid on suur. Me teame seda. Nüüd hakake neid. Alustame saada need meie programme. Selleks, et esimene asi, mida me teeme on tunnistada funktsiooni. Kui kuulutada funktsiooni mida sa põhimõtteliselt teed räägib koostaja, hey, lihtsalt, et sa teaksid, Ma lähen kirjalikult Funktsiooni hiljem ja siin on, mida see hakkab välja nägema. Selle põhjuseks on sest koostajad ei teha mõned imelikke asju kui nad näevad sümboolikast et nad ei tunne. Nii et me lihtsalt anda koostaja pead sisse, ma loon funktsioon ja see läheb seda teha. Funktsioon deklaratsioonid üldiselt kui sa korraldada oma koodi nii, et teised saavad mõista ja kasutada, sa tavaliselt taha panna kõik oma funktsiooni deklaratsioonid ülaservas oma koodi, õigus enne kirjutamise alustamist peamine isegi. Ja mugavalt, seal on väga tüüpvormi et iga funktsiooni deklaratsiooni järgmiselt. Nad kõik on päris palju näeb välja selline. Seal on kolm osa funktsioon deklaratsiooni, tagastamise liik, nimetus, ja argument nimekirja. Nüüd tagastamise tüüp on, millist muutuja funktsiooni väljund. Nii näiteks, kui me arvame tagasi minut tagasi kuni korrutades kaks numbrid funktsiooni, mida me ootame, kui me korrutame täisarv täisarvu väljund on ilmselt täisarv, eks. Korrutatakse kaks täisarvu kokku, saad täisarv. Nii tüübi tagastamise et funktsioon oleks int. Nimi on see, mida sa tahad helistada oma funktsiooni. See on ilmselt vähem oluline osa funktsiooni deklaratsiooni, nii funktsionaalsust. Aga tegelikult ilmselt üks tähtsamaid osi funktsiooni deklaratsiooni näol teada, mida funktsioon tegelikult teeb. Kui sa nime oma funktsiooni f või g või h või salapära või midagi sellist, oled ilmselt hakka natuke otsa üritab mäleta, mida need funktsioonid teha. Seega on oluline, et anda oma funktsiooni mõtestatud nimed. Lõpuks argument nimekiri on koma eraldatud nimekiri kõik sisendid oma funktsiooni, millest igaühes tüübi ja nime. Nii et mitte ainult sa pead täpsustada, millist tüüpi muutuja Funktsioon väljund, soovite ka täpsustada Mis tüüpi ja liiki muutujad funktsioon vastu sisendina. Nii teeme näiteks siin. Võtame pilk kell konkreetsem üks. Nii et siin on näide funktsiooni deklaratsiooni funktsioon, mis Lisaksin kaks täisarvu koos. Summa kahe täisarvu läheb olema täisarv samuti, kui me lihtsalt arutatud. Ja nii naasmise tüüp siin roheline, oleks int. See lihtsalt ütleb meile, et lisada kaks ints läheb, lõpus päeval, väljund, või sülitada tagasi välja meie täisarv. Arvestades, mida see funktsioon teeb meil tahan anda mingi mõistliku nime. Lisa kaks ints tundub asjakohane, arvestades Astume kaks täisarvu sisendina ja loodetavasti lisades neid koos. See võib olla natuke kohmakas nimi ja ausalt öeldes see funktsioon ei ole ilmselt vaja sest meil on lisaks operaator, kui te mäletate meie arutelu ettevõtjate, varem. Aga ütleme lihtsalt ette huvides argument, et see funktsioon on kasulik ja nii me nimetame seda lisada kaks ints. Lõpuks see funktsioon võtab kaks sisendit. Millest igaüks on täisarv. Nii et meil on see komadega eraldatud nimekiri sisendeid. Nüüd me üldiselt taha nimi anda igaüks neist nii, et neid saab kasutada jooksul funktsioon. Nimed ei ole väga oluline. Sel juhul me ei pruugi mingit tähendust neile lisatud. Nii et me võime lihtsalt neile ja b. See on täiesti korras. Kui aga leiad end olukorrast kus nimedega muutujaid võib tegelikult olla oluline, võiksite helistada neile midagi muud kui a ja b neile midagi enamat sümboolselt sisukas. Aga sel juhul me tõesti ei tea midagi umbes funktsiooni. Me lihtsalt tahame lisada kaks täisarvu. Nii me lihtsalt helistada Neil täisarvud a ja b. See on üks näide. Miks sa ei võta teist mõtlema see, kuidas sa kirjutada funktsiooni deklaratsiooni funktsioon, mis korrutab kaks ujukoma numbrid? Kas sa mäletad, mida ujukomaarvuna on? Mis oleks selle funktsiooni deklaratsiooni välja näeb? Ma tegelikult soovitan pausi video siin ja võtab palju aega sa vajad. Mõtle, mida see funktsiooni deklaratsioon oleks? Mida tüübi tagastamise olla? Mis oleks sisukas nimi olla? Mida sisendite olla? Miks sa ei peatamiseks video siin ja kirjutada-up funktsioon deklaratsioon Funktsiooni mis paljunevad kaks ujukoma numbrid kokku. Loodetavasti sa peatatud video. Võtame pilk näide Ühe võimaliku deklaratsiooni. Float mult kaks reaalarvud float x, float y. Toode kahe ujukoma numbrid, mis meenutavad on, kuidas me näitavad tõelist numbrid või numbrid koma väärtused c, läheb ujukomaarvuna. Kui sa korrutad koma kümnendosaühikuna, oled ilmselt hakka kohaga. Sa tahad, et see on asjakohane nimetus. Korruta kaks reaalarvud tundub hea. Aga siis võiks tõesti nimetada seda mult kaks ujukite või mult ujub. Midagi sellist, nii kaua kui see andis mõned tegelik tähendus, mida see must kast pidi tegema. Ja taas, sel juhul me ei tundub, et on mingi tähendus lisatud to nimed muutujad me möödaminnes, nii me lihtsalt nimetame neid x ja y. Nüüd, kui sa kasutad neid midagi muud, mis on täiesti korras. Tegelikult, kui sa tegid Selle deklaratsiooni asemel kasutades kahekordistab asemel ujukite, kui te mäletate mis kahekordistab on erinev viis täpsemalt täpsustada tegelik arv või ujukoma muutujaid. See on täiesti trahvi ka. Kas üks neist oleks trahvi. Tegelikult on mitu erinevaid kombinatsioone võimalusi kuulutada see funktsioon. Aga need on kaks päris head. Me oleme kuulutanud funktsioon, mis on suurepärane. Me oleme rääkinud koostaja, mida ta on, mida me ei kavatse olla teeme. Nüüd tegelikult kirjutada, et funktsioon. Anname see määratlus, nii, et must kast prognoositav käitumine toimub. Tegelikult oleme korrutades kaks tõelist numbrid kokku, või lisades numbrid koos, või teevad mida iganes see on et me küsisime oma funktsiooni teha. Nii et tegelikult proovime ja määratleda korrutab kaks reaalarvud, mida me lihtsalt rääkis teine ​​tagasi. Nüüd alguses Funktsiooni definitsioon näeb välja peaaegu täpselt sama funktsioonina deklaratsiooni. Mul on mõlemad siin. Ülaosas on funktsiooni deklaratsiooni, liik, nimetus, komaga eraldatud argument nimekirja, semikooloniga. Semikoolonit näitab, et mis on funktsiooni deklaratsiooni. Alguses funktsiooni määratlus näib peaaegu täpselt sama, liik, nimetus, komaga eraldatud argument nimekirja ei semikooloniga avada lokkis traksidega. Avatud lokkis traksidega, nagu oleme teinud koos pea- tähendab, et meil on nüüd hakanud määratleda Mis juhtub, must kast, mis oleme otsustanud kutsuda mult kaks reaalarvud. Siin on üks viis seda rakendada. Võib öelda, võiksime kuulutada uus muutuja tüüpi float nimega toode ja määrata selle muutuja väärtuse x korda y. Ja siis tagasi toote. Mida tagastamise tähenda siin. Noh tulu on tee meil näidata see, kuidas me sooritades väljund tagasi saada. Nii taastada mõni, on sama, see on väljund Musta kasti. Nii see on, kuidas seda teha. Siin on veel üks võimalus seda rakendada. Me võiksime lihtsalt tagasi x korda y. x on sularahaga. y on sularahaga. Nii x korda y on ka sularahaga. Me ei pea isegi luua teise muutuja. Nii et teistmoodi rakendada täpselt sama musta kasti. Nüüd võta hetk, peatada video uuesti, ja üritada määratleda lisada kaks ints, mis on muud ülesanded, et me rääkis hetk tagasi. Jälle siin, ma panin funktsiooni deklaratsiooni, ja nii semikoolon, ja avatud lokkis traksidega ja suletud lokkis traksidega näidata, kus me täita sisus lisada kaks ints, nii et me defineerime eriti käitumist must kast. Nii video peatamiseks. Ja võtab nii palju aega kui sa pead proovima ja määratleda rakendamisest, lisada kaks ints, näiteks et kui funktsioon väljastab väärtuse, see tegelikult tagasipöördumist summa kaks sisendit. Nii nagu eelmises näites, on mitmeid erinevaid viise mida võiks rakendada lisada kaks ints. Siin on üks. Siin oranž Olen oli just mõned comments-- Ma olen lihtsalt lisada mõned kommentaarid, mis näitab, mis toimub iga rida koodi. Nii et ma kuulutada muutuja nimetatakse summa tüüpi int. Ma ütlen summa võrdub pluss b. See, kui me tegelikult teeme töö lisades ja B koos. Ja ma tagasi summa. Ja mis mõtet, sest summa on muutuja tüüpi int. Ja mis andmed sisestada, et see funktsioon ütleb mulle, et see läheb väljund? Int. Nii et ma olen tagasi summa, mis on täisarv muutuja. Ja mis mõtet arvestades seda, mida me oleme deklareeritud ja määratletud meie funktsioon tegema. Nüüd saad ka määrata, funktsiooni nii, int summa võrdub Lisaks b vahele, et Esimene step-- ja siis tagasi summa. Nüüd siis võiks olla ka rakendada seda nii, mis ma väga ei soovita. See on halb stiili üks asi ja tõesti halb disain, kuid see tegelikult tööd. Kui te võtate seda koodi, mis on int lisada halb rästik dot c, ja seda kasutada. See tegelikult ei lisa kaks täisarvu koos. See on väga halb rakendamine Selle konkreetse käitumist. Aga see ei tööta. See on lihtsalt siin, et illustreerida punkt, et me tõesti ei huvita, mis leiab aset musta kasti, kui kaua kui see on väljund, mida me ootame. See on halvasti projekteeritud musta kasti. Aga lõpus päeval, see ikka väljund summa pluss b. Hästi. Nii et me oleme kuulutanud funktsioone. Ja me oleme määratud funktsioon. Nii et see on tõesti hea. Nüüd alustame funktsioone kasutada et me oleme kuulutanud ja me oleme määratletud. Helistamine funktsioon-- see on tegelikult päris easy-- kõik, mida vaja teha on edastada see on asjakohane argumendid, argumendid andmete tüübi et ta loodab, ning siis anna tagastamise väärtus selle funktsiooni ja see-- vabandus mind-- määrata tagastatav väärtus selle funktsiooni midagi õiget tüüpi. Nii saab tutvuda see praktikas faili nimetatakse rästik 1 dot c, mis Mul on minu CS50 IDE. Nii et siin on rästik 1 dot c. Alguses sa näed mul minu hõlmab nael hulka, standard IO ja CS50 dot h. Ja siis mul on funktsiooni deklaratsiooni. See on koht, kus ma olen räägib koostaja ma olen saab olema kirjalikult funktsioon nimega lisada kaks ints. See saab väljastab täisarv tüüpi muutuja. Just see osa on siin. Ja siis mul on kaks sisendit seda ja b, millest igaüks on täisarv. Toas peamine, ma küsin kasutajale sisend, öeldes, anna mulle täisarv. Ja nad palutakse unustada int, mis on funktsioon, mis sisaldub CS50 raamatukogu. Ja mis saab salvestatud x, täisarv muutuja. Siis me sundida neid veel täisarv. Me saame teise täisarvu ja hoidke, et y. Ja siis, siin on line 28, on kus me teeme oma funktsioon kõne. Me ütleme, int z võrdsete lisada 2 ints x koma y. Kas sa näed, miks seda on mõtet? x on täisarv tüüpi muutuja ja y on täisarv tüüpi muutuja. Nii see on hea. Mis mõtet, mida meie funktsioon deklaratsiooni real 17 näeb. Koma eraldatud sisend nimekirja loodab täisarvud a ja b. Sellisel juhul me nimetame neid iganes me tahame. See lihtsalt ootab kaks täisarvu. Ja x on täisarv ja y on täisarv. See töötab. Ja me teame, et funktsiooni saab to väljastab täisarvu samuti. Ja nii me hoiustamiseks väljund funktsiooni, lisada kaks ints, on täisarv tüübist muutuja, mis me kutsudes z. Ja siis me ei saa öelda, summa protsenti i ja protsenti i on protsenti i. x, y ja z võrra täites neid protsenti i poolt. Mis on mõiste lisada kaks ints välja näeb? See on üsna lihtne. See on üks need, mida me Nägin just hetk tagasi, int summa võrdub pluss b tagastamise summa. Kas see toimib? Olgem faili salvestada. Ja siis siin minu terminal Ma lähen tegema rästik 1 ja ma kustutan oma ekraanil. Ma lähen suurendada, sest ma tean see on natuke raske näha. Nii oleme kompileerida selle programmi rästik 1. Nii saame teha dot kaldkriipsuga rästik 1. Anna mulle täisarv, 10. Anna mulle veel üks täisarv, 20. Summa 10 ja 20 on 30. Nii tegime edukas funktsioon kõne. Võite käivitada uuesti funktsiooni, negatiivne 10, 17 summa negatiivsed 10 ja 17 on 7. See funktsioon töötab. See on käitumise et me ootame seda. Ja nii me oleme teinud eduka Funktsiooni definitsioon, deklaratsioon, ja edukas funktsioon kõne. Paar mitmesugused punktid Funktsioone enne kui me sõlmida käesoleva paragrahvi. Meenuta meie arutelu andmetüüpe varem, et funktsioonid Vahel võib võtta sisendeid. Kui see on nii, siis tunnistada funktsiooni kellel on tühine argument nimekirja. Kas te mäletate, milline Kõige tavalisem funktsioon oleme näinud nii kaugele, et võtab tühine argument nimekiri on? See on peamine. Meenuta ka seda, et funktsiooni vahel tegelikult ei ole väljund. Sellisel juhul me kuulutame funktsiooni kellel on tühine tagastamise tüübist. Olgem Selle osa lõpetuseks tegeleda tava probleem. Nii et siin on probleem sätestatud. Ma tahan, et sa kirjutada funktsiooni nimetatakse kehtib kolmnurk. Mida see funktsioon peaks tegema on võtta kolm reaalarvud mis esindavad pikkustest kolme pool kolmnurga kui selle parameetrid, või tema argumendid, või selle inputs-- veel mõni sünonüümid et võite sattuda. See funktsioon peaks kas toodangu õige või vale sõltuvalt sellest, kas need kolm pikkust on võimeline tegema kolmnurk. Kas sa mäletad andmete tüüp, mis me tähistamiseks kasutatakse õige või vale? Nüüd, kuidas sa ellu seda? Noh tea seal on paar eeskirjade kohta kolmnurgad mis on tegelikult kasulik teada. Kolmnurk võib olla ainult küljelt positiivne pikkus. See on mõtet. Sa oled ilmselt öelda, duh. Teine asi on tähele panna kuigi see, et summa pikkuste tahes kahe kolmnurga küljed peab olema suurem kui pikkus kolmas külg. See on tegelikult tõsi. Sa ei saa kolmnurga külgede 1 2 ja 4, näiteks seetõttu, et 1 pluss 2 ei ole suurem kui 4. Nii et need on reeglid, mis kindlaks, kas kolme sisendeid saab kuuluda moodustavad kolmnurga. Nii, et võta paar minutit ja kuulutada ja siis määratleda Seda funktsiooni nimetatakse kehtiv kolmnurga, näiteks see, et tegelikult on käitumine, mille siin. See tulemus on tõsi, kui need kolm külge suudavad sisaldab kolmnurga ja vale teisiti Valmis näha, kuidas sa seda tegid? Siin on üks rakendamine kehtivate kolmnurk. See ei ole ainus. Sinu võivad veidi erineda. Aga see üks teeb, tegelikult on käitumine, mida me ootame. Me kinnitame, et oleme funktsiooni juures väga top, bool kehtib kolmnurk float x float y float z. Nii jälle, see funktsioon võtab kolm reaalarvud kui tema argumendid, ujuv Punkti väärtus muutujad, ja väljastab õige või vale väärtus, mis on Boole'i, meenutada. Nii et miks tagastamise tüüp on bool. Siis me defineerime funktsiooni. Esimene asi, mida me teeme, on veenduge, et kõik küljed on positiivne. Kui x on väiksem või võrdne 0 või kui y on võrdne 0, või kui z on väiksem või võrdne 0, et ei saa olla kolmnurk. Neil ei ole positiivseid külgi. Ja nii me saame tagasi vale selles olukorras. Edasi me veenduge et iga paari sisendite on suurem kui kolmanda. Nii et kui x pluss y on väiksem kui või võrdne z, või kui x pluss z on vähem kui või võrdne y, või kui y plus z on väiksem või võrdne x, et ei saa ka olema kehtiv kolmnurk. Nii me tagasi false uuesti. Eeldades, me möödunud nii kontrollide kuigi, siis saame naasta tõsi. Kuna need kolm külge on võimeline returning-- luua kehtib kolmnurk. Ja see ongi kõik. Sa oled nüüd tunnistatud ja defineeritud. Ja siis võib olla võimalik, et nüüd kasutada ja nimetame seda funktsiooni. Hea töö. Ma olen Doug Lloyd. See on CS50.