DOUG LLOYD: Alle reg. So nou, laat ons 'n pak baie groot onderwerp, funksies. Tot dusver in die kursus, het al die programme wat ons het is skryf is geskryf binnekant van hoof. Hulle is redelik eenvoudige programme. Jy hoef nie al hierdie dinge het takke en dinge aan die gang. Ons kan net pas dit alles binnekant van die belangrikste en dit raak nie vreeslik oorweldigend. Maar as die kursus gaan op en as jy begin om programme te ontwikkel onafhanklik, is hulle waarskynlik gaan om te begin om 'n baie meer as 10 kry of 15 lyne. Jy kan honderde of duisende kry of tienduisende reëls van die kode. En dit is regtig nie wat gek 'n gedagte. As sodanig, is dit waarskynlik nie 'n goeie idee om alles binne belangrikste hou. Dit kan 'n bietjie moeilik om te vind wat jy soek as jy dit doen. Gelukkig, hoewel C, en pretty much elke ander taal wat dalk met werk, kan ons funksies te skryf. En ek is net gaan om te neem 'n vinnige opsy hier om te noem dat funksies is een gebied van rekenaarwetenskap is. En jy sal baie meer van hulle by te sien verskeie punte deur die loop en as jy aanhou om op. Waar daar is 'n baie sinonieme vir dieselfde woord. So noem ons die funksies. Maar jy kan dit ook hoor verwys as prosedures, of metodes, veral as jy al ooit gedoen enige objekgeoriënteerde programmering before-- en moenie bekommerd wees nie as jy nie het nie, nie 'n groot deal-- maar in oudit-georiënteerde tale is dikwels genoem metodes. Soms is hulle subroetines genoem. Maar hulle het regtig al verwys om dieselfde basiese idee. Kom ons kyk wat die idee is. Wat is 'n funksie? Wel 'n funksie is regtig niks meer as 'n swart boks. 'N Swart boks wat 'n stel van nul het of meer insette en 'n enkele uitset. So byvoorbeeld, is hierdie kan 'n funksie wees. Dit is 'n funksie genoem funk. En dit neem drie insette a, b, c en. En binne dat swart boks, ons weet nie presies wat dit doen, maar dit verwerk die insette in een of ander manier en dan is dit gee 'n enkele uitset, in hierdie geval, z. Nou om dit 'n bietjie te maak minder abstrakte, ons kan dalk sê dat ons 'n funksie genoem byvoeg dat neem drie insette a, b, en c en verwerk die uitset in een of ander manier binne-in die swart blokkie om produseer 'n enkele uitset. So in hierdie geval, indien voeg neem 3, 6 en 7. Iewers in die voeg funksie, sou ons hulle verwag om bymekaar getel om die uitset produseer wat 3 plus 6 plus 7 of 16. Net so, jy 'n funksie genoem het mult dat twee insette, A en B neem, prosesse hulle in een of ander manier soos dat die uitset van die funksie is die produk van die twee insette. Die twee insette vermenigvuldig saam. 4 en 5 word oorgegaan in mult, iets gebeur, sal die uitset ons verwag is 20. Hoekom moet ons noem dit 'n swart boks? Wel, as ons nie die skryf van die funksioneer onsself, wat ons gedoen het nogal 'n bietjie so ver cs50. Ons het druk f gesien, byvoorbeeld, wat is 'n funksie wat ons nie skryf onsself, maar ons gebruik al die tyd. As ons nie skryf die funksies onsself, Ons het nie regtig nodig het om te weet hoe dit is eintlik geïmplementeer onder die enjinkap. So byvoorbeeld die swart blokkie ek net gewys vir vermenigvuldiging, mult a, b kon wees defined-- en dit is net sommige pseudocode-- kan wees gedefinieer as uitset n keer b. Dit maak sin, reg. As ons 'n funksie genoem mult dat twee insette neem. Ons sou verwag dat die uitset wees die twee insette vermenigvuldig saam 'n keer b. Maar mult kan ook geïmplementeer soos hierdie, ons het 'n toonbank veranderlike kry stel binnekant van mult tot 0. En dan hierdie proses herhaal ons b keer voeg 'n counter. Byvoorbeeld, as ons vermenigvuldig 3a deur 5b, kan ons counter sê ingestel om 0, herhaal vyf keer, voeg 3 tot toonbank. So het ons begin by 0 en dan doen ons hierdie vyf keer 3, 6, 9, 12, 15. Dit is dieselfde resultaat. Ons nog steeds 3 keer 5 net die implementering is anders. Dit is wat ons bedoel wanneer ons sê 'n swart boks. Dit beteken net dat ons nie regtig omgee hoe dit geïmplementeer onder die enjinkap so lank as wat die opbrengs is wat ons verwag. In werklikheid, dit is deel van die kontrak van die gebruik van funksies, veral funksies wat ander skryf. Die gedrag is altyd iets tipiese, onvoorspelbaar gebaseer op die naam van die funksie. En dit is die rede waarom dit is regtig belangrik wanneer jy skryf funksies of wanneer ander mense skryf funksies wat jy kan gebruik, dat diegene funksies duidelik, relatief duidelik name, en is goed gedokumenteer. Wat is beslis die geval vir funksie soos gedrukte f. So hoekom gebruik ons ​​funksies? Goed soos ek vroeër gesê het, as ons skryf almal van ons kode binnekant van die belangrikste dinge kan kry regtig swaar en ingewikkeld. Funksies toelaat dat ons die vermoë om dinge te organiseer en breek 'n baie ingewikkelde probleem in 'n baie meer hanteerbaar sub dele. Funksies ook vir ons laat die kodering proses te vereenvoudig. Dit is 'n baie makliker om te ontfout 'n 10 lynfunksie teenoor 'n 100 lyn funksie of 'n 1000 lynfunksie. As ons net vir debug klein stukkies op 'n tyd, of skryf klein stukkies op die oomblik, dit maak dat programming ervaring 'n baie beter. Glo my op daardie een. Laastens, as ons skryf funksies wat ons kan diegene verskeie dele hergebruik. Funksies herwin kan word. Hulle kan gebruik word in program of 'n ander. Jy het alreeds geskryf die funksie, al wat jy hoef te doen is vertel dat program waar om daardie funksie te vind. Ons het al met behulp van die herwinning en druk f vir meer as 40 jaar. Maar dit was eers geskryf een keer. Baie handig, reg. Alles reg. So funksies is groot. Ons weet dat. Nou laat begin skryf het. Kom ons begin om hulle in ons programme. Ten einde dit te doen, is die eerste ding wat ons doen, is verklaar dat die funksie. Wanneer jy 'n funksie te verklaar wat jy basies doen vertel die samesteller, hey, net sodat jy weet, Ek gaan skryf 'n funksie later en hier is wat dit gaan lyk. Die rede hiervoor is omdat opstellers kan doen snaakse dinge as hulle sien 'n stel van simbole dat hulle nie vertroud is met. Sodat ons net gee die samesteller n hoof van, ek skep 'n funksie en dit gaan om dit te doen. Funksie verklarings algemeen as jy organiseer jou kode in 'n manier dat ander sal in staat wees verstaan ​​en gebruik maak van, jy in die algemeen wil al sit van jou funksie verklarings op die top van jou kode, reg voordat jy begin skryf belangrikste selfs. En gerieflik, daar is 'n baie standaard vorm dat elke funksie verklaring volg. Hulle het almal pretty much lyk. Daar is drie dele om 'n funksie verklaring, tik terugkeer, naam, en argument lys. Nou is die soort opbrengs is watter soort veranderlike die funksie wil uitset. So byvoorbeeld, as ons dink terug 'n minute gelede aan die vermenigvuldiging twee getalle funksie, wat ons verwag as vermenigvuldig ons 'n heelgetal is deur 'n heelgetal die uitset sal wees waarskynlik 'n heelgetal is, reg. Vermenigvuldig twee heelgetalle saam, jy kry 'n heelgetal. So die terugkeer tipe wat funksie sou wees int. Naam is wat jy wil hê om jou funksie noem. Dit is waarskynlik die minste belangrik deel van die funksie verklaring in terme van funksionaliteit. Maar eintlik is waarskynlik een van die belangrikste dele van die verklaring funksie in terme weet wat die funksie eintlik doen nie. As jy die naam van jou funksie f of g of h of geheim of iets soos dit, gaan jy waarskynlik te kry 'n bietjie gepootjie probeer om te onthou wat die funksies te doen. So dit is belangrik om te gee jou betekenisvolle name funksie se. Laastens, argument lys is die kommas geskei lys van al die insette om jou funksie, elkeen het 'n tipe en 'n naam. So nie net wat jy hoef te spesifiseer watter tipe veranderlike die funksie wil uitvoer, jy ook wil om te spesifiseer watter tipe en tipes veranderlikes die funksie word aanvaar as insette. So kom ons doen 'n voorbeeld hier. Laat ons net 'n blik op 'n meer konkrete een. So hier is 'n voorbeeld van 'n funksie verklaring vir 'n funksie wat sou twee heelgetalle saam te voeg. Die som van twee heelgetalle gaan 'n heelgetal sowel as ons maar net bespreek. En so het die tipe terugkeer, hier in groen, sou int wees. Wat net vertel ons dat twee SY voeg gaan aan die einde van die dag, uitset, of spoeg dit terug uit na ons, 'n heelgetal. Gegee wat hierdie funksie te doen wat ons wil gee dit 'n betekenisvolle naam. Voeg twee SY lyk toepaslik, oorweeg ons neem twee heelgetalle as insette en hopelik hulle saam te voeg. Dit mag dalk 'n bietjie van 'n lomp wees naam en eerlik hierdie funksie is waarskynlik nie nodig want ons het die toevoeging operateur, as jy onthou van ons bespreking van operateurs, voorheen. Maar laat ons net sê ter wille van argument dat hierdie funksie is nuttig en so sal ons noem dit voeg twee SY. Laastens, die funksie neem twee insette. Wat elk 'n heelgetal is. So ons het hierdie komma geskeide lys van insette. Nou algemeen wil ons gee 'n naam aan elkeen van hulle sodat dit gebruik kan word binne die funksie. Die name is nie baie belangrik. In hierdie geval, ons doen nie noodwendig enige betekenis geheg aan hulle. So kan ons net noem hulle a en b. Dit is heeltemal fyn. As jy egter, sal jy vind jouself in 'n situasie waar die name van die veranderlikes kan eintlik belangrik wees, jy dalk wil om dit te noem iets anders as a en b hulle iets meer om te gee simbolies betekenisvol. Maar in hierdie geval, het ons nie regtig weet niks anders oor die funksie. Ons wil net twee heelgetalle te voeg. So ons sal net noem diegene heelgetalle a en b. Dit is een voorbeeld. Hoekom het jy nie 'n tweede neem na te dink oor hierdie een, hoe sou jy 'n funksie te skryf verklaring vir 'n funksie wat vermeerder twee drywende punt getalle? Onthou jy wat 'n drywende punt nommer is? Wat sou hierdie funksie verklaring lyk? Ek het eintlik aanbeveel jy breek die video hier en neem hoeveel tyd jy nodig het. Dink oor wat hierdie funksie verklaring sou wees? Wat sou die soort terugkeer? Wat sou 'n betekenisvolle naam? Wat sou die insette wees? So hoekom doen jy nie die video hier breek en skryf-up 'n funksie verklaring vir 'n funksie wat jou sal vermeerder twee swaai getalle punt saam. Hopelik sal jy die video gestop. So laat ons neem 'n blik op 'n voorbeeld van een moontlike verklaring. Dryf mult twee reals dryf x, y float. Die produk van twee drywende punt getalle, wat onthou is hoe ons verteenwoordig reële getalle of getalle met desimale waardes in c, gaan 'n drywende punt getal wees. Wanneer jy vermenigvuldig n desimale deur 'n desimale, gaan jy waarskynlik 'n desimale kry. Jy wil om dit 'n toepaslike naam. Vermenigvuldig twee reals lyk goed. Maar jy kan regtig noem dit mult twee dryf, of mult dryf. Iets soos dit, solank dit het 'n paar werklike betekenis aan wat hierdie swart box gaan doen. En weer, in hierdie geval, ons doen nie lyk enige betekenis geheg aan het om die name van die veranderlikes ons verby in, sodat ons net noem hulle x en y. Nou as jy hulle iets roep anders, dit is heeltemal fyn. In werklikheid, as jy het hierdie verklaring plaas met behulp van die dubbelspel plaas van dryf, as jy onthou dat die dubbelspel is 'n ander manier om meer presies spesifiseer reële getalle of drywende punt veranderlikes. Dit is te heeltemal fyn. Óf een van daardie sal goed wees. In werklikheid, daar is verskeie verskillende kombinasies maniere om hierdie funksie te verklaar. Maar dit is twee baie goeie kinders. Ons het 'n funksie verklaar, dit is 'n groot. Ons het die samesteller wat dit vertel is, wat ons gaan doen. Nou laat eintlik skryf daardie funksie. Kom ons gee dit 'n definisie, sodat die binnekant van die black box voorspelbare gedrag gebeur. In werklikheid, is ons twee reële vermenigvuldig getalle bymekaar, of by te voeg getalle saam of doen wat dit ookal is dat ons gevra ons funksie om te doen. So in werklikheid, laat ons probeer en definieer vermenigvuldig twee reals wat ons nou net gepraat oor 'n tweede gelede. Nou is die begin van 'n funksie definisie lyk amper presies dieselfde as 'n funksie verklaring. Ek het beide van hulle hier. Op die top is die funksie verklaring tipe, naam, kommas geskei argument lys, kommapunt. Die kommapunt dui daarop dat dit is 'n funksie verklaring. Die begin van die funksie definisie lyk byna presies dieselfde, tipe, naam, kommas geskei argument lys nie kommapunt, oop krullerige brace. Die oop krullerige brace, net soos ons het al te doen met die hoof, beteken dat ons nou besig om te definieer wat gebeur binne-in die swart blokkie wat Ons het besluit om mult twee reals noem. Hier is 'n manier om dit te implementeer. Ons kan sê, kan ons 'n nuwe verklaar veranderlike van tipe float genoem produk en wys dat veranderlike om die waarde x keer y. En dan terug produk. Wat beteken terugkeer beteken hier. Wel terugkeer is die pad dui ons dit is hoe ons verby die uitset terug uit. So iets terug te keer, is dieselfde as, dit is die opbrengs van die swart boks. So dit is hoe jy dit doen. Hier is 'n ander manier om dit te implementeer. Ons kon net terug x keer y. x is 'n float. y is 'n float. So x keer y is ook 'n float. Ons het nie eens nodig om skep 'n ander veranderlike. So dit is 'n ander manier om implementeer presies dieselfde swart boks. Nou neem 'n oomblik, die video weer breek, en probeer definieer voeg twee SY, wat is die ander funksie wat ons gepraat oor 'n oomblik gelede. Weer hier, het ek die funksie het verklaring, en so die kommapunt, en 'n oop krullerige brace en 'n geslote krullerige stut om aan te dui waar ons sal vul in die inhoud van voeg twee SY, sodat ons definieer die besonder gedrag in die swart boks. So breek die video. En neem soveel tyd as wat jy nodig het om te probeer en te definieer 'n uitvoering van voeg twee SY, soos dat wanneer die funksie uitgange 'n waarde dit doen nie, in werklikheid, terugkeer die som van die twee insette. So, net soos die vorige voorbeeld, daar is verskillende maniere wat jy kan implementeer voeg twee SY. Hier is een. In hier in oranje het ek net het 'n paar comments-- Ek het net 'n paar bygevoeg kommentaar aan te dui wat gebeur op elke lyn van die kode. So verklaar ek 'n veranderlike genoem som van tipe int. Ek sê som gelyk aan 'n plus b. Dit is waar ons eintlik doen die werk te voeg A en B saam. En ek som terugkeer. En dit maak sin omdat som is 'n veranderlike van tipe int. En wat is die data tik dat hierdie funksie vertel my dit gaan uitvoer? Int. So ek terugkeer som, wat 'n heelgetal veranderlike. En dit maak sin gegee wat ons het verklaar en ons funksie gedefinieer te doen. Nou kan jy ook definieer die funksie op hierdie manier, int som gelyk aan 'n plus-b slaan dat eerste step-- en dan terug te keer som. Nou kan jy ook geïmplementeer dit op hierdie manier, wat ek hoogs beveel nie. Dit is sleg vir 'n styl ding en regtig 'n slegte ontwerp, maar dit doen nie, in werklikheid, die werk. As jy hierdie kode, wat int neem voeg slegte adder dot c, en dit gebruik. Dit beteken eintlik voeg twee heelgetalle saam. Dit is 'n baie swak implementering van hierdie spesifieke gedrag. Maar dit werk nie. Dit is net hier om te illustreer die punt dat ons nie regtig omgee wat gebeur binne- die swart boks, solank want dit het die uitset wat ons verwag. Dit is 'n swak ontwerp black box. Maar aan die einde van die dag, is dit nie steeds uitset die som van 'n plus b. Alles reg. So het ons funksies verklaar. En ons het gedefinieerde funksie. So dit is regtig 'n goeie. Nou laat ons begin om die funksies te gebruik dat ons verklaar het en ons het gedefinieer. Om 'n function-- dit is eintlik noem mooi easy-- al wat jy hoef te doen is dit slaag toepaslike argumente, argumente van die tipe data dat dit verwag, en dan is die terugkeer toewys waarde van daardie funksie en this-- verskoning me-- toewys die terugkeer waarde van daardie funksie om iets van die korrekte tipe. So laat ons 'n blik op in die praktyk in 'n lêer genoem adder 1 dot c, wat Ek het in my cs50 IDE. So hier is adder 1 dot c. Aan die begin jy sien ek my sluit, pond sluit, standaard IO en cs50 dot h. En dan het ek my funksie verklaring. Dit is hier waar ek is vertel die samesteller Ek is gaan skryf van 'n funksie genoem voeg twee SY. Dit gaan 'n uitset heelgetal tipe veranderlike. Dit is wat hierdie deel is reg hier. En dan het ek twee insette om dit 'n en b, wat elk 'n heelgetal is. Binnekant van hoof, vra ek die gebruiker insette deur te sê, gee my 'n heelgetal. En hulle word gevra om te vergeet int, wat is 'n funksie wat is ingesluit in die cs50 biblioteek. En wat kry gestoor in x, 'n heelgetal veranderlike. Hulle dan gevra ons vir 'n ander heelgetal. Ons kry 'n ander heelgetal en bêre dit in y. En dan, hier op die lyn 28, is waar ons ons funksie oproep. Ons sê, int z gelykes voeg 2 x SY komma y. Het jy sien waarom dit maak sin? x is 'n soort heelgetalveranderlike en y is 'n soort heelgetalveranderlike. So dit is goed. Dit sin maak met wat ons funksie verklaring op die lyn 17 lyk. Die kommas geskei lys insette verwag twee heelgetalle, a en b. In daardie geval, kan ons noem hulle wat ons wil. Hy verwag net twee heelgetalle. En x 'n heelgetal is en y 'n heelgetal is. Wat werk. En ons weet dat funksie gaan uitset n heelgetalle as well. En so is ons die stoor van die uitset van die funksie, voeg twee SY, in 'n soort heelgetal veranderlike, wat ons roeping z. En dan kan ons sê, die som van persent i en persent i is persent i. onderskeidelik x, y en z vul die persent i se. Wat is die definisie van voeg twee SY lyk? Dit is redelik eenvoudig. Dit is een van die mense wat ons net gesien 'n tweede gelede int som gelyk aan 'n plus b terugkeer som. Werk dit? Kom ons stoor die lêer. En dan af hier op my terminale Ek gaan adder 1 maak, en ek skoon my skerm. Ek gaan om te vergroot, want ek weet dit is 'n bietjie moeilik om te sien. Sodat ons hierdie program as adder 1 stel. So kan ons dot streep adder 1 doen nie. Gee my 'n heelgetal, 10. Gee my 'n ander heelgetal, 20. Die som van 10 en 20 is 30. So het ons 'n suksesvolle funksie oproep. Jy kan die funksie weer uit te voer, negatiewe 10, 17 som van negatiewe 10 en 17 is 7. Hierdie funksie werk. Dit het die gedrag dat ons verwag dat dit. En so het ons 'n suksesvolle gemaak funksie, definisie, verklaring, en 'n suksesvolle funksie oproep. Paar diverse punte oor funksies voordat ons sluit hierdie afdeling. Onthou van ons bespreking van tipes data, voorheen, wat funksioneer kan soms nie insette te neem. As dit die geval is, is ons verklaar dat die funksie as 'n leemte argument lys. Het jy onthou wat die mees algemene funksie ons het so ver dat neem gesien 'n leemte argument lys is? Dit is die hoof. Onthou ook dat funksie soms nie eintlik 'n uitset. In daardie geval, ons verklaar die funksie as 'n soort leemte terugkeer. Kom ons sluit hierdie artikel deur aanpak van 'n praktyk probleem. So hier is die uitgelê probleem. Ek wil hê jy moet 'n funksie te skryf genoem geldig driehoek. Wat hierdie funksie moet doen is neem drie reële getalle wat verteenwoordig die lengtes van die drie kante van 'n driehoek as sy parameters, of sy argumente, of sy inputs-- ander stel sinonieme dat jy kan teëkom. Hierdie funksie moet óf uitset waar of vals afhangende van of die drie lengtes in staat is om die maak van 'n driehoek. Onthou jy die tipe data wat ons gebruik om aan te dui waar of vals? Nou hoe doen jy dit te implementeer? Wel weet daar is 'n paar reëls rakende driehoeke wat eintlik nuttig om te weet. 'N Driehoek kan slegs kante met positiewe lengte. Dit maak sin. Jy is waarskynlik sê, duh. Die ander ding om daarop te let al is, is dat die som van die lengtes van enige twee kante van die driehoek moet groter as die wees lengte van die derde sy. Dit is eintlik waar. Jy kan nie 'n driehoek van kante 1, 2 en 4, byvoorbeeld, omdat 1 plus 2 is nie groter as 4. So dit is die reëls wat bepaal of die drie insette kan verstaanbaar vorm 'n driehoek. So neem 'n paar minute en verklaar en dan definieer hierdie funksie genoem geldig driehoek, soos dat dit eintlik het die hier gespesifiseer gedrag. Dit sal uitloop waar as die drie kante in staat is om uit 'n driehoek, en valse anders Gereed om te sien hoe jy gedoen het? Hier is een implementering geldige driehoek. Dit is nie die enigste een. Joune dalk effens verskil. Maar hierdie een nie, in werklikheid, het die gedrag wat ons verwag. Verklaar ons ons funksie by die heel boonste, Bool geldig driehoek dryf x float y float z. So weer, hierdie funksie neem drie reële getalle as sy argumente, swaai punt waarde veranderlikes, en uitgange 'n ware of vals waarde, wat 'n Boole, onthou. So dit is waarom die tipe opbrengs Bool. Dan is die funksie definieer ons. Eerste ding wat ons doen, is om seker te dat al die kante is positief. As x is minder as of gelyk 0, of indien y is gelyk aan 0, of as z minder as of gelyk aan 0, dit kan nie moontlik 'n driehoek. Hulle het nie 'n positiewe kante. En so kan ons terugkeer valse in daardie situasie. Volgende, gaan ons om seker te maak dat elke paar insette is groter as die derde een. So as x plus y minder as of gelyk aan Z, of indien x plus z minder as of gelyk aan y, of as y plus z minder as of gelyk aan x, wat ook nie 'n geldige driehoek. So het ons weer terug onwaar. Veronderstelling ons albei van die tjeks geslaag al is, dan kan ons ware terugkeer. Omdat die drie kante in staat is om returning-- van die skep van 'n geldige driehoek. En dit is dit. Jy het nou verklaar en omskryf word. En jy kan nou in staat wees om gebruik en noem hierdie funksie. Goeie werk. Ek is Doug Lloyd. Dit is cs50.