0% encontró este documento útil (0 votos)
8 vistas23 páginas

Tema 7

Cargado por

kickstartup20
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
8 vistas23 páginas

Tema 7

Cargado por

kickstartup20
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Fundamentos de

Programación
Centro de la UNED de Barbastro
msierra@[Link]

Tema 7. Funciones y Procedimientos


Tema 7 Funciones y Procedimientos
• Este tema tiene gran importancia. Introduce el concepto de
subprograma (función o procedimiento). Esto supone dos saltos
importantes: la posibilidad de desarrollar programas mucho mayores
de forma estructurada y la introducción de un nuevo nivel de
abstracción a nuestros programas.
• Contenido
• Concepto de subprograma
• Funciones (definición, uso)
• Procedimientos (definición, uso)
• Paso de argumentos (valor, referencia)
• Visibilidad
7.1.- Concepto de subprograma
• Un subprograma es una parte de un programa que se desarrolla por
separado y se utiliza invocándolo mediante un nombre simbólico.
• Se debería utilizar para resolver fragmentos de programa que tengan
cierto sentido en sí mismos. Igual que un programa sirve para resolver
un problema, un subprograma serviría para resolver un subproblema.
• Tiene dos utilidades principales:
• en programas complejos para dotarlos de cierta estructura y legibilidad
• cuando se repiten operaciones similares. Definiendo una operación en un
subprograma separado su código se escribirá una sola vez aunque se use en
muchos puntos del programa.
Funciones
• Una función es un subprograma con
operaciones significativas que dan como
resultado un valor simple y único en función
de ciertos parámetros
Definición de funciones
• El primer paso en el manejo de una función es declarar su interfaz (la forma en que
será invocada). Esta declaración incluye
• su nombre
• los argumentos que necesita con el correspondiente tipo para cada uno de ellos
• el tipo de resultado que proporciona.

TipoResultado Nombre funcion (Tipo1 argumento1, Tipo2 argumento2,...)


float Potencia (float x, int n)

• Los argumentos que aparecen en la cabecera son los argumentos formales. Estos
argumentos no son variables del programa sino sólo los nombres simbólicos que
sirven para formalizar la definición de la función, permitiendo hacer referencia a los
argumentos en la definición de los cálculos.
Definición de funciones
• La definición completa de la función se compone de la cabecera seguida de un cuerpo de función, que
tiene la misa estructura que un bloque de programa completo. En el cuerpo de la función aparecerá la
sentencia return que sirve para devolver como valor de la función el resultado de los cálculos
realizados.

• La sentencia return viene acompañada de una expresión que debe ser del mismo tipo que lo que
devuelve la función, puesto que representa este valor. La ejecución de la función acaba cuando se
ejecuta cualquiera de las sentencias return.

float Potencia (float x, int n) {


float p = 1.0;
for (int k = 1: k < n; k++) {
p = p * x;
}
return p;
}
Uso de funciones
• Para usar una función en los cálculos de un programa se invoca dicha función escribiendo su
nombre y a continuación, entre paréntesis, los valores concretos (parámetros reales) de los
argumentos separados por comas.

• Esta invocación representa un valor del tipo de la función que podrá ser usado como
operando en una expresión aritmética o en general en cualquier parte del programa en que
sea válido escribir una expresión de ese tipo.

• Es obligatorio que los valores suministrados para los argumentos (argumentos reales)
correspondan en número y tipo con los argumentos en la definición (argumentos formales).

float resultado;
resultado = Potencia (2.0,3) + Potencia (3.0,3);
Uso de funciones
• El efecto de la invocación se describe de la siguiente
manera:
1.- Se evalúan las expresiones de los valores de los
argumentos.
2.- Se asignan dichos valores a los correspondientes
argumentos formales.
3.- Se ejecuta el código de la definición de la función, hasta
alcanzar una sentencia de retorno.
4.- El valor retornado se usa en el punto donde se invocó la
función.
Funciones predefinidas y estándar
• Funciones predefinidas
• Funciones predefinidas son aquellas que forman parte del propio lenguaje de
programación. Están siempre disponibles en cualquier programa. C y C++ tienen
pocas y a cambio ofrecen gran número de operadores. C+- no tiene funciones
predefinidas.
• Funciones estándar
• Funciones estándar son funciones redactadas previamente y disponibles en algún
módulo redactado de antemano. Las operaciones que hemos utilizado de escritura
y lectura pertenecen a este grupo y por eso teníamos que incluir la sentencia
#include <stdio.h> al principio de nuestros programas.
• Algunos ejemplos de estas funciones podemos encontrarlas en los módulos
• ctype.h: funciones que facilitan clases de caracteres. Por ejemplo:
• bool isalpha(char c) devuelve un resultado bool (si o no) si c es una letra
• math.h: funciones matemáticas. Por ejemplo
• float sqrtf (float x) devuelve el valor de la raiz cuadrada de x.
Procedimientos
• Una función es un subprograma que realiza una
determinada acción. A diferencia de las funciones un
procedimiento no tiene como objetivo en general
devolver un valor obtenido por cálculo.
• Agrupa una sentencia o un grupo de sentencias que
realizan una acción y permite darles un nombre por el
que se les puede identificar posteriormente. Se pueden
parametrizar mediante una serie de argumentos.
Definición de procedimientos
• La definición de un procedimiento es prácticamente igual a la de
una función . Esta declaración incluye
• su nombre
• los argumentos que necesita con el correspondiente tipo para cada uno
de ellos
• la palabra reservada void que indica que no devuelve resultado de
ningún tipo

void NombreProcedimiento (Tipo1 argumento1, Tipo2 argumento2,...)


void EscribeLinea (int longitud)
Definición de procedimientos
• Los argumentos que aparecen en la cabecera son los argumentos formales. Estos argumentos no son
variables del programa sino sólo los nombres simbólicos que sirven para formalizar la definición del
procedimiento, permitiendo hacer referencia a los argumentos en la definición de los cálculos.
• La definición completa de la función se compone de la cabecera seguida de un cuerpo de función,
que tiene la misa estructura que un bloque de programa completo. En el cuerpo de la función
aparecerá la sentencia return que sirve para devolver como valor de la función el resultado de los
cálculos realizados.
• Si se desea utilizar la sentencia return se puede utilizar para forzar la finalización del procedimiento.

void EscribeLinea (int longitud) {


for (int i = 0; i < longitud; i++) {
printf("=");
}
printf("\n");
}
Uso de procedimientos
• Para usar un procedimiento se invoca dicho procedimiento escribiendo su nombre y a
continuación, entre paréntesis, los valores concretos (parámetros reales) de los
argumentos separados por comas.
• Es obligatorio que los valores suministrados para los argumentos (argumentos reales)
correspondan en número y tipo con los argumentos en la definición (argumentos
formales).
EscribeLinea(10);
• El efecto de la invocación se describe de la siguiente manera:
1.- Se evalúan las expresiones de los valores de los argumentos.
2.- Se asignan dichos valores a los correspondientes argumentos formales.
3.- Se ejecuta el código de la definición de la función, hasta alcanzar el final del bloque o una sentencia
de retorno.
4.- El programa que invocó al procedimiento continúa en el punto siguiente a la sentencia de llamada.
• Procedimientos estándar: de la misma forma que existen funciones estándar existen
procedimientos estándar.
Paso de argumentos
• Paso de argumentos por valor
• Los argumentos representan valores que se transmiten desde el programa que llama
hacia el subprograma.
• Los argumentos reales en la llamada al subprograma pueden darse en general en
forma de expresiones, cuyos tipos de valor deben ser compaatible en asignación con
los tipos de los argumentos formales.
• Los elementos usados como argumentos en la llamada al subprograma no pueden
ser modificados por la ejecución de las sentencias del programa.
• El paso de argumentos por valor consta de los siguientes pasos:
1.- Se evalúan las expresiones de los argumentos reales usados en la llamada
2.- Los valores obtenidos se copian en los argumentos formales
3.- Los argumentos formales se usan como variables dentro del subprograma. Si a estas variables se
les asignan nuevos valores, no se estará modificando el argumento real, sino la copia.
Paso de argumentos
• Paso de argumentos por referencia
• El mecanismo de paso por valor no permite que el subprograma modifique directamente
una variable pasada como argumento. Para ello se usa el paso de argumentos por
referencia.
• El paso de argumentos por referencia se indica en la cabecera del subprograma,
anteponiendo el símbolo & al nombre del argumento formal.
• Si un argumento se pasa por referencia ya no será válido usar como argumento real una
expresión. El argumento real usado en la llamada debe ser necesariamente una variable
del mismo tipo. Esta variable será usada en el subprograma como si fuera suya, es decir,
la asignación de un nuevo valor al argumento modifica realmente la variable externa
pasada como argumento.
• El paso de argumentos por referencia puede describirse como:
1.- Se seleccionan las variables usadas como argumentos reales
2.- Se asocia cada variable con el argumento formal correspondiente
3.- Se ejecutan las sentencias del subprograma como si los argumentos formales fuesen los argumentos
reales.
Visibilidad. Estructura de bloques
• Como norma general podemos decir que desde un punto del programa se
pueden "ver" los elementos definidos hasta ese momento.

• La definición de un subprograma está formada por una cabecera o interfaz y


un bloque de código que es el cuerpo del subprograma. Este bloque de
código constituye una "barrera de visibilidad" que hace que los elementos
declarados en el interior del cuerpo de un subprograma no sean visibles
desde el exterior.

• Los elementos definidos en el ámbito más externo son elementos globales


mientras que los elementos definidos en el interior del bloque de un
subprograma son elementos locales a dicho subprograma.
Recursividad de subprogramas
• Un subprograma puede realizar una invocación a sí mismo.
Este concepto se llama recursividad.
• Este concepto se debe aplicar mediante casos generales
(necesitan invocaciones recursivas para obtener la
solución) y casos minimales, que se resuelven de forma
directa sin necesidad de llamadas recursivas. Una
invocación al algoritmo generará una serie de llamadas
que se irán acercando a uno de los casos minimales.
Problemas en el uso de subprogramas
• Uso de variables globales. Efectos secundarios
• La transparencia referencial es una cualidad de los programas que consiste en
que una llamada al subprograma pueda predecirse simplemente con la
información contenida en el código de la llamada.
• La transparencia referencial se garantiza si el código del subprograma utiliza
solamente los elementos mencionados en la lista de argumentos o definidos
como elementos locales. Cuando un subprograma modifica alguna variable
externa, se dice que está produciendo efectos secundarios o laterales.
• La transparencia referencial es especialmente importante en las funciones. Si
una función no produce efectos laterales y todos sus argumentos se pasan por
valor se dice que es una función pura.
• El uso de subprogramas con efectos laterales debe hacerse siempre con
precaución.
Problemas en el uso de subprogramas
• Redefinición de elementos
• Cuando en el interior de un bloque se define un elemento local con el mismo
nombre que otro elemento global en realidad se está redefiniendo dicho
nombre y el elemento global se queda inaccesible. Se dice que el nombre local
oculta o "hace sombra" al nombre global
• Se debería evitar este tipo de comportamiento.
• Doble referencia
• Se produce doble referencia (en inglés aliasing) cuando una misma variable se
referencia con dos nombres distintos. Esto puede ocurrir en la invocación de
subprogramas con argumentos pasados por referencia, en dos situaciones:
• cuando un subprograma utiliza una variable externa que también se le pasa como argumento.
• cuando para utilizar un subprograma se le pasa la misma variable en dos o más argumentos.
Funciones y procedimientos son ambos subprogramas.

Función Procedimiento
• Da como resultado un valor simple y único • NO devuelve un resultado
• Cabecera incluye tipo que devuelve antes • Cabecera incluye void antes del nombre
del nombre
• Sentencia return es obligatoria. Debe • Sentencia return no es obligatoria
devolver una expresión del mismo tipo
que el declarado en la cabedera.
• Representa expresión parametrizada • Representa una acción
Parámetros

Definición Invocación
Parámetro formal Parámetro real
• El parámetro de la definición • El parámetro de la invocación
• Incluye nombre y tipo • Debe coincidir en tipo con parámetro
formal
Paso de argumentos

Paso por valor Paso por referencia


• No hay indicación especial en definición • Definición incluye símbolo &
• El parámetro real puede ser cualquier • El parámetro real sólo puede ser una
expresión que devuelva un valor del tipo del variable
parámetro real
• En la invocación, se mantiene un
• En la invocación, se realiza una copia del valor
enlace/referencia entre el parámetro
del parámetro real sobre el parámetro formal
y se pierde cualquier otro tio de vínculo
formal y la variable que se ha utilizado
como parámetro real
Visibilidad
• Elementos definidos anteriormente
• Bloque de código {} + cabecera es barrera que no permite visibilidad de exterior a interior
• Pb. Redefinición de elementos si hay elemento local con mismo nombre que global

• Pb. Doble referencia. Misma variable se referencia con dos nombres distintos

Global Local
• Elementos externos • Elementos internos
• Programa principal • Subprogramas

También podría gustarte