DOUG LLOYD: Bine. Deci, acum să abordeze o subiect foarte mare, funcții. Până în prezent în curs, toate programe pe care le-am scris S-au scris în interiorul principal. Sunt programe destul de simplu. Nu aveți nevoie pentru a avea toate acestea sucursale și lucrurile se întâmplă. Putem toate potrivi doar interior de principal și nu se teribil de copleșitoare. Dar, așa cum cursul merge mai departe și pe măsură ce începe să dezvolte programe independent, ei, probabil, va pentru a începe pentru a obține o mult mai mult de 10 sau 15 linii. S-ar putea obține sute sau mii sau zeci de mii de linii de cod. Și nu e chiar că un gând nebun. Ca atare, probabil că nu este o idee bună de a păstra totul în interiorul principal. Se poate obține un pic dificil de a găsi ceea ce căutați dacă faci asta. Din fericire, deși C, și destul de mult orice altă limbaj de programare care s-ar putea lucra cu, permite ne să scrie funcții. Și eu doar de gând să să ia o rapid deoparte aici să menționez că funcții este o zonă de informatică. Și veți vedea mai multe dintre ele la diverse puncte pe parcursul cursului și dacă veți continua pe. În cazul în care există o mulțime de sinonime pentru același cuvânt. Deci, noi numim funcțiile. Dar s-ar putea, de asemenea, le auzi denumite proceduri, sau metode, în special, dacă ați vreodată face orice de programare orientat obiect before-- și nu vă faceți griji dacă nu ai, nu un mare, dar în deal-- limbi orientate audit sunt frecvent numite metode. Uneori, ei numesc subrutine. Dar ei chiar toate se referă la aceeași idee de bază. Să vedem despre ce idee este. Ce este o funcție? Ei bine, o funcție este într-adevăr nimic mai mult decât o cutie neagră. O cutie neagră care are un set la zero de sau mai multe intrări și o singură ieșire. Deci, de exemplu, aceasta ar putea fi o funcție. Aceasta este o funcție numită func. Și este nevoie de trei intrări a, b, c și. Și în interiorul cutie neagră, am nu stiu exact ce face, dar procesează intrările într-un fel și apoi oferă o singură ieșire, în acest caz, z. Acum pentru a face un pic mai puțin abstract, ne-am putea spune că poate ne au o funcție numită adaugă că ia trei intrări a, b, și C și procesează producția într-un fel în interiorul cutiei negre a produce o singură ieșire. Deci, în acest caz, dacă adăugați ia 3, 6, și 7. Undeva în interiorul Funcția adăuga, ne-ar așteptăm ca ei să fie adăugate împreună pentru obținerea rezultatului așteptat, care este de 3 plus 6 plus 7 sau 16. În mod similar, aveți o funcție numită mult care are două intrări, a și b, le prelucrează într-un fel, cum ar că ieșirea funcției este produsul dintre cele două intrări. Cele două intrări înmulțit împreună. 4 și 5 fiind trecut în mult, se întâmplă ceva, de ieșire ne asteptam este 20. De ce o numim o cutie neagră? Ei bine, dacă nu suntem scris funcționează pe noi înșine, care am făcut destul de un pic până în prezent CS50. Am văzut de imprimare f, de exemplu, care este o funcție care nu am scrie noi înșine, dar noi folosim tot timpul. Dacă nu scriem funcțiile noi, nu avem cu adevărat nevoie să știe cum e de fapt, pus în aplicare sub capota. Deci, de exemplu, cutie neagră I doar ți-a arătat pentru multiplicare, mult Cu o, b ar putea fi defined-- și acest lucru este doar unele ar putea fi pseudocode-- definit ca ori de ieșire a b. Care au sens, nu. Dacă avem o funcție numită mult care ia două intrări. Ne-am aștepta ca producția ar Fii două intrări înmulțit împreună, ori și b. Dar ar putea fi, de asemenea, mult implementat ca aceasta, avem o variabilă contor pentru sa stabilit în interiorul mult la 0. Și apoi am repeta acest proces b ori a adăuga un contraatac. De exemplu, dacă am multiplica 3a de 5b, am putea spune stabilit în contradicție cu 0, repeta de cinci ori, se adaugă 3 contraatac. Deci, vom începe de la 0 și apoi vom face asta de cinci ori 3, 6, 9, 12, 15. Este același rezultat. Noi obțineți de 3 ori 5 doar punerea în aplicare este diferit. Asta e ceea ce ne referim atunci când spunem o cutie neagră. Înseamnă doar că nu-mi pasă cu adevărat cum se puse în aplicare sub capota atâta timp cât rezultatul este ceea ce ne așteptăm. De fapt, asta e parte din contract de utilizarea funcțiilor, în special funcții care alții scriu. Comportamentul este întotdeauna o să fie tipic, imprevizibil bazat pe numele funcției. Și de aceea este într-adevăr important atunci când scrie funcții sau atunci când alte persoane a scrie Funcțiile pe care le-ar putea folosi, că aceste funcții au nume clare, relativ evidente, și sunt bine documentate. Care este cu siguranță cazul pentru funcția de imprimare cum ar fi f. Deci, de ce nu folosim funcții? Ei bine, cum am spus mai devreme, dacă vom scrie toate codul nostru interiorul lucruri principale poate obține cu adevărat dificil și într-adevăr complicată. Funcții noi permite capacitatea de a organiza lucrurile și te desparți o problemă foarte complicată în mult piese sub mai ușor de gestionat. Funcții de asemenea ne permite să simplifica procesul de codificare. Este mult mai ușor pentru a depana un 10 Funcția linie comparativ cu o linie de 100 Funcția sau o funcție de 1.000 linie. Dacă avem doar pentru a depana bucăți mici la un moment dat, sau scrie bucăți mici la timp, se face că experiența de programare mult mai bine. Crede-mă pe faptul că unul. În cele din urmă, dacă scriem funcții noi pot reutiliza aceste diferite părți. Funcții pot fi reciclate. Ele pot fi utilizate în un program sau altul. Ai scris deja funcția, tot ce trebuie să faceți este spun că programul în cazul în care pentru a găsi că funcția. Am fost reciclarea și utilizarea imprima f peste 40 de ani. Dar a fost scris doar o singură dată. Destul de util, chiar. In regula. Deci, funcțiile sunt mari. Noi stim aia. Acum să începem le scrie. Să începem obtinerea le în programele noastre. În scopul de a face acest lucru, primul lucru pe care îl facem este să declare funcția. Când declara o functie ceea ce de fapt faci spune compilator, hei, doar ca să știi, Am de gând să fi scris o funcție mai târziu și uite ce se va arata. Motivul pentru aceasta este deoarece compilatoare poate face unele lucruri ciudate, dacă ei văd un set de simboluri că ei nu sunt familiarizați cu. Deci, ne-am da doar compilator A heads-up, creez o funcție și că va face acest lucru. Declarațiile funcțiilor în general dacă te organizarea codul într-un mod că și alții vor putea să înțeleagă și să facă uz de, tu, în general, doriți să puneți toate declarațiilor dumneavoastră funcții la foarte de sus a codului, chiar înainte de a începe scrierea principal chiar. Și convenabil, nu e un formular foarte standard că fiecare declarație funcție urmează. Toate acestea destul de mult arata ca aceasta. Există trei părți la o funcție declarație, tipul de întoarcere, nume, și lista de argumente. Acum tipul de retur este ce fel de variabilă de ieșire funcția va. Deci, de exemplu, dacă ne gândim din nou o minute în urmă pentru a înmulțirea două Funcția numere, ce ne așteptăm, dacă am multiplica un număr întreg de un număr întreg de ieșire va fi probabil un număr întreg, drept. Înmulțit două numere întregi împreună, veți obține un număr întreg. Deci tipul de întoarcere de care Funcția va fi Int. Nume este ceea ce vrei pentru a apela funcția. Aceasta este, probabil, cel mai puțin important parte a declarației funcției, în ceea ce privește funcționalitatea. Dar este, de fapt, probabil, unul dintre cele mai importante părți declarației funcției din punct de vedere de a ști ceea ce de fapt funcția face. Dacă ați denumirea funcției f sau g sau h sau mister sau ceva de genul asta, esti, probabil, mergi la a lua un pic piedică încearcă să-și amintească ceea ce fac aceste funcții. Deci, este important să se acorde dvs. Numele semnificative functiei. În cele din urmă, lista argument este lista separate prin virgula din toate intrările la funcția, fiecare dintre care are un tip și un nume. Deci, nu numai că trebuie să specifica ce tip de variabilă de ieșire funcția de voință, Puteți, de asemenea doriți să specificați Ce tip și tipuri de variabile de Funcția va fi accepta ca intrări. Deci, hai sa facem un exemplu aici. Să ia doar o privire la una mai concretă. Deci, aici e un exemplu de funcție declarație pentru o funcție care ar adăuga două numere întregi împreună. Suma de două numere întregi este de gând să fie un număr întreg, precum și, după cum tocmai am discutat. Și astfel de tip de retur, aici în verde, ar fi Int. Că doar noi care se adaugă două int spune va, la sfârșitul zilei, ieșire, sau scuipat înapoi la noi, un număr întreg. Având în vedere ceea ce această funcție nu am doresc să-i dea un nume semnificativ. Se adaugă două int pare este cazul, având în vedere luăm două numere întregi ca intrări și, sperăm, adăugându-le împreună. Ar putea fi un pic de un greoaie Numele și sincer această funcție probabil nu este necesară deoarece avem adăugarea Operatorul, dacă vă amintiți de la noastre discuție de operatori, în prealabil. Dar să spunem doar de dragul de argument că această funcție este utilă și așa vom suna adauga doua int. În cele din urmă, această funcție are două intrări. Fiecare dintre acestea fiind un număr întreg. Deci, avem acest virgula lista separata de intrări. Acum vrem general da un nume pentru fiecare dintre ele astfel încât să poată fi utilizate în funcția. Numele nu sunt teribil de importante. În acest caz, nu avem neapărat au nici un sens care le sunt atașate. Astfel încât să le putem numi doar a și b. Asta e cu totul în regulă. Dacă totuși, veți găsi te într-o situație unde numele variabilelor ar putea fi de fapt de important, ați putea dori să le numim altceva decât o și b pentru a le da ceva mai mult simbolic semnificativ. Dar, în acest caz, noi nu prea știu nimic altceva despre funcția. Vrem doar să adăugați două numere întregi. Asa ca vom suna doar cei întregii a si b. Asta e un exemplu. De ce nu iei un al doilea să se gândească la asta, cum ați scrie o funcție declarație pentru o funcție care multiplica două numere în virgulă mobilă? Îți amintești ce o Numărul virgulă mobilă este? Ce ar fi această funcție declarație arata ca? De fapt, am recomandăm să vă întrerupe clipul video aici și să ia cât de mult timp ai nevoie. Gândiți-vă la ceea ce acest Declarația funcție ar fi? Care ar fi tipul de retur? Ceea ce ar fi un nume semnificativ? Care ar fi intrările? Deci, de ce nu te întrerupe clipul video aici și scrie-o declarație funcție pentru o funcție care ar multiplica două numere în virgulă mobilă împreună. Sperăm că ați întrerupt video. Deci, haideți să aruncăm o privire la un exemplu de o declarație posibil. Float Mult două reali float x, y float. Produsul a doua Numerele în virgulă mobilă, care amintesc cum ne sunt reprezintă numere reale sau numere cu valori zecimale în C, va fi un număr în virgulă mobilă. Când multiplica un zecimal de un zecimal, esti, probabil, mergi la a lua o zecimală. Vrei să-i dea un nume relevant. Multiplica două reali pare bine. Dar ai putea chiar numi Mult două flotoare, sau flotoare. Mult Ceva de genul asta, atâta timp cât a dat o semnificație reală pentru ceea ce această casetă neagră a fost de gând să facă. Și din nou, în acest caz, nu avem par să aibă nici un sens atașat pentru Numele variabile ne trec în, așa că doar le numim x și y. Acum, dacă le numim ceva altceva, asta e cu totul în regulă. De fapt, dacă ai făcut această declarație în schimb folosind dublu schimb de pluteste, dacă vă amintiți care dubleaza sunt un alt mod de a mai precis specificați numere reale sau variabile în virgulă mobilă. Asta e cu totul prea bine. Oricare dintre acestea ar fi bine. De fapt, există mai multe diferite combinații de moduri de a declara această funcție. Dar acestea sunt două cele destul de bune. Am declarat-o funcție, asta e minunat. Am spus ceea ce compilator este, ce vom face. Acum, haideți să scrie de fapt această funcție. Să dau o definiție, astfel că în interiorul cutiei negre Comportamentul previzibil se întâmplă. De fapt, noi suntem înmulțirea două reale numere împreună, sau numere adăugarea împreună, sau de a face orice este că am cerut funcția noastră de a face. Deci, în fapt, să încercăm și să definească multiplica două reali pe care ne-am a vorbit despre acum o secundă. Acum începutul definiția unei funcții arata aproape exact la fel ca o declarație funcție. Am amândoi aici. In partea de sus este declarația funcție, tip, nume, separate prin virgulă argument lista, punct și virgulă. Punct și virgulă indică faptul că că este o declarație funcție. La începutul funcției definiție arată aproape exact la fel, tip, nume, separate prin virgulă Lista argument, nici virgulă, deschide bretele buclat. Bretele buclat deschis, la fel ca ne-am făcut cu principalul, înseamnă că noi suntem acum încep să definească ceea ce se întâmplă în interiorul cutiei negre care ne-am decis pentru a apela Mult două reali. Aici este o modalitate de a pune în aplicare. Am putea spune, am putea declara o noua variabilă de float numit tip de produs și să alocați acea variabilă la valoarea x ori y. Și apoi să se întoarcă de produs. Ce se întoarce înseamnă aici. Ei bine, este modul de returnare Menționăm că este modul în care ne trece de ieșire înapoi. Deci se întoarcă ceva, este la fel ca, acest lucru este de ieșire din cutia neagră. Deci, asta e cum o faci. Aici e un alt mod de a pune în aplicare. Am putea reveni doar x ori y. x este un float. y este un float. Deci X ori Y este, de asemenea, un float. Nici măcar nu trebuie să creați o altă variabilă. Deci asta e un alt mod de a punerea în aplicare a exact același cutia neagră. Acum, ia un moment, întrerupe din nou video, și să încerce și să definească adaugă două int, care este altă funcție pe care le a vorbit despre un moment în urmă. Din nou aici, am pus funcția declarație, și așa mai departe punct și virgulă, și o bretele cret deschis și un buclat închis bretele pentru a indica unde vom umple în conținutul adaugă două int, astfel încât să putem defini particular Comportamentul în interiorul casetei negre. Deci întrerupe videoclipul. Și să ia cât mai mult timp aveți nevoie pentru a încerca și să definească o punere în aplicare a adăuga două int, cum ar că atunci când funcția ieșiri o valoare, o face, de fapt, întoarcerea suma celor două intrări. Deci, la fel ca exemplul anterior, există mai multe moduri diferite care le-ar putea implementa adăuga două int. Uite unul. Aici în portocaliu Am doar avut unele comments-- Tocmai am adăugat niște comentarii pentru a indica ceea ce se întâmplă pe fiecare linie de cod. Așa că am declara o variabilă numita sumă de tip int. Eu spun suma este egală cu un plus b. Asta în cazul în ne facem de fapt lucrarea adăugarea a și b împreună. Și mă întorc suma. Și care are sens, deoarece sumă este o variabilă de tip int. Și ce e tipului de date care acest Funcția mi-a spus că va ieșire? Int. Deci, eu întorc sumă, care este o variabilă întreg. Și care are sens având în vedere ce ne-am declarat și definite funcția noastră a face. Acum puteți defini, de asemenea funcția acest fel, Int sumă egală cu un plus B- skip că Primul step-- și apoi, întoarce suma. Acum ai putea avea, de asemenea implementat-o ​​în acest fel, pe care eu nu recomand foarte. Acesta este stilul rău pentru un lucru și design foarte rău, dar nu, de fapt, locul de muncă. Dacă luați acest cod, care este Int adauga rău vipera punct C, și să-l utilizați. De fapt nu adăuga două numere întregi împreună. Este o implementare foarte slabă din acest comportament special. Dar nu funcționează. E doar aici pentru a ilustra în punctul în care noi nu într-adevăr ceea ce se întâmplă în interiorul îngrijire cutia neagră, atâta timp deoarece are ieșire pe care ne așteptăm. Aceasta este o cutie neagră prost concepute. Dar, la sfârșitul zilei, o face ieșire încă suma un plus b. In regula. Deci ne-am declarat funcții. Și am funcție definită. Așa că e foarte bun. Acum să începem să utilizați funcțiile care le-am declarat și am definit. Pentru a apela un function-- este de fapt destul de easy-- tot ce trebuie să faci este să-l dați argumente adecvate, argumente ale tipului de date că se așteaptă, și apoi atribuiți revenirea Valoarea acestei funcții și astea-- scuză mine-- atribui valoarea returnată de această funcție la ceva de tipul corect. Deci, haideți să aruncăm o privire la această practică într-un fișier în numit vipera 1 punct c, care Am în IDE mea CS50. Deci, aici este o vipera punct c. La început veți vedea că am mea include, lira includ, standard de IO, și CS50 punct h. Și apoi am declarația funcția mea. Acest lucru este în cazul în care eu sunt spune compilator sunt va fi scris un funcție numită adaugă două int. O să o ieșire variabila de tip întreg. Asta e ceea ce această parte este chiar aici. Și apoi am două intrări pentru a face o și b, fiecare dintre acestea fiind un număr întreg. In interiorul principal, cer utilizatorului pentru intrare prin a spune, da-mi un număr întreg. Și ei se solicită să uite int, care este o funcție care este inclus în biblioteca CS50. Și care devine stocate în X, o variabilă întreg. Apoi le-am cere pentru un alt număr întreg. Ne-am alt număr întreg și se păstrează în care y. Și apoi, aici, pe linia 28, este în cazul în care vom face apelul nostru funcție. Noi spunem, egal z int adauga 2 int x y virgulă. Vedeți de ce acest lucru are sens? X este o variabilă de tip întreg și y este o variabilă de tip întreg. Așa că e bine. Care fac sens cu ceea ce funcția noastră Declarația cu privire la linia de 17 arată. Virgula separa Lista de intrare se așteaptă ca două numere întregi, a si b. În acest caz, putem apela le ce vrem. Doar așteaptă două numere întregi. Și x este un număr întreg și y este un număr întreg. Care funcționează. Și știm că funcția va la ieșire o numere întregi, de asemenea. Și așa suntem depozitarea ieșire a funcției, adaugă două int, într-un tip întreg variabilă, care ne cheamă z. Și atunci putem spune, suma sută la sută i si i este suta i. x, y și z, respectiv completarea celor procente i lui. Care este definiția se adaugă două int arata? E destul de simplu. Este una dintre cele pe care le a văzut doar în urmă cu o secundă, sumă egală cu o sumă Int plus b întoarcere. Face acest lucru? Să salvați fișierul. Si apoi aici pe terminalul meu Am de gând să facă extensie 1, și am clar ecranul meu. Am de gând pentru a mări pentru că știu este un pic dificil de a vedea. Așa că am compila acest program ca vipera 1. Deci, putem face punct slash vipera 1. Dă-mi un număr întreg, 10. Dă-mi un alt număr întreg, 20. Suma de 10 și 20 este 30. Așa că am făcut un apel de funcție de succes. Puteți rula funcția din nou, negativ 10, 17 sumă de negativ 10 și 17 este de 7. Această funcție funcționează. Ea are comportamentul că ne așteptăm să. Și așa am făcut o de succes funcție, definiție, declarație, și un apel de funcție de succes. Cuplu diverse puncte despre funcții înainte de a încheia acest capitol am. Rechemare din nostru discuția de tipuri de date, anterior, care funcționează poate dura uneori nu intrări. Dacă e cazul, am declara funcția ca având o listă argument gol. Îți amintești Ce mai frecvente funcție am văzut până acum, care să ia o listă argument gol este? E principal. Amintiți de asemenea, că, uneori, funcția nu au de fapt o putere. În acest caz, declarăm funcția ca având un tip de întoarcere nule. Să încheie această secțiune de abordarea o problemă practică. Deci, aici e problema prevăzute. Vreau să scrie o funcție numit triunghi valid. Ce ar trebui să facă această funcție este să ia trei numere reale că reprezintă lungimile celor trei laturi ale unui triunghi ca parametrii săi, sau argumentele sale, sau sa inputs-- un alt set de sinonime pe care le-ar putea întâlni. Această funcție ar trebui să fie de ieșire adevărat sau fals în funcție de dacă aceste trei lungimi sunt capabile de a face un triunghi. Îți amintești tipul de date pe care am folosit pentru a indica adevărat sau fals? Acum, cum a face tu a pune în aplicare acest lucru? Ei bine, știu că există un cuplu de reguli privind triunghiuri care sunt de fapt utile. Un triunghi poate avea numai fețe cu lungime pozitiva. Are sens. Esti, probabil, spun, duh. Un alt lucru de remarcat însă, este că suma lungimilor orice două laturi ale triunghiului trebuie să fie mai mare decât Lungimea de a treia latura. Asta e de fapt adevărat. Nu poți avea un triunghi de laturi 1, 2 și 4, de exemplu, pentru că 1 plus 2 nu este mai mare decât 4. Deci, astea sunt regulile pe care stabili dacă cele trei sau nu intrări pot forma teoretic un triunghi. Deci, să ia o câteva minute și să declare și apoi să definească această funcție numită valabil triunghi, astfel că de fapt are comportamentul specificat aici. Acesta va afișa adevărat dacă aceste trei laturi sunt capabile de cuprinzând un triunghi, și fals în caz contrar Gata pentru a vedea cum ai făcut-o? Iată o implementare triunghi de valabil. Nu e singurul. Al tău s-ar putea varia ușor. Dar asta nu, de fapt, au comportamentul pe care ne așteptăm. Ne declarăm funcția noastră la foarte sus, bool triunghi valid float x float y float z. Deci, din nou, această funcție nevoie de trei numere reale ca argumentele sale, plutitoare variabile de valoare punct, și furnizează un adevărat sau fals valoare, care este un Boolean, rechemare. Deci, de aceea tipul de retur este bool. Apoi ne-am defini funcția. Primul lucru ce facem este să verificați pentru a vă asigura că toate laturile sunt pozitive. Dacă x este mai mic sau egal la 0, sau dacă y este egal cu 0, sau dacă z este mai mică sau egală cu 0, care nu poate fi, eventual, un triunghi. Ei nu au părți pozitive. Și astfel ne putem întoarce fals în această situație. Apoi, vom verifica pentru a vă asigura că fiecare pereche de intrări este mai mare decât a treia. Deci, dacă x plus y este mai puțin mică sau egală cu z, sau în cazul în care X este mai mic, plus Z mare sau egal cu y, sau dacă y plus z este mai mică sau egală cu X, care, de asemenea, nu poate fi un triunghi valid. Deci, ne întoarcem din nou false. Presupunând am trecut amândoi controalelor deși, atunci ne putem întoarce adevărat. Deoarece cele trei laturi sunt capabile de returning-- creării unui triunghi valid. Si asta e. Ai declarat și definite acum. Și ați putea fi capabil de a acum la ce folosește și numesc această funcție. Bună treabă. Sunt Doug Lloyd. Acest lucru este CS50.