Diferencia entre revisiones de «PrInf16: Introducción a las funciones»
(→Contenido de la práctica) |
|||
| (No se muestran 9 ediciones intermedias del mismo usuario) | |||
| Línea 1: | Línea 1: | ||
| − | {{ Práctica de Informática | Introducción a las funciones | PrInf15: Juego: acertar en un polígono | PrInf17: | + | {{ Práctica de Informática | Introducción a las funciones | PrInf15: Juego: acertar en un polígono | PrInf17: Algunos ejemplos con funciones }} |
| − | + | ||
Hasta ahora hemos escrito programas que interactuaban directamente con el usuario. Cada programa tenía una única entrada, una única salida y realizaba una única tarea por medio de un algoritmo. Cuando los programas son más complejos, es útil dividir el programa en ''funciones''. Una función encapsula un trozo de código, y permite acceder a él del mismo modo que usamos las funciones internas de [[Octave UPM]]. Por ejemplo, cuando llamamos a la función ''sqrt'', le pasamos un valor de entrada, y nos devuelve su raíz cuadrada. Nosotros no sabemos cómo se realiza esta tarea, el algoritmo que realiza esta tarea es interno a la función, y ni sabemos ni necesitamos saber cómo se calcula. En esta práctica vamos a ver cómo programar nuestras propias funciones, para que puedan reutilizarse en otros programas. En próximas prácticas veremos cómo las funciones facilitan el diseño de programas complejos, estructurando cada parte en entrada-algoritmo-salida, y combinándolas usando una metodología denominada ''diseño top-down''. | Hasta ahora hemos escrito programas que interactuaban directamente con el usuario. Cada programa tenía una única entrada, una única salida y realizaba una única tarea por medio de un algoritmo. Cuando los programas son más complejos, es útil dividir el programa en ''funciones''. Una función encapsula un trozo de código, y permite acceder a él del mismo modo que usamos las funciones internas de [[Octave UPM]]. Por ejemplo, cuando llamamos a la función ''sqrt'', le pasamos un valor de entrada, y nos devuelve su raíz cuadrada. Nosotros no sabemos cómo se realiza esta tarea, el algoritmo que realiza esta tarea es interno a la función, y ni sabemos ni necesitamos saber cómo se calcula. En esta práctica vamos a ver cómo programar nuestras propias funciones, para que puedan reutilizarse en otros programas. En próximas prácticas veremos cómo las funciones facilitan el diseño de programas complejos, estructurando cada parte en entrada-algoritmo-salida, y combinándolas usando una metodología denominada ''diseño top-down''. | ||
| Línea 11: | Línea 10: | ||
Es importante visualizar este vídeo para afianzar las competencias adquiridas en esta práctica: | Es importante visualizar este vídeo para afianzar las competencias adquiridas en esta práctica: | ||
* [[Prog20: Funciones]] | * [[Prog20: Funciones]] | ||
| + | Los dos vídeos posteriores explican en qué consisten las variables locales, que son ''internas'' a la función, y por tanto no aparecen en el espacio de trabajo. No se explican en esta práctica, y por tanto son opcionales, pero ayudan a entender el concepto de función: | ||
| + | * [[Prog21: Variables locales (1/2)]] | ||
| + | * [[Prog22: Variables locales (2/2)]] | ||
== Comandos que se aprenderán en esta práctica == | == Comandos que se aprenderán en esta práctica == | ||
| Línea 39: | Línea 41: | ||
Las funciones tienen exactamente la misma estructura, por lo que es fácil transformar este programa en una función: | Las funciones tienen exactamente la misma estructura, por lo que es fácil transformar este programa en una función: | ||
| − | {{ matlab | codigo = function s = | + | {{ matlab | codigo = function s = miRaiz(A) |
% Funcion que calcula la raiz de A | % Funcion que calcula la raiz de A | ||
| − | nPasos = 25;L = A;W = 1;for k=1:nPasos | + | |
| − | s = L;}} | + | nPasos = 25; |
| + | L = A; | ||
| + | W = 1; | ||
| + | for k=1:nPasos | ||
| + | L = (L+W)/2; | ||
| + | W = A/L; | ||
| + | end | ||
| + | |||
| + | % Salida de datos | ||
| + | s = L; | ||
| + | end % Fin de la funcion}} | ||
| + | La definición de la función fuerza la estructura en entrada-algoritmo-salida. Si observamos la primera línea, vemos que ''s'' es el valor de salida de la función, ''A'' es la entrada, y la función se llama ''MiRaiz''. Los nombres de las funciones tienen las mismas restricciones que los nombres de variables, es decir, no pueden contener espacios, símbolos que sean operadores de [[Octave UPM]], etc. | ||
| + | |||
| + | ¿Cómo guardamos la función? Cada función tiene que guardarse en su propio fichero ''.m''. '''El nombre del fichero es muy importante'''. El fichero tiene que tener exactamente el mismo nombre que la función. En el caso anterior, '''tenemos que guardar la función en un fichero de nombre ''miRaiz.m'''''. | ||
| + | |||
| + | En una función, nunca se pide información al usuario dentro del cuerpo de la función. Todos los datos que la función necesite para realizar su tarea tienen que aparecer como argumentos de entrada a la función. Del mismo modo, las funciones no muestran los valores de salida por pantalla, sino que los devuelven usando los argumentos de salida. Aunque a veces podemos incluir algún mensaje escrito en la pantalla dentro de una función, a efectos informativos, o sobre todo, cuando estamos depurando una función, para ver cómo cambian internamente los valores de las variables. | ||
| + | |||
| + | ¿Cómo podemos usar ahora esta función en nuestros programas? Igual que cualquier otra función de [[Octave UPM]]. Por ejemplo, tras escribir la función en el fichero ''miRaiz.m'', y guardarlo en el directorio actual, podemos usarla en la línea de comandos: | ||
| + | {{#tag:source|>> miRaiz(100) | ||
| + | ans = 10 | ||
| + | >> miRaiz(20) | ||
| + | ans = 4.4721|lang="matlab"}} | ||
| + | {{ Tarea | Comprueba que la función ''miRaiz'' da resultados correctos, comparando su resultado con el que da la función ''sqrt''. Compara con ambas funciones las raíces de <math>10^5</math> y de <math>10^9</math>.}} | ||
| + | {{ Tarea | ¿Qué ocurre si intentamos ejecutar directamente el fichero ''miRaiz.m''? ¿Por qué ocurre esto? }} | ||
== Ejercicio post-práctica == | == Ejercicio post-práctica == | ||
| + | En la función anterior hemos fijado que el valor de ''nPasos'' sea siempre 25. Modifica la función para que acepte un segundo argumento de entrada, ''nPasos'', y sea el usuario el que indique el valor del número de pasos. | ||
| + | Luego, modifica de nuevo la función para que el argumento ''nPasos'' sea opcional. Si el usuario no lo indica, debe ser igual a 25. En el vídeo [[Prog23: Funciones con varios argumentos de entrada]] se explica cómo realizar esta tarea. | ||
[[Categoría:Prácticas de Informática]] | [[Categoría:Prácticas de Informática]] | ||
Revisión actual del 12:15 9 ago 2013
| Práctica de Informática | |
|---|---|
| Introducción a las funciones | |
| Práctica anterior | Siguiente práctica |
| Este artículo es un guión de prácticas de Informática | |
Hasta ahora hemos escrito programas que interactuaban directamente con el usuario. Cada programa tenía una única entrada, una única salida y realizaba una única tarea por medio de un algoritmo. Cuando los programas son más complejos, es útil dividir el programa en funciones. Una función encapsula un trozo de código, y permite acceder a él del mismo modo que usamos las funciones internas de Octave UPM. Por ejemplo, cuando llamamos a la función sqrt, le pasamos un valor de entrada, y nos devuelve su raíz cuadrada. Nosotros no sabemos cómo se realiza esta tarea, el algoritmo que realiza esta tarea es interno a la función, y ni sabemos ni necesitamos saber cómo se calcula. En esta práctica vamos a ver cómo programar nuestras propias funciones, para que puedan reutilizarse en otros programas. En próximas prácticas veremos cómo las funciones facilitan el diseño de programas complejos, estructurando cada parte en entrada-algoritmo-salida, y combinándolas usando una metodología denominada diseño top-down.
Contenido
1 Requisitos previos
Es importante haber realizado todas las prácticas anteriores antes de realizar esta práctica.
2 Vídeos posteriores
Es importante visualizar este vídeo para afianzar las competencias adquiridas en esta práctica:
Los dos vídeos posteriores explican en qué consisten las variables locales, que son internas a la función, y por tanto no aparecen en el espacio de trabajo. No se explican en esta práctica, y por tanto son opcionales, pero ayudan a entender el concepto de función:
3 Comandos que se aprenderán en esta práctica
| function |
4 Contenido de la práctica
En la práctica 10 escribimos un programa que aproximaba el valor de la raíz cuadrada de un número. Aunque en esa práctica escribimos diferentes versiones del código, nosotros vamos a usar la siguiente para esta práctica:% Entrada de datos
A = input('Introduce el numero cuya raiz quieres calcular: ');
% Algoritmo
nPasos = 25;
L = A;
W = 1;
for k=1:nPasos
L = (L+W)/2;
W = A/L;
end
% Salida de datos
fprintf('La raiz de %.4f es %.4f\n', A, L);Es decir, el programa consta de las siguientes partes:
- Entrada de datos, que en este caso es el valor de A, el número cuya raíz vamos a calcular.
- Algoritmo, aproximación a la raíz cuadrada que vimos en la práctica 10, en este caso con 25 pasos fijos para realizar la aproximación.
- Salida de datos, que informa al usuario del valor de la raíz usando cuatro decimales.
Las funciones tienen exactamente la misma estructura, por lo que es fácil transformar este programa en una función:
function s = miRaiz(A)
% Funcion que calcula la raiz de A
nPasos = 25;
L = A;
W = 1;
for k=1:nPasos
L = (L+W)/2;
W = A/L;
end
% Salida de datos
s = L;
end % Fin de la funcionLa definición de la función fuerza la estructura en entrada-algoritmo-salida. Si observamos la primera línea, vemos que s es el valor de salida de la función, A es la entrada, y la función se llama MiRaiz. Los nombres de las funciones tienen las mismas restricciones que los nombres de variables, es decir, no pueden contener espacios, símbolos que sean operadores de Octave UPM, etc.
¿Cómo guardamos la función? Cada función tiene que guardarse en su propio fichero .m. El nombre del fichero es muy importante. El fichero tiene que tener exactamente el mismo nombre que la función. En el caso anterior, tenemos que guardar la función en un fichero de nombre miRaiz.m.
En una función, nunca se pide información al usuario dentro del cuerpo de la función. Todos los datos que la función necesite para realizar su tarea tienen que aparecer como argumentos de entrada a la función. Del mismo modo, las funciones no muestran los valores de salida por pantalla, sino que los devuelven usando los argumentos de salida. Aunque a veces podemos incluir algún mensaje escrito en la pantalla dentro de una función, a efectos informativos, o sobre todo, cuando estamos depurando una función, para ver cómo cambian internamente los valores de las variables.
¿Cómo podemos usar ahora esta función en nuestros programas? Igual que cualquier otra función de Octave UPM. Por ejemplo, tras escribir la función en el fichero miRaiz.m, y guardarlo en el directorio actual, podemos usarla en la línea de comandos:
>> miRaiz(100)
ans = 10
>> miRaiz(20)
ans = 4.4721
| |
Tarea: | ¿Qué ocurre si intentamos ejecutar directamente el fichero miRaiz.m? ¿Por qué ocurre esto? |
5 Ejercicio post-práctica
En la función anterior hemos fijado que el valor de nPasos sea siempre 25. Modifica la función para que acepte un segundo argumento de entrada, nPasos, y sea el usuario el que indique el valor del número de pasos.
Luego, modifica de nuevo la función para que el argumento nPasos sea opcional. Si el usuario no lo indica, debe ser igual a 25. En el vídeo Prog23: Funciones con varios argumentos de entrada se explica cómo realizar esta tarea.