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.