DOUG LLOYD: De acuerdo. Así que ahora vamos a una entrada Realmente gran tema, funciones. Hasta ahora, en el curso, todo el programas que hemos estado escribiendo se han escrito en el interior de la principal. Son programas muy simples. Usted no necesita tener todos estos ramas y cosas que hacer. Sólo podemos hacerlo todo dentro del principal y no conseguir terriblemente abrumador. Pero a medida que el curso sigue y a medida que comienza a desarrollar programas independiente, probablemente van para empezar a obtener una gran cantidad más de 10 o 15 líneas. Usted puede obtener cientos o miles o decenas de miles de líneas de código. Y en realidad no es que loco un pensamiento. Como tal, no es probablemente una buena idea para mantener todo el interior de la principal. Puede ser un poco difícil de encontrar lo que estás buscando si haces eso. Afortunadamente, a pesar de C, y más o menos cualquier otro lenguaje de programación que podrían trabajar, permite que escribamos funciones. Y yo sólo voy a tomar una rápida lado aquí mencionar que las funciones es un área de la informática. Y verás muchos más de ellos en varios puntos a lo largo del curso y si continúa adelante. Donde hay una gran cantidad de sinónimos de la misma palabra. Así que llamamos a las funciones. Pero también puede ser que oírlos referido como procedimientos, o métodos, sobre todo, si tienes alguna vez hecho ninguna programación orientada a objetos antes-- y no te preocupes si no, no tiene un gran deal-- pero en orientado auditoría idiomas son llamados con frecuencia métodos. A veces se les llama subrutinas. Pero lo que realmente todos se refieren a la misma idea básica. Vamos a ver lo que esa idea es. ¿Qué es una función? Bueno una función es realmente nada más que un cuadro negro. Un cuadro negro que tiene un conjunto de cero o más entradas y una sola salida. Así, por ejemplo, este podría ser una función. Esta es una función llamada func. Y se necesita tres entradas a, b y c. Y dentro de esa caja negro, nos No sé exactamente lo que hace, pero procesa las entradas de alguna manera y entonces da una sola salida, en este caso, z. Ahora, para que sea un poco menos abstracto, nos Podríamos decir que tal vez tener una función llamada añadir que tiene tres entradas a, b, y c y procesa la salida de alguna manera dentro de la caja de negro para producir una única salida. Así pues, en este caso, si añadir toma 3, 6 y 7. En algún lugar dentro de la añadir la función, lo haríamos esperar que se sumarán para producir la salida, la cual es 3 más 6 más 7 o 16. Del mismo modo, tiene una función llamada mult que tiene dos entradas, A y B, los procesa de alguna manera que la salida de la función es el producto de las dos entradas. Las dos entradas multiplican entre sí. 4 y 5 se traspasó mult, algo sucede, el resultado que esperamos es 20. ¿Por qué lo llamamos un cuadro negro? Bueno, si no estamos escribiendo la Funciones a nosotros mismos, lo que hemos hecho un poco en lo que va CS50. Hemos visto de impresión f, por ejemplo, que es una función que no escribimos nosotros mismos, sino que hace uso de todo el tiempo. Si no estamos escribiendo las funciones de nosotros mismos, que realmente no necesitamos saber cómo es realmente implementado bajo el capó. Así por ejemplo, el cuadro negro I sólo le mostró para la multiplicación, mult a, b podría ser defined-- y esto es sólo algunos pseudocode-- podría ser definida como la producción a veces b. Eso tiene sentido, a la derecha. Si tenemos una función llamada mult que tiene dos entradas. Es de esperar que la salida sería ser las dos entradas multiplican entre sí, unas veces b. Pero también podría ser mult implementado como este, tenemos un contador variable ponerse en el interior de mult a 0. Y luego repetimos este proceso b veces agregan un marcador. Por ejemplo, si multiplicamos por 3 bis 5b, podríamos decir establecer contador a 0, repetir cinco veces, añadir 3 al marcador. Así que empezamos a 0 y luego hacemos esto cinco veces 3, 6, 9, 12, 15. Es el mismo resultado. Nosotros aún así obtener 3 veces 5 solo la implementación es diferente. Eso es lo que queremos decir cuando decimos que un cuadro negro. Sólo significa que realmente no importa cómo se implementa bajo el capó siempre y cuando la salida es lo que esperamos. De hecho, eso es parte del contrato de la utilización de las funciones, en particular funciones que otros escriben. El comportamiento siempre va ser típico, impredecible basado en el nombre de la función. Y es por eso que es muy importante a la hora de escribir funciones o cuando otras personas escriben funciones que puede utilizar, que dichas funciones tienen claras, nombres relativamente obvias, y están bien documentados. Lo cual es ciertamente el caso para la función como la impresión f. Entonces, ¿por qué utilizamos funciones? Bueno, como he dicho antes, si escribimos todo nuestro código dentro de las cosas principales puede ser realmente complicado y realmente complicado. Funciones nos permiten la capacidad para organizar las cosas y romper un problema muy complicado en muchas partes sub más manejables. Las funciones también nos permiten simplificar el proceso de codificación. Es mucho más fácil de depurar un 10 función de línea frente a una línea de 100 función o una función de línea de 1000. Si tan sólo tenemos que depurar pequeñas piezas a la vez, o escribir pequeños trozos de la época, que hace que la experiencia en programación mucho mejor. Confía en mí en eso. Por último, si escribimos funciones que puede reutilizar esas diversas partes. Las funciones pueden ser reciclados. Pueden ser utilizados en un programa u otro. Ya has escrito la función, todo lo que hay que hacer es decirle a ese programa dónde encontrar esa función. Hemos estado reciclando y utilizando imprimir f por más de 40 años. Pero sólo fue escrito una vez. Bastante útil, derecha. Correcto. Así funciones son grandes. Lo sabemos. Ahora vamos a empezar a escribir ellos. Empecemos conseguir ellos en nuestros programas. Con el fin de hacer eso, la primera Lo que hacemos es declarar la función. Cuando se declara una función lo que estás haciendo, básicamente, está diciendo que el compilador, bueno, para que lo sepas, Voy a estar escribiendo una función más adelante y esto es lo que va a ser similar. La razón de esto es porque los compiladores puede hacer algunas cosas extrañas si ven un conjunto de símbolos que no están familiarizados. Así que sólo nos damos el compilador una heads up, estoy creando una función y que va a hacer esto. Declaraciones de función general si usted está organizando su código de manera que otros podrán entender y hacer uso de, por lo general, quiere poner todo de sus declaraciones de funciones en la parte superior de su código, a la derecha antes de empezar a escribir incluso principal. Y convenientemente, hay una forma muy estándar que cada declaración sigue a la función. Ellos todos más o menos el siguiente aspecto. Hay tres partes a una función declaración, el tipo de devolución, nombre, y la lista de argumentos. Ahora el tipo de retorno es qué tipo de variable de la salida de función voluntad. Así por ejemplo, si pensamos volver un Hace minutos a la multiplicación de dos función de los números, ¿qué esperamos si multiplicamos un número entero por un número entero la salida será Probablemente un número entero, a la derecha. Multiplica dos enteros juntos, se obtiene un entero. Así que el tipo de retorno de esa función sería int. Nombre es lo que quieres para llamar a su función. Este es probablemente el menos importante parte de la declaración de la función, en términos de funcionalidad. Pero en realidad es probablemente uno de las partes más importantes de la declaración de la función en términos de saber lo que la función de realidad hace. Si el nombre de su función f o g o ho misterio o algo así, usted está probablemente va a conseguir un poco tropezó tratando recordar cuáles son esas funciones lo hacen. Así que es importante darle a su nombres significativos de función. Por último, la lista de argumentos es la lista separada por comas de todas las entradas a su función, cada uno de los cuales tiene un tipo y un nombre. Así que no sólo tiene usted que especificar qué tipo de variable la salida de la función de la voluntad, también desea especificar qué tipo y tipos de variables las la función estará aceptando como entradas. Así que vamos a hacer un ejemplo aquí. Vamos a echar un vistazo a uno más concreto. Así que aquí está un ejemplo de una función declaración para una función que añadiría dos enteros juntos. La suma de dos números enteros va a sea ​​un número entero, así, como acabamos discutido. Y por lo que el tipo de retorno, aquí en verde, sería int. Eso sólo nosotros que añadir dos ints dice va a, al final del día, salida o escupir de nuevo a nosotros, un entero. Teniendo en cuenta lo que hace esta función nos que desee darle un nombre significativo. Añadir dos enteros parece apropiado, teniendo en cuenta estamos tomando dos enteros como entradas y es de esperar sumarlos. Puede ser que sea un poco engorroso nombre y, francamente, esta función es probable que no sea necesario ya que contamos con la adición operador, si usted recuerda de nuestra discusión de los operadores, con anterioridad. Pero digamos que por el bien de argumento de que esta función es útil y así lo vamos a llamar añadir dos enteros. Por último, esta función toma dos entradas. Cada uno de los cuales es un número entero. Así que tenemos esta comas lista separada de los insumos. Ahora por lo general queremos dar un nombre a cada uno de ellos de modo que puedan ser utilizados dentro de la función. Los nombres no son muy importantes. En este caso, no lo hacemos necesariamente tener algún significado unido a ellos. Así que sólo les podemos llamar a y b. Eso es totalmente bien. Sin embargo, si usted encuentra en una situación donde los nombres de las variables en realidad podría ser importante, es posible que desee llamar algo distinto de A y B darles algo más simbólicamente significativa. Pero en este caso, no lo hacemos de verdad saber algo más acerca de la función. Sólo queremos sumar dos números enteros. Así que sólo llamaremos los números enteros a y b. Eso es un ejemplo. ¿Por qué no te tomas un segundo pensar acerca de esto, ¿cómo escribir una función declaración para una función que multiplica dos números de punto flotante? ¿Te acuerdas de lo que es un número de punto flotante es? ¿Qué sería de esta función declaración parece? Realmente te recomiendo que pausar el video aquí y toma la cantidad de tiempo que necesita. Piense en lo que esto declaración de la función sería? ¿Cuál sería el tipo de cambio? ¿Cuál sería un nombre significativo? ¿Cuáles serían las entradas? Así que ¿por qué no hace una pausa en el video aquí y escribir en marcha una declaración de función para una función que se multiplicaría dos números de punto flotante juntos. Esperemos que pausa el video. Así que vamos a echar un vistazo a un ejemplo de una sola declaración posible. Flotador mult dos reales flotan x, float y. El producto de dos números de punto flotante, que recordar son la forma en que representar números reales o números con valores decimales en c, va a ser un número de punto flotante. Cuando multiplicas un decimal por un número decimal, usted está probablemente va a conseguir un decimal. ¿Quieres darle un nombre relevante. Multiplicar dos reales parece bien. Pero usted podría realmente llamar mult dos flotadores o boyas mult. Nada de eso, siempre y cuando dio un significado real a lo que este cuadro negro que iba a hacer. Y de nuevo, en este caso, no lo hacemos parece tener ningún significado adjunta a los nombres de la las variables que estamos pasando en, así que sólo los llamamos x e y. Ahora bien, si usted los llama algo otra cosa, eso es totalmente bien. De hecho, si lo has hecho esta declaración en su lugar utilizando dobles vez de flotadores, si recuerdas que los dobles son una diferente manera de forma más precisa especificar los números reales o variables de punto flotante. Eso es totalmente bien también. Cualquiera de los que estaría bien. De hecho, hay varios diferentes combinaciones de maneras de declarar esta función. Pero estos son dos muy buenos. Hemos declarado una función, eso es genial. Le hemos dicho que el compilador lo que Es decir, lo que vamos a hacer. Ahora vamos a escribir en realidad esa función. Vamos a darle una definición, por lo que dentro de la caja de negro comportamiento predecible está sucediendo. De hecho, estamos multiplicando dos reales números juntos, o la adición de números juntos, o hacer lo que sea que pedimos nuestra función de hacer. Así que, de hecho, vamos a tratar de definir multiplicar dos números reales que acabamos hablado hace un segundo. Ahora bien, el principio de una definición de función se ve casi exactamente el mismo como una declaración de la función. Tengo dos de ellos aquí. En la parte superior es la declaración de la función, tipo, nombre, separados por comas argumento lista, punto y coma. El punto y coma indica que que es una declaración de la función. El principio de la función definición se ve casi exactamente la misma, tipo, nombre, separados por comas lista de argumentos, sin punto y coma, abrir corchete. La llave de apertura, al igual que que hemos estado haciendo con el principal, significa que estamos ahora comenzando a definir lo que sucede dentro de la caja negro que hemos decidido llamar mult dos reales. Aquí es una manera de ponerlo en práctica. Podríamos decir, podríamos declarar un nuevo variable del flotador llamado tipo de producto y asignar dicha variable al valor de x veces y. Y luego devolver el producto. ¿Qué significa aquí retorno. Bueno retorno es el camino indicamos que es como estamos pasando la salida de vuelta. Así devolver algo, es la misma que, esta es la salida de la caja de color negro. Así que esa es la forma de hacerlo. Aquí hay otra manera de ponerlo en práctica. Podríamos simplemente volver x veces y. x es un flotador. y es un flotador. Así que x veces y también es un flotador. Ni siquiera necesitamos crear otra variable. Así que esa es una manera diferente de aplicar el mismo cuadro negro exacta. Ahora tome un momento, pausar el video de nuevo, y tratar de definir sumar dos enteros, que es la otra función que nos hablado hace un momento. De nuevo aquí, he puesto la función declaración, por lo que el punto y coma, y un corchete abierto y un rizado cerrada abrazadera para indicar dónde vamos a llenar en los contenidos de sumar dos enteros, de manera que definimos lo particular el comportamiento dentro de la caja de color negro. Así que hacer una pausa en el vídeo. Y tomar todo el tiempo que hay que probar y definir una implementación de sumar dos enteros, tales que cuando la función de salida a un valor, lo hace, de hecho, el regreso la suma de las dos entradas. Así que al igual que el ejemplo anterior, hay varias maneras diferentes que se podía aplicar añadir dos enteros. Aquí hay uno. Aquí en naranja tengo sólo tenía algunos comments-- Yo sólo he añadido algunos comentarios para indicar lo que está sucediendo en cada línea de código. Así que me declaro una variable llamada suma de tipo int. Digo suma es igual a más b. Ahí es donde en realidad estamos haciendo el trabajo añadiendo A y B juntos. Y vuelvo suma. Y eso tiene sentido porque suma es una variable de tipo int. Y ¿cuál es el tipo de datos que esta función me dice que va a la salida? Int. Así que estoy volviendo suma, que es una variable entera. Y eso tiene sentido teniendo en cuenta lo que hemos declarado y definido nuestra función hacer. Ahora usted también puede definir la función de esta manera, int suma es igual a un plus B-- saltar esa primero step-- y luego, volver suma. Ahora usted podría tener también implementado de esta manera, que le recomiendo no lo recomiendo. Esto es malo para un estilo cosa y muy mal diseño, pero lo hace, de hecho, el trabajo. Si toma este código, que es int agregar mal punto sumador de c, y lo utilizan. En realidad, se le añade dos enteros juntos. Es una aplicación muy mala de este comportamiento en particular. Pero funciona. Es sólo para ilustrar el punto de que no lo hacemos de verdad importa lo que sucede en el interior el cuadro de negro, siempre como lo ha hecho la salida que esperamos. Este es un cuadro negro mal diseñado. Pero al final del día, lo hace de salida sigue siendo la suma de a más b. Correcto. Así que nos hemos declarado funciones. Y hemos función definida. Así que eso es muy bueno. Ahora vamos a empezar a utilizar las funciones que hemos declarado y hemos definido. Para llamar a un function-- en realidad bastante easy-- todo lo que tiene que hacer es pasarlo argumentos apropiados, argumentos del tipo de datos que espera, y a continuación, asignar el retorno valor de esa función y esto-- excusa mí-- asignar el valor de retorno de esa función a algo del tipo correcto. Así que vamos a echar un vistazo a esto en la práctica en un archivo llamada víbora 1 punto c, que Tengo en mi CS50 IDE. Así que aquí está el sumador 1 punto c. A principios veis que yo tengo mi incluye, libras incluyen, norma IO, y el punto CS50 h. Y luego tengo mi declaración de la función. Aquí es donde estoy diciéndole al compilador que soy va a estar escribiendo una función llamada sumar dos enteros. Se va a una salida variable de tipo entero. Eso es lo que esta parte está aquí. Y luego tengo dos entradas a un y b, cada uno de los cuales es un número entero. En el interior de la principal, le pido al usuario de entrada diciendo, dame un entero. Y se les pide que se olvide int, que es una función que se incluye en la biblioteca CS50. Y eso se almacena en x, una variable entera. Luego impulsarlos para otro número entero. Tenemos otro entero y almacenar que, en y. Y luego, aquí en la línea 28, que es donde realizamos nuestra llamada a la función. Estamos diciendo, iguales z int añadir 2 enteros x comas y. ¿Ves por qué esto tiene sentido? x es una variable de tipo entero y y es una variable de tipo entero. Así que eso es bueno. Eso tiene sentido con lo que nuestra función declaración en la línea 17 se parece. La lista de entrada separada por comas espera dos enteros, a y b. En ese caso, podemos llamar ellos lo que queramos. Simplemente espera que dos enteros. Y x es un número entero e y es un número entero. Eso funciona. Y sabemos que la función va a la salida de un enteros también. Y así estamos almacenando el salida de la función, sumar dos enteros, en un tipo entero variable, lo que estamos llamando z. Y entonces podemos decir, la suma de i ciento y ciento por ciento i es i. x, y y z respectivamente rellenar los ciento i de. ¿Cuál es la definición de añaden dos enteros parecen? Es muy sencillo. Es uno de los que acabo de ver hace un segundo, int suma es igual a una suma más b regreso. ¿Esto funciona? Salvemos el archivo. Y luego aquí en mi terminal Voy a hacer sumador 1, y yo aclaro la pantalla. Voy a hacer un zoom porque sé que es un poco difícil de ver. Así que compilamos este programa como sumador 1. Así que podemos hacer punto slash sumador 1. Dame un entero, 10. Dame otro entero, 20. La suma de 10 y 20 es 30. Así que hicimos una llamada a la función con éxito. Puede ejecutar la función de nuevo, negativo 10, 17 suma de negativo 10 y 17 es 7. Esta función funciona. Tiene el comportamiento que esperamos que lo haga. Y así hemos hecho un éxito función, definición, declaración, y una llamada a la función con éxito. Miscelánea Pareja puntos sobre las funciones antes de concluir esta sección. Recordemos de nuestra discusión de los tipos de datos, previamente, que las funciones a veces puede tomar ninguna entrada. Si ese es el caso, declarar la función como tener una lista vacía argumento. ¿Recuerda lo que el más función común que hemos visto hasta el momento que toma una lista de argumentos es nulo? Su principal. Recordemos también que la función a veces en realidad no tienen una salida. En ese caso, declaramos la función como tener un tipo de retorno void. Vamos a concluir esta sección hacer frente a un problema de la práctica. Así que aquí está el problema presentado. Yo quiero que escribas una función llamado triángulo válida. Lo que esta función debe hacer es tomar tres números reales que representan las longitudes de los tres lados de un triángulo como sus parámetros, o sus argumentos, o su inputs-- otro conjunto de sinónimos que pueden surgir. Esta función debe ya sea de salida verdadero o falso dependiendo de si esas tres longitudes son capaces de hacer un triángulo. ¿Recuerdas el tipo de datos que utilizamos para indicar verdadero o falso? Ahora, ¿cómo se implementa esto? Bien saben que hay un par de normas relativas a triángulos que son realmente útil saber. Un triángulo sólo puede tener lados con longitud positiva. Eso tiene sentido. Probablemente usted está diciendo, duh. La otra cosa a tener en cuenta sin embargo, es que la suma de las longitudes de cualquier dos lados del triángulo tiene que ser mayor que la longitud del tercer lado. Eso es realmente cierto. No se puede tener un triángulo de lados 1, 2 y 4, por ejemplo, porque plus 1 2 no es mayor que 4. Así que esas son las reglas que determinar si o no los tres entradas pueden formar concebible un triángulo. Así que toma un par de minutos y declarar y definir esta función se llama válida triángulo, de tal manera que en realidad tiene el comportamiento especificado aquí. Se dará salida a cierto si esos tres lados son capaces de que comprende un triángulo, y false en caso contrario Listo para ver cómo lo hizo? Aquí hay una aplicación triángulo de válido. No es el único. El tuyo puede variar ligeramente. Pero éste lo hace, de hecho, tienen el comportamiento que esperamos. Declaramos nuestra función en el muy superior, bool triángulo válida flotar x flotador y flotador z. Así que de nuevo, esta función lleva tres números reales como sus argumentos, flotando variables de valor punto, y emite una verdadera o falsa valor, que es un booleano, el recuerdo. Así que por eso el tipo de retorno es bool. Luego definimos la función. Lo primero que hacemos es comprobar para asegurarse que todos los lados son positivos. Si x es menor o igual a 0, o si y es igual a 0, o si z es menor o igual a 0, que no puede posiblemente ser un triángulo. No tienen aspectos positivos. Y así podemos volver falso en esa situación. A continuación, comprobamos para asegurarse que cada par de entradas es mayor que la tercera. Así que si x más y es menos o igual a z, o si x más z es menor o igual a Y, o si y más z es menor o igual a x, que tampoco puede haber un triángulo válida. Así que volvemos falsa de nuevo. Suponiendo que pasamos tanto de los controles sin embargo, entonces podemos volver realidad. Debido a que esas tres lados son capaces de returning-- de crear un triángulo válida. Y eso es. Ahora ha declarado y definido. Y usted puede ser capaz de ahora usar y llamar a esta función. Buen trabajo. Soy Doug Lloyd. Esto es CS50.