DOUG LLOYD: Très bien. Alors maintenant, nous allons aborder un vraiment grand sujet, fonctions. Jusqu'à présent, dans le cadre, tous les les programmes que nous avons écrit ont été écrit à l'intérieur de la principale. Ils sont des programmes assez simple. Vous ne devez pas avoir toutes ces les branches et les choses qui se passent. Nous pouvons simplement adapter tout à l'intérieur de ce principal et ne soyez pas terriblement écrasante. Mais que le cours se poursuit et que vous commencez à développer des programmes indépendamment, ils vont probablement pour commencer à obtenir beaucoup plus de 10 ou 15 lignes. Vous pouvez obtenir des centaines ou des milliers ou des dizaines de milliers de lignes de code. Et il est vraiment pas ce fou une pensée. En tant que tel, il est probablement pas une bonne idée de tout garder à l'intérieur de la principale. Il peut être un peu difficile à trouver ce que vous cherchez si vous faites cela. Heureusement, si C, et à peu près chaque autre langage de programmation qui pourrait travailler avec, permet nous écrivions fonctions. Et je vais juste prendre une petite parenthèse ici de mentionner que des fonctions est un domaine de la science informatique. Et vous verrez beaucoup plus d'entre eux à différents points tout au long et si vous continuez sur. Là où il ya un grand nombre de synonymes pour le même mot. Nous appelons donc les fonctions. Mais vous pourriez aussi les entendre dénommé procédures, ou des méthodes, en particulier, si vous avez déjà fait toute la programmation orientée objet before-- et ne vous inquiétez pas si vous ne l'avez pas, pas un grand Deal-- mais dans vérification des langages orientés sont souvent appelées méthodes. Parfois, ils sont appelés des sous-routines. Mais ils ont vraiment se réfèrent tous à la même idée de base. Voyons voir ce que cette idée est. Qu'est-ce qu'une fonction? Eh bien une fonction est vraiment rien de plus qu'une boîte noire. Une boîte noire qui a un ensemble de zéro ou plusieurs entrées et une seule sortie. Ainsi, par exemple, cette pourrait être une fonction. Ceci est une fonction appelée FUNC. Et il faut trois entrées a, b et c. Et à l'intérieur de cette boîte noire, nous je ne sais pas exactement ce qu'il fait, mais il traite les entrées en quelque sorte, et puis il donne une sortie unique, dans ce cas, z. Maintenant, pour faire un peu moins résumé, nous pourrait dire que peut-être nous avoir une fonction appelée ajouter que prend trois entrées A, B, et c et traite la sortie d'une certaine façon l'intérieur de la boîte noire produire une seule sortie. Donc dans ce cas, si ajouter prend 3, 6, et 7. Quelque part à l'intérieur du ajouter la fonction, nous le ferions attendre d'eux pour être additionnés pour produire la sortie, qui 3 est plus 6 plus 7 ou 16. De même, vous avez une fonction appelée mult qui prend deux entrées, a et b, les traite d'une certaine manière que la sortie de la fonction est le produit des deux entrées. Les deux entrées multipliés ensemble. 4 et 5 étant passé dans mult, quelque chose se passe, nous nous attendons à la sortie est 20. Pourquoi avons-nous l'appelons une boîte noire? Eh bien, si nous ne faisons pas la nous fonctions, qui nous avons fait un peu jusqu'ici CS50. Nous avons vu impression f, par exemple, qui est une fonction que nous ne écrivons nous-mêmes, mais nous utilisons tout le temps. Si nous ne sommes pas écrivons les fonctions mêmes, nous ne pas vraiment besoin de savoir comment il est effectivement mis en œuvre sous le capot. Ainsi, par exemple la boîte noire I viens de vous montrer pour la multiplication, mult a, b pourrait être defined-- et cela est juste certains pseudocode-- pourrait être définie comme une fois sortie de b. Qui font sens, à droite. Si nous avons une fonction appelée mult qui prend deux entrées. Nous nous attendons à ce que la sortie serait être les deux entrées multipliées ensemble, une fois b. Mais mult pourrait également être mise en œuvre de ce type, nous avons un compteur variable se mettre à l'intérieur de mult à 0. Et puis nous répétons ce processus b fois ajouter un à contrer. Par exemple, si l'on multiplie par 3 bis, 5b, nous pourrions dire définir compteur à 0, Répétez cinq fois, ajouter 3 à contrer. Nous commençons donc à 0 et ensuite nous faisons cinq fois cette 3, 6, 9, 12, 15. Il est le même résultat. nous toujours obtenir 3 fois 5 seulement la mise en œuvre est différente. Voilà ce que nous entendons quand nous disons une boîte noire. Cela signifie simplement que nous ne nous soucions pas vraiment comment il est mis en œuvre sous le capot aussi longtemps que la sortie est ce que nous attendons. En fait, cela fait partie du contrat de l'utilisation des fonctions, en particulier fonctions que d'autres écrivent. Le comportement va toujours être typique, imprévisible sur la base du nom de la fonction. Et voilà pourquoi il est vraiment important lorsque vous écrivez fonctions ou lorsque d'autres gens écrivent fonctions que vous pouvez utiliser, que ces fonctions doivent , des noms relativement évidentes, claires et sont bien documentés. Ce qui est certainement le cas pour la fonction comme l'impression f. Alors pourquoi nous utilisons des fonctions? Eh bien comme je le disais plus tôt, si nous écrivons l'ensemble de notre code à l'intérieur des choses principales peut être vraiment lourde et vraiment compliqué. Fonctions nous permettent la capacité d'organiser les choses et de briser un problème très compliqué en beaucoup sous des pièces plus faciles à gérer. Fonctions nous permettent également de simplifier le processus de codage. Il est beaucoup plus facile à déboguer un 10 fonction de la ligne par rapport à une ligne 100 fonction ou une fonction de 1000 de la ligne. Si nous avons seulement à déboguer petits morceaux à la fois, ou écrire des petits morceaux de l'époque, il fait que l'expérience de programmation Beaucoup mieux. Croyez-moi sur ce point. Enfin, si nous écrivons fonctions nous peut réutiliser ces différentes parties. Les fonctions peuvent être recyclés. Ils peuvent être utilisés dans d'un programme ou d'une autre. Vous avez déjà écrit la fonction, tout ce que vous besoin de faire est de dire que le programme où trouver cette fonction. Nous avons recyclage et l'utilisation f imprimer depuis plus de 40 ans. Mais il a été écrit qu'une seule fois. Très utile, à droite. Bien. Donc fonctions sont grands. Nous savons que. Maintenant, nous allons commencer à les écrire. Commençons obtenir les dans nos programmes. Pour ce faire, la première chose que nous faisons est de déclarer la fonction. Lorsque vous déclarez une fonction ce que vous êtes essentiellement faire est de dire le compilateur, hey, si vous le savez, Je vais être écrit une fonction plus tard et voici ce que ça va ressembler. La raison en est parce que les statisticiens peuvent faire des choses étranges si ils voient un ensemble de symboles qu'ils ne sont pas familiers avec. Donc, nous donnons simplement le compilateur une heads up, je crée une fonction et il va le faire. Les déclarations de fonctions généralement le cas vous organisez votre code d'une manière que d'autres seront en mesure de comprendre et faire usage de, vous souhaitez généralement de mettre tous de vos déclarations de fonction tout en haut de votre code, droit avant de commencer à écrire principale même. Et idéalement, il ya une forme très standard que chaque déclaration de fonction suit. Ils ont tous à peu près ressembler à ceci. Il ya trois parties à une fonction déclaration, le type de retour, nom, et la liste d'arguments. Maintenant, le type de retour est le type de variable de la sortie fonction de la volonté. Ainsi, par exemple, si l'on repense un il ya minutes à la multiplication de deux fonction des numéros, qu'attendons-nous si nous multiplions un entier par un entier la sortie sera probablement un nombre entier, à droite. Multiplié deux nombres entiers ensemble, vous obtenez un nombre entier. Alors que le type de retour fonction serait int. Nom est ce que vous voulez d'appeler votre fonction. Ceci est probablement le moins important partie de la déclaration de fonction, en termes de fonctionnalité. Mais est en fait probablement l'un des parties les plus importantes de la déclaration de fonction en termes de savoir ce que la fonction fait t. Si vous nommez votre fonction f ou g ou h ou de mystère ou quelque chose comme ça, vous allez probablement obtenir un peu trébuché à essayer de se rappeler ce que ces fonctions font. Donc, il est important de donner à votre des noms significatifs de fonction. Enfin, liste des arguments est la liste séparées par des virgules de toutes les entrées à votre fonction, chacun d'eux ayant un type et un nom. Ainsi, non seulement vous avez à spécifier le type de la variable la sortie fonction de la volonté, vous aussi vous voulez spécifier ce type et les types de variables fonction sera accepte comme entrées. Alors, faisons un exemple ici. Prenons juste un coup d'oeil à un plus concrète. Alors, voici un exemple d'une fonction déclaration pour une fonction qui ajouterait deux entiers ensemble. La somme des deux entiers va un entier aussi bien, comme nous venons de discutée. Et si le type de retour, ici en vert, serait int. Cela nous qui ajoutent deux ints dit juste va, à la fin de la journée, sortie, ou recracher à nous, un entier. Étant donné ce que nous avons fait cette fonction vouloir lui donner un nom significatif. Ajouter deux ints semble appropriée, compte tenu de nous prenons deux entiers comme entrées et nous espérons que les additionner. Il pourrait être un peu encombrant nom et franchement cette fonction est probablement pas nécessaire puisque nous avons le plus l'opérateur, si vous vous souvenez de notre discussion des opérateurs, déjà. Mais disons simplement par souci de argument selon lequel cette fonction est utile et ainsi nous l'appellerons ajouter deux ints. Enfin, cette fonction prend deux entrées. Chacune d'entre elles est un entier. Nous avons donc cette virgule liste séparée par des entrées. Maintenant, nous voulons généralement donner un nom à chacun d'eux de sorte qu'ils peuvent être utilisés dans la fonction. Les noms ne sont pas terriblement important. Dans ce cas, nous ne faisons pas nécessairement avoir un sens attaché à eux. Donc, nous ne pouvons les appeler a et b. Voilà tout à fait bien. Si toutefois, vous trouverez vous dans une situation où les noms des variables pourrait en fait être important, vous pouvez les appeler autre chose que A et B de leur donner quelque chose de plus symboliquement significatif. Mais dans ce cas, nous ne faisons pas vraiment connaître autre chose à propos de la fonction. Nous voulons juste d'ajouter deux nombres entiers. Donc, nous appellerons simplement ceux entiers a et b. Voilà un exemple. Pourquoi ne prenez-vous pas une seconde de penser à celui-ci, comment voulez-vous écrire une fonction déclaration pour une fonction qui multiplie deux nombres à virgule flottante? Vous rappelez-vous ce qu'est un nombre à virgule flottante est? Que serait cette fonction déclaration ressembler? Je recommande vraiment vous mettre en pause la vidéo et prenez ici combien de temps vous avez besoin. Pensez à ce que cette déclaration de fonction serait? Quel serait le type de retour est? Que serait un nom significatif être? Quelles seraient les entrées être? Alors pourquoi ne pas vous mettre en pause la vidéo ici et rédaction d'une déclaration de fonction pour une fonction qui multiplierait deux nombres à virgule flottante ensemble. Espérons que vous avez interrompu la vidéo. Donc, nous allons jeter un oeil à un exemple d'une éventuelle déclaration. Flottent mult deux réaux flottent x, float y. Le produit de deux nombres à virgule flottante, qui rappellent comment nous sont représenter des nombres réels ou des numéros avec des valeurs décimales en c, va être un certain nombre à virgule flottante. Lorsque vous multipliez un décimal par un décimal, vous allez probablement obtenir un nombre décimal. Vous voulez donner un nom pertinent. Multiplier deux réaux semble très bien. Mais vous pourriez vraiment appeler ça mult deux flotteurs, flotteurs ou mult. Quelque chose comme ça, aussi longtemps qu'il a donné une signification réelle pour ce cette boîte noire allait faire. Et encore une fois, dans ce cas, nous ne faisons pas semblent avoir un sens attaché aux noms de la variables que nous passons en, de sorte que nous appelons simplement les x et y. Maintenant, si vous les appelez quelque chose d'autre, qui est tout à fait bien. En fait, si vous avez fait cette déclaration à la place utiliser des doubles à la place des flotteurs, si vous vous souvenez que les doubles sont un autre de façon plus précise spécifier des nombres réels ou variables à virgule flottante. Cela est tout à fait bien aussi. Soit un de ceux serait bien. En fait, il y en a plusieurs différentes combinaisons des façons de déclarer cette fonction. Mais ce sont deux très bons. Nous avons déclaré une fonction, qui est très bien. Nous avons dit ce que le compilateur est, ce que nous allons faire. Maintenant, nous allons écrire cette fonction. Donnons-lui une définition, de telle sorte que l'intérieur de la boîte noire comportement prévisible qui se passe. En fait, nous multiplions deux réel numéros ensemble, ou d'ajouter des numéros ensemble, ou de faire quoi que ce soit que nous avons demandé à notre fonction de faire. Donc, en fait, nous allons chercher à définir multiplier deux nombres réels que nous venons parlé il ya une seconde. Maintenant, le début de une définition de fonction ressemble presque exactement le même comme une déclaration de fonction. Je dois tous les deux ici. Au sommet se trouve la déclaration de fonction, type, nom, séparées par des virgules argumentation liste, point-virgule. Le point-virgule indique que qui est une déclaration de fonction. Le début de la fonction définition ressemble presque exactement même, le type, le nom, séparées par des virgules liste des arguments, pas de point-virgule, ouvrir accolade. L'accolade ouverte, tout comme nous avons fait avec les principaux, signifie que nous sommes maintenant en commençant à définir ce qui se passe à l'intérieur de la boîte noire qui nous avons décidé de l'appeler mult deux réaux. Voici une façon de le mettre en œuvre. Nous pourrions dire, nous pourrions déclarer une nouvelle variable de flotteur appelé type de produit et affecter cette variable à la valeur x fois y. Et puis retourner le produit. Qu'est-ce que signifie ici le retour. Bien retour est la manière nous indiquons que Voilà comment nous passons la sortie arrière. Donc retourner quelque chose, est le même que, ceci est la sortie de la boîte noire. Voilà donc comment vous le faites. Voici une autre façon de le mettre en œuvre. Nous ne pouvions tout simplement retourner x fois y. x est un flotteur. Y est un flotteur. Donc x fois y est aussi un flotteur. Nous ne même pas besoin de créer une autre variable. Voilà donc une autre façon de mettre en œuvre la même boîte noire exacte. Maintenant, prenez un moment, pause nouveau la vidéo, et d'essayer de définir ajouter deux ints, qui est l'autre fonction que nous parlé il ya un instant. Encore une fois ici, je l'ai mis la fonction déclaration, et ainsi le point-virgule, et une accolade ouverte bouclés et un fermé accolade pour indiquer où nous allons remplir dans le contenu de deux ints ajouter, afin que nous définissons le particulier comportement à l'intérieur de la boîte noire. Donc, mettre en pause la vidéo. Et de prendre autant de temps que vous devez essayer de définir une mise en œuvre de deux ints ajouter, tels que lorsque la fonction génère une valeur, elle le fait, en réalité, le retour la somme des deux entrées. Ainsi, tout comme dans l'exemple précédent, il existe plusieurs façons différentes que vous pourriez mettre en œuvre ajouter deux ints. Voilà un. Ici en orange, je l'ai juste eu une certaine comments-- Je viens d'ajouter un peu commentaires pour indiquer ce qui se passe sur chaque ligne de code. Je déclare donc une variable appelé somme de type int. Je dis somme équivaut à un plus b. Voilà où nous en sommes en train de faire le travail en ajoutant A et B ensemble. Et je reviens somme. Et cela fait sens parce somme est une variable de type int. Et quel est le type de données que cette fonction me dit que ça va vers la sortie? Int. Donc, je suis de retour somme, qui est une variable entière. Et qui est logique étant donné ce que nous avons déclaré et défini notre fonction faire. Maintenant, vous pouvez également définir la fonction de cette façon, int somme est égale à un plus b-- sauter cette step-- premier et ensuite, retourner somme. Maintenant, vous pourriez avoir aussi mise en œuvre de cette façon, que je ne recommande pas très. Cela est mauvais style pour un chose et vraiment mauvaise conception, mais elle, en fait, le travail. Si vous prenez ce code, qui est int ajouter mauvaise additionneur point c, et l'utiliser. Il ne fait ajouter deux entiers ensemble. Il est une très mauvaise mise en œuvre de ce comportement particulier. Mais il ne fonctionne. Il est juste ici pour illustrer au point que nous ne faisons pas vraiment soucier de ce qui se passe à l'intérieur la boîte noire, aussi longtemps comme il a la sortie que l'on attend. Ceci est une boîte noire mal conçu. Mais à la fin de la journée, il ne sortie encore la somme de a plus b. Bien. Donc, nous avons déclaré fonctions. Et nous avons une fonction définie. Voilà donc vraiment bon. Maintenant, nous allons commencer à utiliser les fonctions que nous avons déclaré et nous avons défini. Pour appeler un function-- il est fait jolie easy-- tout ce que vous devez faire est le transmettre arguments appropriés, arguments du type de données qu'il attend, et puis affecter le retour La valeur de cette fonction et this-- excuse moi-- affecter la valeur de retour de cette fonction à quelque chose du type correct. Donc, nous allons jeter un oeil à dans la pratique dans un fichier appelé sommateur 1 point c, qui Je dois à mon CS50 IDE. Voici donc sommateur 1 point c. Au début, vous voyez, je dois ma comprend, livre comprennent, norme IO, et CS50 dot h. Et puis je dois ma déclaration de fonction. Ceci est où je suis dire le compilateur je suis va être la rédaction d'un fonction appelée ajouter deux ints. Il va sortir un type integer variable. Voilà ce que cette partie se trouve ici. Et puis je dois deux entrées vers un et b, dont chacun est un nombre entier. A l'intérieur de la principale, je demande à l'utilisateur entrée en disant, me donner un nombre entier. Et ils sont invités à oublier int, qui est une fonction qui est inclus dans la bibliothèque de CS50. Et qui est stocké dans x, une variable entière. Ensuite, nous les invite pour un autre entier. Nous obtenons un autre entier et stocker que dans y. Et puis, ici, à la ligne 28, est où nous faisons notre appel de fonction. Nous disons, int égale Z ajouter 2 ints x virgule y. Voyez-vous pourquoi cela a un sens? x est une variable de type entier et y est une variable de type entier. Donc, ce qui est bon. Qui font sens avec ce que notre fonction Déclaration sur la ligne 17 ressemble. La liste d'entrée séparées par des virgules attend deux entiers, a et b. Dans ce cas, nous pouvons appeler eux ce que nous voulons. Il attend juste deux entiers. Et x est un nombre entier et y est un nombre entier. Ça fonctionne. Et nous savons que la fonction va pour délivrer un entiers ainsi. Et nous sommes donc stocker les sortie de la fonction, ajouter deux ints, dans un type entier variable, qui nous appelons z. Et alors nous pouvons dire, la somme de i pour cent pour cent et i est i pour cent. respectivement x, y et z remplissage dans ceux de i pour cent. Quelle est la définition de ajouter deux ints ressemblent? Il est assez simple. Il est l'un de ceux que nous juste vu il ya une seconde, int somme équivaut à une somme plus b de retour. Est ce que ça marche? Sauvons le fichier. Et puis ici, sur ma borne Je vais faire une addition, et je effacer mon écran. Je vais agrandir parce que je sais il est un peu difficile à voir. Donc, nous compilons ce programme comme additionneur 1. Donc, nous pouvons faire dot slash sommateur 1. Donnez-moi un entier, 10. Donnez-moi un autre entier, 20. La somme de 10 et 20 est de 30. Nous avons donc fait un appel de fonction avec succès. Vous pouvez exécuter de nouveau la fonction, négative 10, 17 somme de négative 10 et 17 est 7. Cette fonction fonctionne. Il a le comportement que nous nous attendons à. Et donc nous avons fait un succès la fonction, la définition, la déclaration, et un appel de fonction avec succès. Couple divers les points sur les fonctions Avant de conclure cette section. Rappel de notre discussion de types de données, précédemment, qui fonctionne peut parfois prendre aucune entrée. Si tel est le cas, nous déclarer la fonction comme ayant une liste d'arguments vide. Vous rappelez-vous ce que le plus fonction commune nous avons vu jusqu'à présent qui prend une liste d'argument vide est? Il est principale. Rappelons également que la fonction parfois ne disposent pas réellement une sortie. Dans ce cas, nous déclarons la fonction comme ayant un type de retour void. Terminons cette section par la lutte contre un problème de pratique. Alors, voici le problème énoncé. Je veux que vous écrivez une fonction appelle le triangle valide. Qu'est-ce que cette fonction devrait faire est de prendre trois nombres réels qui représentent les longueurs des trois côtés d'un triangle que ses paramètres, ou de ses arguments, ou de son inputs-- un autre ensemble de synonymes que vous pourriez rencontrer. Cette fonction devrait soit vraie ou fausse sortie selon que ces trois longueurs sont capables de faire un triangle. Vous souvenez-vous du type de données qui nous avons utilisé pour indiquer vrai ou faux? Maintenant, comment appliquez-vous cela? Eh bien savent qu'il ya un couple des règles concernant les triangles qui sont réellement utiles à connaître. Un triangle ne peut avoir côtés avec longueur positive. Ça a du sens. Vous dites probablement, duh. L'autre chose à noter cependant, est que la somme des longueurs de toute deux côtés du triangle doit être supérieure à la longueur du troisième côté. Voilà effectivement vrai. Vous ne pouvez pas avoir un triangle de côtés 1, 2 et 4, par exemple, parce que 1 plus 2 est inférieure ou égale à 4. Donc, ce sont les règles qui déterminer si oui ou non les trois entrées peuvent théoriquement former un triangle. Alors, prenez quelques minutes et déclarer et ensuite définir cette fonction appelée valide triangle, de telle sorte qu'il fait a le comportement spécifié ici. Il va afficher vrai si ces trois côtés sont capables de comporter un triangle, et faux sinon Prêt pour voir comment vous avez fait? Voici une mise en œuvre triangle valide. Il est pas le seul. Les vôtres peuvent varier légèrement. Mais celui-ci ne, en fait, ont le comportement que nous attendons. Nous déclarons notre fonction au très haut, bool triangle valide flotter x float y flotteur z. Encore une fois, cette fonction prend trois nombres réels que ses arguments, flottant variables de valeur du point, et délivre un vrai ou faux valeur, qui est un booléen, rappel. Voilà pourquoi le type de retour est bool. Ensuite, nous définissons la fonction. La première chose que nous faisons est de vérifier pour vous assurer que tous les côtés sont positifs. Si x est inférieur ou égal à 0, ou si y est égal à 0, ou si z est inférieure ou égale à 0, cela ne peut éventuellement être un triangle. Ils ne possèdent pas les côtés positifs. Et afin que nous puissions revenir faux dans cette situation. Ensuite, nous vérifions pour vous assurer que chaque paire d'entrées est supérieure à la troisième. Donc, si x + y est moins supérieur ou égal à z, ou si x est plus z moins supérieure ou égale à y, ou si y plus z est inférieur ou égal à x, qui a également ne peut pas être un triangle valide. Donc, nous revenons encore faux. En supposant que nous passions à la fois des contrôles cependant, alors nous pouvons retourner vrai. Parce que ces trois côtés sont capables de returning-- de création d'un triangle valide. Et c'est tout. Vous avez maintenant déclarée et définie. Et vous pourrez peut-être maintenant utiliser et appeler cette fonction. Bon travail. Je suis Doug Lloyd. Ceci est CS50.