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.