Даг LLOYD: Во ред.
Па сега ајде да се справи со навистина голема тема, функции.
Досега во се разбира, сите програми кои ние сме биле пишување
се напишани во внатрешноста на главниот.
Тие се прилично едноставни програми.
Вие не треба да ги имаат сите овие гранки и работите што се случуваат.
Ние само може да го собере сите во внатрешноста на главниот и
не се ужасно огромно.
Но, како што се разбира продолжува и како ќе почнат да се развијат програми
независно, тие веројатно ќе за да почне да се добие многу повеќе од 10
или 15 линии.
Може да се добие стотици или илјадници или десетици илјади линии на код.
И навистина не е дека луди мисла.
Како таква, таа веројатно не е добра идеја да се задржи сето во внатрешноста на главниот.
Тоа може да се добие малку тешко да се најде она што го барате за, ако го направите тоа.
>> За среќа, иако Ц, и доста секој друг програмски јазик кој
би можеле да работат со тоа, им овозможува на не да напишеме функции.
И јас сум само ќе земе брз настрана овде
да се спомене дека функции е една област на компјутерски науки.
И ќе видите многу повеќе од нив во различни точки во текот на курсот
и ако се продолжи натаму.
Каде што има многу синонима за ист збор.
За да можеме да се јавите на функции.
Но вие исто така може да ги слушне наведени како процедури,
или методи, особено, ако некогаш сте се направиле било објектно ориентирано програмирање
before-- и не грижете се ако не, нема да има
голема deal-- но во ориентирана ревизија јазици
често се нарекува методи.
Понекогаш тие се наречени subroutines.
Но тие навистина сите се однесуваат на истата основна идеја.
>> Ајде да видиме што е тоа што идејата.
Она што е во функција?
И функција е навистина ништо повеќе од црна кутија.
Црна кутија која има множество на нула или повеќе влезови и еден излез.
Така на пример, овој Може да биде во функција.
Ова е во функција се нарекува функционална.
И тоа трае три влеза a, b и c.
И во внатрешноста дека црната кутија, ние не знаат точно она што го прави,
но тоа процеси влезови на некој начин, а потоа го
дава еден излез, во овој случај, z.
Како да се направи тоа малку помалку апстрактен,
Може да се каже дека можеби ние имаат функција наречена
додадете кој ги зема три влеза, б, и в и процеси на производството на некој начин
во внатрешноста на црна кутија за произведе еден излез.
Значи во овој случај, ако додадете трае 3, 6 и 7.
Некаде во внатрешноста на додадете функција, ние би
очекува од нив да се собираат заедно за да се произведе излез, што
е 3 плус 6 плус 7 или 16.
>> Слично на тоа, ќе имаат функција наречена mult кој трае два елемента, А и Б,
ги обработува на некој начин како дека на излез од функцијата
е производ на две влезови.
Двата влеза множи заедно.
4 и 5 се пренесува во mult, нешто се случува, на излез очекуваме
е 20.
Зошто ние го нарекуваме црна кутија?
Па ако не пишуваме Функционира самите себе, што
ние го направивме доста досега CS50.
Видовме печатење ѓ, на пример, кој е функција која ние не пишувам
нас, но го користат во секое време.
Ако ние не се пишува самите функции,
ние навистина не треба да знаете како тоа е всушност спроведени под хауба.
>> Така на пример на црна кутија јас само што ја покажавте за множење,
mult А, Б може да биде defined-- и ова е само
некои може да биде pseudocode-- дефинирани како излез пати b.
Тоа има смисла, нели.
Ако имаме функција наречена mult кој трае два влеза.
Ние би очекувале дека излезот би биде два влеза множи заедно,
пати b.
Mult но, исто така, би можело да биде спроведува, како таков,
имаме контра променливата се поставени во внатрешноста на mult на 0.
А потоа ние го повторите овој процес б пати додадете до шанкот.
На пример, ако ние се размножуваат 3а страна 5б, би можеле да кажеме постави контра на 0,
повтори пет пати, додадете 3 до шанкот.
Па ние да почне на 0, а потоа го правиме ова пет пати 3, 6, 9, 12, 15.
Тоа е истиот резултат. Ние уште се 3 пати само 5
спроведувањето е поинаква.
>> Тоа е она што ние подразбираме кога велиме црна кутија.
Тоа само значи дека ние навистина не се грижат како тоа се спроведува под хауба
додека производството е она што го очекуваме.
Всушност, тоа е дел од договорот на користење на функции, особено
функции што другите пишуваат.
Однесувањето е секогаш ќе да биде типична, непредвидливи
врз основа на името на функцијата.
А тоа е зошто тоа е навистина важно кога ќе се напише функции
или кога има други луѓе пишуваат функции на кои можете да го користите,
дека оние функции имаат јасно, релативно очигледни имиња,
и се добро документирани.
Што е секако случај за функција како печати f.
>> Па зошто ние ги користиме функции?
И како што реков претходно, ако ние пишуваме сите на нашиот код во внатрешноста на главниот нешта
може да се навистина незгодни и навистина комплицирано.
Функции ни овозможува на способноста да се организираат работите и да ги разбие
многу комплициран проблем во многу повеќе податлив суб делови.
Функции, исто така, ни овозможи да се поедноставување на процесот на кодирање.
Тоа е многу полесно да се debug 10 линија функција наспроти 100 линија
функција или функција на 1.000 линија.
Ако ние само треба да се debug мали парчиња во исто време,
или да напишете мали парчиња во тоа време, тоа го прави што програмирање искуство
многу подобро.
Верувај ми на оној.
>> И на крај, ако ние пишуваме функции ние може повторно да ги користите тие различни делови.
Функции може да се рециклираат.
Тие може да се користи во една или друга програма.
Веќе сте писмени функцијата, се што
треба да направите е да се каже дека програмата каде да се најде таа функција.
Ние сме биле за рециклирање и користење печати ѓ за над 40 години.
Но тоа беше само напишано едно време.
Доста корисно, во право.
Во ред.
Па функции се големи.
Ние знаеме дека.
Сега ајде да почнеме да ги пишувате.
Ајде да започне да добива нив во нашите програми.
Со цел да го направат тоа, првиот нешто што го правиме е да изјави функцијата.
Кога ќе се изјасни за функцијата она што го прави во основа
кажува компајлер, еј, само да знаете,
Одам да се пишува функција подоцна
и тука е она што тоа ќе изгледа.
Причината за ова е бидејќи може компајлери
направи некои чудни работи ако тие го гледаат збир на симболи
дека тие не се запознаени со.
Па ние само им даде на компајлерот на челото, јас сум една функција
и тоа се случува да го направите тоа.
Декларации функција генерално ако што го организира вашиот код на некој начин
дека и другите ќе бидат во можност да се разбере и да се направи употреба на,
обично сакаат да се стави сите на функцијата на вашиот декларации
во самиот врв на вашиот код, право пред да почнете да пишувате главните дури.
И погодно, има многу стандардна форма
дека секоја функција декларација следува.
Тие се сите речиси изгледа вака.
Постојат три дела на функција декларација, врати видот, име,
и листа на аргументи.
>> Сега врати видот е каков вид на променлива излез функција волја.
Така на пример, ако мислиме назад Пред минута до две множење
броеви функција, што очекуваме, ако множете цел број со цел број
на излез ќе биде Веројатно цел број, во право.
Множи два цели броја заедно, добивате цел број.
Па врати видот на таа функција би било Инт.
Име е она што го сакате за да го повикате вашите функција.
Ова е веројатно најмалку важен дел од декларацијата на функција,
во однос на функционалноста.
Но всушност е веројатно една од најважните делови
на декларацијата за улога во поглед на знаејќи што на функцијата, всушност,
го прави тоа.
Ако името на вашата функција f и g или h или мистерија или нешто слично,
ти си веројатно се случува да се добие малку сопнат обидува
да се сетам на она што го прават тие функции.
Па затоа е важно да им даде на вашиот значајни имиња функција е.
>> И на крај, е аргумент листа листа на разделени со запирки
на сите влезови на вашата функција, од кои секоја има тип и име.
Затоа, не само што мора да се определи што тип на променлива
излез функција волја, исто така, сакаат да се определи
каков тип и типови на променливи функција ќе биде прифаќањето како влезови.
Значи, да се направи еден пример тука.
Ајде да ги разгледаме на поконкретни еден.
Па еве еден пример на функција декларација за функција што
ќе додадете два цели броја заедно.
Збирот на два цели броја ќе да биде цел број, како и, како што само
дискутира.
И така на врати видот, тука во зелено, ќе биде Инт.
Кои само ни кои додаваат два ints раскажува се случува да се, на крајот на денот,
излез, или плукаат назад до нас, цел број.
Оглед на тоа што на оваа функција го прави тоа сакате да го даде некое значајно име.
Додадете две ints чини што е соодветно, со оглед на
ние сме преземање два цели броја како влезови и се надевам да ги додавате заедно.
Тоа може да биде малку тежок име и искрено оваа функција
веројатно не е потребно бидејќи имаме додавање
оператор, ако се потсетиме на нашите дискусија на оператори, претходно.
Но, да речеме за доброто на аргумент дека оваа функција е корисна
и така ќе го наречеме тоа додадете две ints.
И на крај, оваа функција се два влеза.
Од кои секоја е цел број.
Па ние имаме овој запирка одделени листа на влезови.
Сега ние генерално сакаат да даде име на секој од нив
така што тие може да се користи во рамките на функција.
Имињата не се многу важни.
>> Во овој случај, ние не мора имаат смисла прикачен на нив.
Па ние само може да ги наречеме a и b.
Тоа е сосема во ред.
Ако сепак, ќе се најде во ситуација
каде што имињата на променливите всушност би можеле да бидат важни,
можеби ќе сакате да ги нарекуваат нешто друго од А и Б
да им даде нешто повеќе симболично значење.
Но, во овој случај, ние навистина не знам ништо во врска со функцијата.
Ние само сакаме да додадете два цели броеви.
Па ние само ќе се јавите оние кои се цели броеви a и b.
Тоа е еден пример.
>> Зошто не можете да се земе втора да се размислува за ова,
како ќе се напише функција декларација за функција што
Множење на две децимални броеви?
Се сеќаваш ли на лебдат број поента е?
Што би ова функција декларација изгледа?
Јас всушност препорачуваме да го паузирате видео тука и да се земе колку време ви треба.
Размислете за тоа што овој функција декларација ќе биде?
Она што ќе биде од типот за возврат?
Што ќе биде значајно име?
Кој би бил влезови?
Па зошто да не го паузирате видео тука и да пишува-up декларација функција
за функција која ќе се размножуваат две лебдат точка броеви заедно.
Се надевам дека ќе паузира видеото.
>> Па ајде да ги разгледаме во еден пример на едно можно декларација.
Плови mult две reals плови x, y плови.
На производот на две на децимални броеви,
кои се потсетиме како ние претставуваат реални броеви
или броеви со децимален вредности во в, ќе биде децимален број.
Кога ќе се размножуваат на децималниот од децималниот,
ти си веројатно се случува да се добие децимални.
Сакате да го даде релевантни име.
Размножуваат две reals чини парична казна.
Но, навистина би можеле да го наречеме mult две плови, или mult плови.
Такво нешто, се додека тоа даде некои вистинската смисла на она што
оваа црна кутија што се случува да се направи.
И повторно, во овој случај, ние не се чини дека имаат некакво значење во прилог
за имињата на променливи сме поминува во,
па ние само ги нарекуваат x и y.
Сега ако ги нарекуваат нешто друго, тоа е сосема во ред.
Всушност, ако не оваа декларација наместо
наместо користење на двојки на лебди, ако се потсетиме
кој двојки се различна начин да се поточно
наведете реални броеви или подвижна запирка променливи.
Тоа е сосема во ред.
Или еден од оние ќе биде во ред.
Всушност, постојат неколку различни комбинации
начини да се изјасни за оваа функција.
Но, ова се две прилично добри.
Ние се изјаснивме функција, тоа е одлично.
Ние сме изјави компајлерот она што е, она што ние ќе треба да се прави.
Сега ајде да всушност пишува таа функција.
Ајде да се даде дефиниција, така што во внатрешноста на црна кутија
предвидливо однесување се случува.
Всушност, ние се размножуваат два реални броеви заедно, или додавање на броеви
заедно, или прави што и да е кои ги прашавме нашите функцијата за да се направи.
>> Така, всушност, да се обидеме и да ги дефинира размножуваат две reals кои ние едноставно
зборуваше пред една секунда за.
Сега на почетокот на дефиниција функција
изгледа речиси иста како декларација на функција.
Имам и двете од нив тука.
На врвот е декларација на функцијата, тип, име, разделени со запирки аргумент
листа, точка-запирка.
Запирка укажува дека тоа е изјава на функција.
На почетокот на функција дефиниција изгледа речиси исто
истиот, тип, име, разделени со запирки листа на аргументи, без запирка,
отвори кадрава голема заграда.
Отворениот кадрава голема заграда, исто како ние сме прави со главниот,
значи дека ние сме сега започнуваат да ја дефинираат
она што се случува во внатрешноста на црна кутија што ние одлучивме да се јавите mult две reals.
Еве еден начин да се имплементира.
Би можеле да кажеме, ние би можеле да се изјасни за новиот променлива од тип float нарекува производ
и му ја додели таа променлива за вредноста на y x пати.
И потоа да се вратите производот.
Што не значи враќање тука.
И враќање е начинот на кој укажуваме на тоа е начинот на
ние сме полагање на излез врати надвор.
Па се врати нешто, е исто како и, ова е излезот од црната кутија.
Па тоа е како да го направи тоа.
Еве уште еден начин да се имплементира.
Ние може само да се вратат x пати y.
x е број со подвижна запирка.
y е број со подвижна запирка.
Толку пати х у е, исто така, да се одржи.
Ние дури и не треба да се се создаде уште една променлива.
Значи тоа е еден поинаков начин да имплементираат исти црна кутија.
>> Сега, земи еден момент, паузирате видеото, повторно,
и да се обиде и да ги дефинира додадете две ints, што е од друга функција која
зборуваше за еден миг.
Повторно тука, јас сум се стави во функција декларација, така и на запирка,
и отворен кадрава голема заграда и затворен кадрава
се подготвуваат да се покаже каде ќе ги пополнат во содржината додадете две ints,
така што ние се дефинираат одделни однесување во внатрешноста на црна кутија.
Па го паузирате видео.
И да ги преземат онолку време колку што треба да се обиде и да ги дефинира
имплементација на додадете две ints, како дека кога функцијата излези на вредност,
тоа го прави, всушност, враќање збирот на два влеза.
Па исто како и во претходниот пример, постојат неколку различни начини
дека може да се имплементира додадете две ints.
Еве еден.
Овде во портокалова сум само имаше некои comments--
Јас сум само додаде некои коментари за да се покаже
она што се случува на секоја линија код.
Па јас декларирате променлива наречен сума од тип int.
Велам сума еднаква на плус б.
Тоа е местото каде што ние, всушност, прави работата додавање на А и Б заедно.
И ќе се вратам сума.
И дека има смисла, бидејќи Сумата е променлива од тип int.
И, што е дека овој тип на податоци Функцијата ми кажува дека ќе излез?
Инт.
Па јас сум враќање сума, која е целобројна променлива.
И кој што има смисла со оглед на тоа што сме го прогласена и дефинирани нашата функција
да направиш.
>> Сега можете исто така може да се дефинира на функцијата на овој начин,
int сума еднаква на плус b-- прескокнете дека Првиот step-- а потоа, да се вратите сума.
Сега можете исто така може да има го спроведува овој начин,
кои јас многу не се препорачува.
Ова е лошо за еден стил работа и навистина лош дизајн,
но тоа го прави, всушност, се работи.
Ако се земе овој код, кој е цел број додадете лоша ехидна точка в, и го користат.
Тоа всушност се додаде два цели броја заедно.
Тоа е многу слаба имплементација на овој особено однесување.
Но, тоа не функционира.
Тоа е само тука за да се илустрира точка дека ние навистина не
е гајле што се случува во внатрешноста црна кутија, колку
како што има излез кој што очекуваме.
Ова е лошо дизајниран црна кутија.
Но, на крајот на денот, тоа го прави уште излез збирот од а плус b.
Во ред.
Значи ние се изјаснивме функции.
И ние дефинирана функција.
Така што е навистина добро.
Сега ајде да почнеме да ги користите функциите дека ние се изјаснивме и ние го дефинира.
За да повикате function-- тоа е всушност прилично easy-- сите што треба да направите
е да го давате соодветни аргументи, аргументи од типот на податоците
дека очекува и потоа му ја додели на враќање
вредноста на таа функција и this-- изговор me--
доделите на повратната вредност на таа функција до нешто од точниот тип.
>> Па ајде да го погледне во Ова во пракса во датотека
наречен ехидна 1 точка в кој Имам во мојата CS50 ИРО.
Па тука е ехидна 1 точка в.
На почетокот го гледате Јас имам мојата вклучува, фунта вклучуваат,
стандард IO и CS50 точка ч.
А потоа имам декларација мојата функција.
Ова е местото каде сум кажување на компајлерот сум
ќе треба да се пишува функција наречена додадете две ints.
Тоа се случува да излез на целобројна променлива тип.
Тоа е она што овој дел е во право тука.
А потоа имам два влезови за тоа и b, од кои секоја е цел број.
Во внатрешноста на главниот, јас побара од корисникот за внесување, велејќи, дај ми цел број.
И тие се поттикнати да се заборави int, која е функција која
е вклучена во CS50 библиотека.
И дека добива чуваат во x, целобројна променлива.
>> Потоа го прашува за уште еден цел број.
Ние се добие уште еден цел број и чување на кои во y.
И потоа, тука на линија 28, е каде што ние правиме повик на функција.
Ние велиме, int z еднаквите додадете 2 ints x y запирка.
Дали ви се види зошто ова има смисла?
x е променлива број тип и y е променлива број тип.
Па тоа е добро.
Тоа има смисла со она што нашата функција изјава на линија 17 изгледа како.
Запирки листа за внес очекува два цели броеви, a и b.
Во тој случај, може да се јавите нив она што го сакаме.
Тоа едноставно се очекува два цели броја.
И x е цел број и y е цел број.
Која работи.
>> И знаеме дека функцијата ќе до излез на цели броеви, како и.
Така, ние чување на излез на функцијата,
додадете две ints, во број тип променлива, што ние повикуваме на ●.
И тогаш можеме да кажеме, збирот на проценти i и проценти i е посто.
x, y и z, соодветно пополнување на овие проценти i е.
Што е дефиницијата на додадете две ints изгледа?
Тоа е прилично едноставна.
Тоа е еден од оние што ги само видов пред една секунда,
int сума еднаква на плус б враќање сума.
Оваа работа?
Ајде да ја зачувам датотеката.
А потоа надолу тука на мојот терминал Одам да се направи ехидна 1,
и јас го исчистите мојот екран.
Одам да зумирате, бидејќи знам тоа е малку тешко да се види.
>> Па ние собере на оваа програма како ехидна 1.
За да можеме да се направи точка црта ехидна 1.
Дај ми цел број, 10.
Дај ми друга цел број, 20.
Сума од 10 и 20 е 30.
Така, направивме успешна повик на функција.
Можете да се кандидира за функција еднаш, негативни 10, 17 збир на негативни 10 и 17 е 7.
Оваа функција работи.
Таа има за однесување дека е можно да.
И така ние ги направивме успешна функција, дефиниција, декларација,
и успешна повик на функција.
Двојката Разно поени за функциите
пред да се заклучи оваа секција.
Да се ​​потсетиме на нашите дискусија на типови на податоци,
претходно, која функционира понекогаш може да потрае не влезови.
Ако тоа е случај, ние прогласи за функцијата
како што имаат листа на аргумент неважечки.
Се сеќаваш ли на она што Најчестата функција
ние сме виделе досега дека го листа празнина аргумент е?
Тоа е главна.
Потсетиме, исто така таа функција понекогаш не, всушност имаат излез.
Во тој случај, ние прогласи функцијата како што имаат тип неважечки враќање.
Да заклучиме овој дел од справување со проблемот на пракса.
>> Значи, тука е проблемот поставени.
Сакам да се напише функција нарекува валидна триаголник.
Она што на оваа функција треба да се направи се земе три реални броеви
кои ги претставуваат должините на три страни на еден триаголник како параметри,
или нејзините аргументи, или нејзиниот inputs-- друг сет на синоними
кои може да се судрите.
Оваа функција треба да или излез точно или неточно
зависност од тоа дали тие три должини се способни за изработка триаголник.
Дали се сеќавате на типот податоци кои ние се користи за да се покаже точно или погрешно?
Сега како да се спроведе тоа?
Добро знаат постојат неколку на правила во однос на триаголници
кои се всушност корисно да се знае.
Триаголник само може да има страни со позитивни должина.
Кој што има смисла.
Ти си веројатно се велејќи, Duh.
Од друга работа е да се напомене сепак, е дека збирот
во должините на било која двете страни на триаголник
мора да биде поголема од должина на третата страна.
Тоа е всушност вистинит.
Вие не може да имаат триаголник на страни 1, 2 и 4, на пример, бидејќи 1 плус 2
не е поголема од 4.
Значи тоа се правилата кои се утврди дали на три или не
влезови разбирливо може да се формира триаголник.
Така да потрае неколку минути и изјавува а потоа се дефинира
оваа функција се нарекува валидна триаголник, како што тоа всушност
има однесување се наведени тука.
>> Тоа ќе излез точно ако тие три страни се способни да се состои од еден триаголник,
и лажно поинаку Подготвени да се види како ќе се направи?
Тука е една имплементација од важечки триаголник.
Тоа не е само еден.
Твое може да се разликува малку.
Но, ова не го прави тоа, всушност, имаат однесувањето што го очекуваме.
Сакаме да укажеме нашата функција на самиот врв, bool валидна триаголник
x плови плови плови y z.
Значи, повторно, оваа функција зема три реални броеви
како нејзините аргументи, лебдејќи променливи точка вредност,
и излези на вистински или лажни вредност, која е Булова, да се потсетиме.
Па тоа е зошто видот враќање е bool.
Тогаш ние се дефинира функција.
Првото нешто што го правиме е да се провери да бидете сигурни дека дека сите страни се позитивни.
Ако x е помалку од или еднакво на 0, или, ако y е еднаков на 0,
или ако z е помалку од или еднакво на 0, кои не можат да бидат триаголник.
Тие немаат позитивни страни.
И за да можеме да се вратат лажно во таква ситуација.
Следно, проверете да бидете сигурни дека секој пар на влезови
е поголема од третиот.
>> Значи, ако x плус у е помалку од или еднакво на z,
или ако x плус z е помалку од или еднакво на y,
или ако y плус z е помалку од или еднакво на x, кои, исто така, не може да биде валидна триаголник.
Па ние return false повторно.
Претпоставувајќи го поминавме двата проверки Но, тогаш можеме да се врати вистина.
Бидејќи тие три страни се способни за returning--
на создавање валидна триаголник.
И тоа е тоа.
Сте сега прогласена и дефинирани.
А вие може да биде во можност да го сега употреба и се јавите на оваа функција.
Одлична работа.
Јас сум Даг Лојд.
Ова е CS50.