Doug LLOYD: Todo ben. Entón agora imos afrontar unha tema realmente grande, as funcións. Ata agora, no curso, todo o programas que teño escrito ser escrito no inicio. Son programas moi sinxelo. Non é preciso ter todos estes ramas e cousas a suceder. Podemos só caber todo dentro principal e non queda terriblemente esmagadora. Pero, como o curso vai sobre e cando comeza a desenvolver programas de forma independente, eles probablemente van comezando a estar moito máis que 10 ou 15 liñas. Pode que centos ou miles ou decenas de miles de liñas de código. E iso realmente non é que un pensamento tolo. Polo tanto, probablemente non é unha boa idea para manter todo dentro do principal. Pode ser un pouco difícil de atopar o que está a buscar se fai iso. Felizmente, non obstante C, e practicamente cada outra linguaxe de programación que pode traballar, permite nós escribir funcións. E eu estou indo só para tomar un rápido separadamente aquí mencionar que é funcións unha área da ciencia da computación. E vai ver moitos máis deles en varios puntos ao longo do curso e se continúa. Onde hai unha morea de sinónimos para a mesma palabra. Entón, nós chamamos as funcións. Pero tamén pode oín-los chamada procedementos, ou métodos, en particular, se xa feito calquera programación orientada a obxecto antes-- e non se preocupe se non ten, non unha gran pero en deal-- linguaxes orientadas auditoría son frecuentemente chamados métodos. Ás veces, son chamados de subrutinas. Pero realmente se refiren para a mesma idea de base. Imos ver o que é idea. ¿Que é unha función? Ben é realmente unha función nada máis que unha caixa negra. A caixa negra que ten un conxunto de cero, ou máis entradas e un única saída. Así, por exemplo, esta pode ser unha función. Esta é unha función chamada func. E leva tres entradas a, b e c. E dentro desa caixa negra, que Non sei exactamente o que fai, pero procesa as entradas dalgún xeito e entón dá unha única saída, neste caso, Z. Agora, para facelo un pouco menos abstracta, nós Podería dicir que quizais nós teñen unha función chamada engadir que leva tres entradas a, b, e C e procesa a saída dalgún xeito dentro da caixa negra para producir unha única saída. Polo tanto, neste caso, se engadir leva de 3, 6, e 7. Nalgún lugar no engadir a función, fariamos esperar que sexan engadidos en conxunto para producir a saída, que é 3 máis 6 máis 7 ou 16. Así mesmo, ten unha función chamada multi que leva dúas entradas, a e b, procesa-los de algunha maneira, tales que a saída da función é o produto das dúas entradas. As dúas entradas multiplicados xuntos. 4 e 5 sendo pasado para multi, algo pasa, a saída esperamos é 20. Por que chamalo dunha caixa negra? Ben, se non estamos escribindo o Funciona nós mesmos, o que fixemos un pouco ata agora CS50. Vimos de impresión f, por exemplo, que é unha función que non escribimos nós mesmos, pero usar o tempo. Se non estamos escribindo as funcións de nós mesmos, nós realmente non precisa saber como é realmente aplicada baixo o capó. Así, por exemplo a caixa negra I acabo de mostrar á multiplicación, multi a, b poderían ser defined-- e este é só podería ser algún pseudocode-- definida como unha saída veces b. Isto ten sentido, certo. Se temos unha función chamada multi que leva dúas entradas. Era de esperar que a saída sería ser as dúas entradas multiplicados xuntos, un veces b. Pero tamén podía ser multi aplicado como este, temos unha variable de contador para prepare-se para dentro gráfica a 0. E, despois, repetir este proceso b veces engadir ao contador. Por exemplo, se multiplicarmos por 3a 5B, poderiamos dicir definir contador a 0, Repita cinco veces, engadir 3 a barra. Entón, imos comezar a 0 e entón nós facemos iso cinco veces 3, 6, 9, 12, 15. É o mesmo resultado. Nós aínda obter 3 veces só 5 a aplicación é diferente. Iso é o que queremos dicir cando dicimos que unha caixa negra. Significa só que realmente non me importa como é aplicado baixo o capó sempre que a saída é o que se espera. En realidade, iso é parte do contrato do uso de funcións, especialmente funcións que os outros escriben. O comportamento é sempre vai ser típico, imprevisible a base do nome da función. E é por iso que é realmente importante cando escribir funcións ou cando outras persoas escribir funcións que pode usar, os que teñen funcións nomes claros e relativamente obvias, e están ben documentados. Que é certamente o caso para a función de impresión como f. Entón, por que usar funcións? Ben, como dixen anteriormente, se escribirmos todo o noso código dentro das cousas principais pode ser moi pesado e realmente complicado. Funcións connosco permitir que a capacidade para organizar as cousas e acabar con un problema moi complicado en unha morea sub partes máis gerenciáveis. Funcións tamén nos permiten simplificar o proceso de codificación. É moito máis fácil de depurar a 10 función de liña versus unha liña 100 función ou unha función 1000 liña. Se só temos de depuración pequenos anacos de cada vez, ou escribir pequenos anacos no momento, fai que a experiencia de programación moito mellor. Confío en min sobre iso. Para rematar, se escribirmos funcións que pode reutilizar estas varias partes. As funcións poden ser reciclados. Poden ser utilizados en un ou outro programa. Xa escribiu a función, o único que cómpre facer é dicir que o programa onde atopar esa función. Temos benvida a reciclaxe e utilización de imprimir f hai máis de 40 anos. Pero ela só foi escrita unha vez. Moi útil, non. Todo ben. Así, as funcións son grandes. Sabemos diso. Agora imos comezar a escribilos. Imos comezar a recibir Los nos nosos programas. Co fin de facer iso, o primeiro cousa que facemos é declarar a función. Cando declarar unha función o que está facendo, basicamente, está dicindo o compilador, hey, só para ti saber, Estou indo a ser escrito unha función máis tarde e aquí está o que vai ollar como. A razón para isto é porque compiladores poida facer algunhas cousas estrañas, se ven un conxunto de símbolos que non está familiarizado. Entón, nós só dar o compilador un heads-up, eu estou creando unha función e só pode facer iso. Declaracións de función xeralmente se está organizando o seu código dun xeito que os outros poderá comprender e facer uso, normalmente quere poñer todo das súas declaracións de función na parte superior do seu código, dereita antes de comezar a escribir principal mesmo. E convenientemente, hai unha forma moi normal que cada declaración de función segue. Todos eles moi ben coma este. Hai tres partes a unha función declaración, tipo de retorno, nome, e lista de argumentos. Agora, o tipo de retorno é o tipo de variable a saída da función vontade. Así, por exemplo, se pensamos de volta un minuto para a multiplicación de dous números de función, o que esperamos se multiplicarmos un enteiro por un número enteiro a saída será probablemente un enteiro, non. Multiplicado dous enteiros xuntos, obtén un número enteiro. Así, o tipo de retorno que función sería int. Nome é o que quere para chamar a súa función. Este é probablemente o menos importante parte da declaración de función, en termos de funcionalidade. Pero é, en realidade, probablemente, un das partes máis importantes da declaración da función en termos saber o que a función realmente fai. Se nomear súa función f g ou h ou misterio ou algo parecido, probablemente vai conseguir un pouco tropezou tentando para lembrar o que facer estas funcións. Por iso, é importante dar o seu nomes significativos da función. Para rematar, lista de argumentos está a lista separada por comas de todas as entradas para a función, cada un dos cales ten un tipo e un nome. Polo tanto, non só ten que especificar o tipo de variable a saída da función vontade, tamén quere especificar que tipo e tipos de variables as función será aceptar como entradas. Entón imos facer un exemplo aquí. Nós só dar un ollo nunha forma máis concreta. Entón aquí está un exemplo dunha función declaración de que unha función quere engadir dous enteiros xuntos. A suma dos dous números enteiros vai ser un enteiro tamén, como acabamos discutidos. E así o tipo de retorno, aquí en verde, sería int. Isto só nos que engadir dous ints di vai, ao final do día, de saída, ou cuspir de volta para nós, un número enteiro. Dado que esta función fai nós quero darlle un nome significativo. Fai dous ints parece axeitada, tendo en conta estamos levando dous enteiros como insumos e espero que xuntalas. Pode ser un pouco de un incómodo nome e, a verdade, esta función Probablemente non é necesario xa que temos a adición operador, se se lembra da nosa discusión dos operadores, anteriormente. Pero imos só dicir que por mor de argumento de que esta función é útil e por iso imos chamalo de engadir dous ints. Para rematar, esta función ten dúas entradas. Cada un dos cales é un número enteiro. Entón temos esa coma lista separada de entradas. Agora nós xeralmente queren dar un nome de cada unha delas de xeito que xa se poden usar dentro da función. Os nomes non son terriblemente importante. Neste caso, non necesariamente ten algún significado a elas asociadas. Así, podemos só chamar-lles a e b. Isto é totalmente bo. Se, con todo, atopa se nunha situación onde os nomes das variables pode ser realmente importante, pode querer chamalos algo que non sexa a eb para darlles algo máis simbolicamente significativa. Pero, neste caso, nós realmente non saber algo sobre a función. Nós só queremos engadir dous enteiros. Entón imos chamar os números enteiros a e b. Isto é un exemplo. Por que non tomar unha segunda para pensar sobre este, como escribir unha función declaración de que unha función Multiplica dous números de punto flotante? Vostede recorda o que un número de punto flotante é? O que sería esa función declaración parece? En realidade, eu recomendo que deter o vídeo aquí e levar canto tempo precisa. Pense sobre o que esta declaración de función sería? Cal sería o tipo de retorno que? O que sería un nome significativo ser? Cales serían as entradas de ser? Entón, por que non deixar o vídeo aquí e escribirlle unha declaración de función para unha función que multiplicaría dous números de punto flotante en conxunto. Esperamos que deixou o vídeo. Entón imos dar un ollo a un exemplo dunha declaración posible. Float gráfica dous reais flotan x, y flotador. O produto de dous números de punto flotante, recordar que son coma nós representan números reais ou números con valores decimais en c, vai ser un número de punto flotante. Cando multiplica un decimal por un decimal, probablemente está indo a obter un decimal. Quere darlle un nome relevante. Multiplique dous reais parece ben. Pero podería realmente chamalo multi dous coches alegóricos, ou flotadores gráfica. Algo así, sempre que deu algún significado real ao que esa caixa negra ía facer. E unha vez máis, neste caso, non parece ter calquera significado conectado para os nomes dos variables que estamos pasando en, por iso, só chamalos x e y. Agora, se chamalos de algo outra cousa, iso é totalmente bo. En realidade, se fixo esta declaración en vez usando no canto de dúos de Carrozas, se recorda dobres que son unha diferente xeito a máis precisamente especificar números reais ou flotante variables de punto. Isto é totalmente ben tamén. Ou un deses sería óptimo. En realidade, hai varios combinacións diferentes de formas de declarar esta función. Pero estes son dous moi bos. Temos declarada unha función, iso é gran. Dixemos que o compilador é, o que imos facer. Agora imos realmente escribir esa función. Imos darlle unha definición, de xeito que dentro da caixa negra comportamento previsible está pasando. En realidade, estamos multiplicando dous reais números, ou engadindo números xuntos, ou facendo o que quere que sexa que pedimos a nosa función facer. Entón, en realidade, imos tentar definir multiplicar dous reais que acabamos falou sobre un segundo atrás. Agora, o inicio a definición de función parece case exactamente o mesmo como unha declaración de función. Eu teño os dous aquí. Na parte superior está a declaración de función, tipo, nome, argumento separados por comas lista, punto e coma. A coma indica que que é unha declaración de función. O inicio da función definición parece case exactamente o mesmo, tipo, nome, separados por comas lista de argumentos, sen punto e coma, abrir chaveta. A clave de apertura, así como temos está a facer co principal, significa que estamos agora empezando a definir o que ocorre no interior da caixa negra que decidimos chamar gráfica dous reais. Aquí está un xeito de implementar lo. Poderiamos dicir, poderiamos declarar unha nova variable do tipo float chamado produto e asignar esa variable ao valor x veces y. E, a continuación, devolver o produto. Que significa retorno aquí. Ben retorno é o camiño que indican que é así estamos pasando a saída de volta para fóra. Así retornar algo, é o mesmo que, esta é a saída da caixa negra. Entón, iso é como facelo. Aquí está outra forma de implementar lo. Poderíamos só retornar x veces y. x é un float. y é un float. Entón x veces y tamén é un float. Nós nin sequera precisa crear outra variable. Entón esta é unha forma diferente de aplicar a mesma caixa negra exacta. Agora tome un momento, deter o vídeo de novo, e tentar definir engadir dous ints, que é a outra función que falou un momento atrás. Unha vez aquí, engada a función declaración, e así o punto e coma, e unha chaveta aberta e un rizado pechado cinta para indicar onde imos encher no contido de engadir dous ints, de xeito que se define o particular comportamento dentro da caixa negra. Entón, deter o vídeo. E aproveitar o máximo de tempo precisa probar e axustar unha implementación de engadir dous ints, tales que cando da función xera un valor, isto ocorre, en realidade, de retorno a suma das dúas entradas. Así como no exemplo anterior, hai moitas maneiras diferentes que podería aplicar engadir dous ints. Aquí está un. En aquí en laranxa teño só tiña uns comments-- Eu só engade algúns Comentarios para indicar o que está a suceder en cada liña de código. Entón eu declarar unha variable chamada suma do tipo int. Digo suma é igual a máis b. É alí onde está realmente facendo a adición dun traballo e B en conxunto. E eu volver suma. E iso ten sentido, porque suma é unha variable de tipo int. E cal é o tipo de datos que este función dime que vai para a saída? Int. Entón, eu estou volvendo suma, que é unha variable enteira. E iso ten sentido, xa que temos declarada e definida a nosa función facer. Agora tamén podes configurar a función deste xeito, int suma é igual a un plus B-- saltar esa step-- primeiro e, a continuación, voltar suma. Agora pode que tamén aplicou-lo deste xeito, que moi non recomendo. Isto é malo para un estilo cousa moi mala e deseño, pero fai, de feito, o traballo. Se tomar este código, que é int engadir malo víbora punto c, e usalo. Realmente non engadir dous enteiros xuntos. É unha aplicación moi pobre deste comportamento particular. Pero non funciona. É só para ilustrar o punto que realmente non importa o que pasa dentro a caixa negra, sempre xa que ten a saída que esperamos. Esta é unha caixa negra mal deseñado. Pero ao final do día, fai saída aínda a suma de máis b. Todo ben. Entón, nós temos funcións declarou. E nós función definida. Entón, iso é moi bo. Agora imos comezar a usar as funcións que xa declarou e definimos. Para chamar a un function-- é realmente moi easy-- todo o que tes que facer é pasalo argumentos adecuados, argumentos do tipo de datos que espera, e a continuación, asignar o retorno valor desa función e isto-- escusa me-- asignar o valor de retorno desa función a algo do tipo correcto. Entón imos dar un ollo iso na práctica nun ficheiro chamado víbora 1 punto c, que Eu teño no meu CS50 IDE. Entón aquí está víbora 1 punto c. A principios vedes que eu teño miña inclúe, libra inclúen, IO estándar, e CS50 dot h. E entón eu teño a miña declaración de función. Este é o lugar onde eu estou dicindo que eu son o compilador vai estar escribindo un función chamada engadir dous ints. Vai unha saída variable do tipo integer. Iso é o que esta parte é aquí mesmo. E entón eu teño dúas entradas para que unha e b, cada un dos cales é un número enteiro. Dentro do principal, eu preguntar ao usuario entrada dicindo, me dar un enteiro. E son solicitados para esquecer int, que é unha función que está incluído na biblioteca CS50. E iso está almacenado x, unha variable enteira. A continuación, leva-los a outro número enteiro. Estivemos con outro enteiro e almacenar que en y. E entón, aquí na liña 28, é onde facemos a nosa chamada de función. Estamos dicindo, iguais int z engadir 2 ints x coma y. Entender por que isto ten sentido? x é unha variable de tipo enteiro e y é unha variable de tipo enteiro. Entón, iso é bo. Isto ten sentido co que a nosa función declaración na liña 17 parece. A lista de entrada separadas por comas espera dous números enteiros, a e b. Nese caso, podemos chamá- eles o que queremos. El só espera dous números enteiros. E X é un número enteiro e y é un número enteiro. Isto funciona. E sabemos que a función está pasando para producir un enteiros ben. E así estamos almacenando o saída da función, engadir dous ints, nun tipo enteiro variable, que estamos chamando z. E entón podemos dicir, a suma de i por cento por cento e é por cento i i. x, y e z, respectivamente, enche os i de por cento. Cal é a definición de engadir dous ints parece? É moi sinxelo. É un dos nós só vin un segundo atrás, int suma é igual a un importe incrementado b retorno. Será que este traballo? Imos gardar o ficheiro. E, a continuación, para abaixo aquí no meu terminal Vou facer unha víbora, e eu limpar miña pantalla. Eu estou indo a aumentar o zoom, porque sei é un pouco difícil de ver. Entón, nós compilar este programa como unha víbora. Entón o que podemos facer dot barra víbora 1. Dáme un número enteiro, 10. Déame outro enteiro, 20. A suma de 10 e 20 é de 30. Por iso, fixemos unha chamada de función exitosa. Pode realizar a función de novo, negativo 10, 17 suma negativa de 10 e 17 é de 7. Esta función funciona. Ten o comportamento que esperamos que el. E así fixemos unha exitosa función, definición, declaración, e unha chamada de función exitosa. Parella variado puntos sobre funcións antes de completar esta sección. Recordar da nosa discusión de tipos de datos, anteriormente, que funciona ás veces pode levar hai entradas. En tal caso, declarar a función como tendo unha lista de argumentos baleiro. Vostede recorda o que o máis función común vimos ata agora que leva unha lista de argumentos é nulo? É principal. Lembre tamén que a función ás veces realmente non ten unha saída. Nese caso, declaramos a función como tendo un tipo de retorno void. Imos completar esta sección afrontar un problema práctica. Entón aquí está o problema colocado para fóra. Quero que escribir unha función chamado triángulo válido. Que esta función debe facer é tomar tres números reais que representan as lonxitudes dos tres lados dun triángulo como os seus parámetros, ou os seus argumentos, ou a súa Insumos outro conxunto de sinónimos que se pode atopar. Esta función debe quere saída de verdadeiro ou falso dependendo se estes tres lonxitudes son capaces de facer un triángulo. Vostede recorda do tipo de datos que nós usado para indicar verdadeiro ou falso? Agora, como aplicar iso? Ben sei que hai unha parella de normas relativas triángulos que son realmente útiles para saber. Un triángulo só pode ter lados con lonxitude positivo. Isto ten sentido. Probablemente está dicindo, duh. A outra cousa a notar con todo, é que a suma das lonxitudes de calquera dous lados do triángulo ten que ser maior que o lonxitude do terceiro lado. Isto é realmente verdade. Non podes ter un triángulo de lados 1, 2 e 4, por exemplo, por 1 máis 2 non é maior que 4. Polo tanto, estas son as regras que determinar se ou non a tres entradas poden concebivelmente formar un triángulo. Entón, tome un par de minutos e declarar e, a continuación, definir esta función chamada válido triángulo, de tal xeito que se realmente ten o comportamento especificado aquí. Ha imprimir verdadeira se eses tres lados son capaces de que entende un triángulo, e falso se non Listo para ver como fixo? Aquí está unha implementación triángulo de válido. Non é o único. O seu pode variar un pouco. Pero iso se fai, de feito, teñen o comportamento que esperamos. Declaramos a nosa función no arriba, bool triángulo válido flotar x flotador flotador y z. Entón, de novo, esta función leva tres números reais como os seus argumentos, flotante variables de valor punto, e emite un verdadeiro ou falso valor, que é un valor booleano, recall. É por iso que o tipo de retorno é bool. A continuación, definir a función. O primeiro que facemos é verificar para asegurarse que todas as partes son positivos. Se X é superior a 0, ou, se y é igual a 0, ou, se Z é inferior ou igual a 0, que non pode posiblemente ser un triángulo. Eles non teñen lados positivos. E así podemos volver false nesa situación. A continuación, imos comprobar para asegurarse que cada par de entradas é maior que a terceira. Así, se x máis y é menos que ou igual a Z, ou, se x máis z é menos que ou igual a Y, ou, se y máis z é menor que ou igual a X, que tampouco pode ser un triángulo válido. Entón, nós return false novo. Supoñendo que nós pasamos tanto dos controis aínda que, entón podemos volver true. Porque estes tres lados son capaces de returning-- de crear un triángulo válido. E é iso. Xa declarada e definida. E pode ser capaz de agora utilizar e chamar esa función. Excelente traballo. Eu son Doug Lloyd. Este é CS50.