República Bolivariana de Venezuela
Área de Computación
Curso de C #
Facilitador:
Prof. Bassam Asfur
Programación Modular
Es un método de resolución de problemas que consiste en resolver de forma
independiente los subproblemas que se obtienen de una descomposición del
problema general
Un módulo debe ofrecer un grupo de servicios diseñados para que el esto
del programa pueda interactuar con él
Es más fácil resolver un problema complejo cuando se rompe en piezas
manejables.
¡Divide y Vencerás!
Programación Modular
La base fundamental de este paradigma de programación es el módulo
Un módulo en un conjunto de rutinas que prestan un servicio específico.
Una rutina, subrutina o subprograma, como idea general, se presenta
como un algoritmo separado del algoritmo principal, el cual permite resolver
una tarea específica
Decimos que algo es modular si es construido de manera tal que se facilite su
ensamblaje, acomodamiento flexible y reparación de sus componentes
La modularidad da una mejor compresión del problema y reduce el tamaño
del código
Generalmente se hace la asociación de un módulo como una caja negra. Se
sabe que entra y que sale pero no como se procesa
Programación Modular
En la programación modular se debe asegurar los siguientes preceptos
● máxima cohesión
● mínimo acoplamiento entre módulos
Un módulo debe ofrecer un grupo de servicios que sin lugar a dudas deben
ir juntos, por ejemplo:
La Clase Math
Algunas Ventajas
Facilitan la escritura y depuración de un programa
Localización rápida de errores
La modificación de un módulo no afecta a los demás
Un grupo de instrucciones que se repite en varias partes de un programa
puede incluirse en un módulo y llamarlo en el programa.
Funciones y Procedimientos
Es evidente, que si está metodología, nos lleva a tratar con subproblemas,
entonces también tengamos la necesidad de poder crear y trabajar con
subprogramas para resolverlos.
A estos subprogramas se les suele llamar módulos, de ahí viene el nombre de
programación modular. En los lenguajes de programación disponemos de dos
tipos de módulos: los procedimientos y las funciones.
Elementos de la declaración de una subrutina
Un nombre único en el ámbito: nombre de la función con el que se identifica y se
distingue de otras. No podrá haber otra función ni procedimiento con ese nombre
(salvo sobrecarga o polimorfismo en programación orientada a objetos).
Un tipo de dato de retorno: tipo de dato del valor que la subrutina devolverá al
terminar su ejecución.
Una lista de parámetros: especificación del conjunto de argumentos (pueden ser
cero, uno o más) que la función debe recibir para realizar su tarea.
Funciones y Procedimientos
Los procedimientos y funciones son subprogramas que realizan tareas
específicas. Para invocarlo, es decir, para hacer que se ejecute, basta con escribir
su nombre en el cuerpo de otro procedimiento o en el programa principal.
La diferencia entre procedimiento y función está dada por su utilización dentro
de nuestro diseño de la solución, un procedimiento realiza una tarea y al finalizar
retorna al punto donde fue invocado, no así la función al ejecutarse obtiene un
valor el cual es retornado al punto donde fue invocado por ejemplo raíz cuadrada
es una función por que retorna un resultado.
Declaración de Funciones y Procedimientos
Al igual que los identificadores (Variables), los procedimientos y funciones
deben declararse dentro del programa.
La declaración de un procedimiento NO indica a la computadora que ejecute las
instrucciones dadas, sino que indica a la computadora cuáles son estas
instrucciones y dónde están localizadas cuando sea necesario.
Funciones y Procedimientos
FUNCIONES
Una función es una un conjunto de instrucciones, con un nombre asociado, que
cumple las siguientes características:
•Tiene uno o más parámetros de entrada.
•Tiene un parámetro exclusivamente de salida y de tipo simple (es decir, lo que
devuelve). Muchos lenguajes de programación no requieren el hecho de que el
parámetro sea simple pero en esta asignatura se considerará la versión más
purista.
•Todos los valores de entrada son necesarios y suficientes para determinar el
valor de salida.
Funciones y Procedimientos
PARÁMETROS DE UN PROCEDIMIENTO O FUNCIÓN
Los parámetros o argumentos de una función o procedimiento son el mecanismo
que permite el intercambio de datos entre la función o procedimiento que es
llamado y el que realiza la llamada.
En el momento de definir una función o procedimiento, es necesario especificar
los parámetros, con el tipo asociado. En este momento, los parámetros se
denominan formales.
Por otra parte, en el momento de hacer la llamada a una función o procedimiento,
cuando se utilizan literales o variables como lista de parámetros (que deben
emparejarse con los parámetros formales en cuanto al tipo y orden). Estos
parámetros se denominan reales.
Funciones y Procedimientos
Parámetros de entrada
Permiten aportar datos a función o procedimiento por parte del algoritmo que le
invoca.
Un parámetro real asociado con un parámetro formal de entrada, puede ser un
literal, una variable o incluso el valor que se obtendrá como resultado de la
evaluación de una expresión.
La definición de un parámetro formal de entrada se hace anteponiendo el
modificador delante del nombre del parámetro formal.
Modificando un parámetro formal de entrada nunca se modifica el
correspondiente parámetro real.
Funciones y Procedimientos
Parámetros de salida
Permiten que la acción pueda devolver resultados de su ejecución al algoritmo
que invoca.
El parámetro real asociado con un parámetro formal de este tipo debe ser
necesariamente una variable en la que almacenar el resultado devuelto por la
acción. Esa variable no tiene porque haber sido inicializada con anterioridad.
Cualquier acción o modificación realizada sobre el parámetro formal de salida
se refleja, de forma inmediata, sobre el correspondiente parámetro real.
Para la definición de un parámetro formal de salida se debe anteponer el
modificador delante del nombre formal.
Funciones y Procedimientos
Parámetros de entrada/salida
Los parámetros de entrada/salida permiten aportar datos de entrada en un
procedimiento o función, que ésta los modifique y los devuelva como resultado
al algoritmo que la invoca.
El parámetro real asociado con un parámetro formal declarado de entrada /salida,
necesariamente debe ser una variable donde almacenar el valor devuelto por el
procedimiento o función invocada y debe haber sido inicializado previamente a
la invocación.
La declaración de un parámetro de entrada/salida se hará anteponiendo el
modificador E/S delante del nombre del parámetro formal en la definición de la
función.
Funciones y Procedimientos
Descomposición de una tarea en Funciones y Procedimientos
La mayor complejidad a la hora de aplicar programación estructurada es saber
decidir correctamente cuándo extraer código para colocarlo en un procedimiento o
función, y cuándo utilizar una u otra.
El proceso de identificación de procedimientos y funciones se basa en el empleo de
cuestiones lógicas (experiencia y sentido común), ciertas heurísticas y una regla
Básica.
Existen procedimientos y funciones que realizan procesos de entrada de datos, otras
de salida de datos y otras de procesamiento de datos.
Un procedimiento o función no debe combinar los tres tipos de tareas.
Funciones y Procedimientos
Entre las heurísticas a tener en cuenta se encuentran las siguientes:
1. Cada vez que se necesita operar con ciertos tipos de datos compuestos (como
registros o vectores) suele resultar necesario disponer de procedimientos para la
lectura de esos datos, otras para la visualización de los mismos y finalmente otras
que implementen las distintas operaciones necesarias.
2. Las operaciones de inicialización de un algoritmo que se ejecutan antes de
empezar a funcionar dicho algoritmo (lecturas de ficheros de disco, inicialización
de estructuras de datos) se colocan normalmente en un procedimiento (muchas
veces llamado iniciar) si bien, de resultar ser este procedimiento demasiado
extenso o complejo, se puede subdividir, a su vez, en otros procedimientos.
Esto mismo ocurre con las operaciones que se deben ejecutar justo antes de
terminar el algoritmo (volcados a disco, etc.). Por otra parte, si las operaciones son
muy sencillas, no será probablemente interesante realizar este proceso.
Funciones y Procedimientos
3. Las operaciones de búsqueda y ordenación en cualquier estructura de datos se
implementarán normalmente en procedimientos.
4. Cada una de las funcionalidades que un algoritmo proporcionará a un usuario
un procedimiento. Tomando el enunciado del problema, muchas veces se pueden
identificar los procedimientos (de más alto nivel) a crear prestando atención a los
verbos presentes.
5. Un indicativo de que un procedimiento o función es demasiado grande suele ser
el número de líneas que ocupa: si contiene más de 25 – 30 líneas (no se Visualizará
totalmente en una sola pantalla) es demasiado grande y, por lo tanto, debe ser
descompuesta, a su vez, en procedimientos o funciones más pequeños.
Funciones y Procedimientos
6. Cuando en un algoritmo se repita más de una vez la misma tarea con una
diferencia pequeña, esta diferencia pequeña se representará en los parámetros de un
procedimiento o función que será capaz de adaptarse a todas las circunstancias en
las que pueda ser empleado.
En todo caso, hablar de diferencia pequeña implica que las instrucciones ejecutadas
son las mismas y que, por ejemplo la única diferencia se encuentra en el número de
veces que se ejecuta una composición iterativa o cuestiones muy similares que se
puedan parametrizar.
Un error muy común es emplear un procedimiento para dos acciones totalmente
diferentes empleando un parámetro que indique cuál de ellas ejecutar.
7. La interfaz de un procedimiento o función se diseñará para asegurar la máxima
reutilización.
Funciones y Procedimientos
ÁMBITO DE VARIABLES
Las variables sólo se pueden referenciar desde la función o procedimiento en la que
están declaradas. Así, es fundamental restringir el uso de variables a las funciones o
procedimientos en las que están declaradas para no sufrir errores de programación
debida a efectos laterales.
El ámbito de una variable local o parámetro formal v declarada dentro de una
función o procedimiento M es la propia función o procedimiento, cuyas
instrucciones pueden modificarla o consultarla.
A veces, esto puede complicarse debido a que ciertos lenguajes de programación,
como Pascal, permiten crear funciones (locales) dentro de funciones, de manera
que las variables locales y parámetros formales creados para la contenedora sirven
para todas las locales. Otros lenguajes, como C++, permiten crear bloques dentro
de funciones o procedimientos, de manera que las variables creadas dentro de ellos
tienen como ámbito sólo el bloque mencionado, y sin embargo se puede acceder al
resto de variables de la función.
Variables Globales y Locales
Ámbito de las variables
a) Variables globales: Están declaradas fuera del cuerpo de cualquier función y
antes de que sea utilizada por ninguna de ellas (se recomienda declararlas al
comienzo del programa antes de las definiciones de las funciones).
El ámbito de estas variables es global, es decir, que son visibles por cualquier
función y cualquiera de ellas puede modificar su valor. La vida de estas variables
va ligada a la del programa, se crean cuando empieza la ejecución del programa
y pueden ser utilizadas hasta que se acabe el mismo.
b) Variables locales: Están declaradas dentro de la función, bien dentro del
cuerpo o bien como parámetros formales. El ámbito de la variable se reduce
al de la función y fuera de esta no tienen presencia, es decir, sólo puede ser
utilizada por la función donde esta declarada
Variables Globales y Locales
Ámbito de las variables
El intercambio de información entre procedimientos y funciones debe producirse
siempre a través de los parámetros y nunca a través de variables globales.
Cualquier otro dato cuyo uso sólo tenga sentido dentro de una función o
procedimiento, se declarará como una variable local a ésta, incluso en el caso de
que una variable similar con el mismo identificador y tipo se use en otros
procedimientos y funciones.
Tal y como se ha comentado con respecto a las variables globales, una variable
local de una función o procedimiento oculta a la variable global con el mismo
identificador.
Variables Globales y Locales
Por su parte, las variables locales pueden ser:
Variables automáticas: Son eliminadas cuando se termina la ejecución de la
función donde han sido declaradas, es decir, su vida se limita al tiempo que está
activa la función.
Los parámetros formales son variables automáticas
Variables estáticas: A pesar de que sólo pueden ser utilizadas por la función
donde han sido declaradas, no son destruidas al terminar ésta.
Por lo tanto, mantienen su valor para la próxima vez en que sea llamada la
función. Se declaran, precediendo el nombre del tipo por la palabra "static".
Variables Globales y Locales
EFECTOS LATERALES
Efecto lateral es cualquier modificación de una variable producida en un
procedimiento o función en la que la variable no está declarada.
Estos efectos deben evitarse pues introducen dependencias indeseables (la
función o procedimiento depende entonces de una variable global, por ejemplo),
que son causas de errores muy difíciles de detectar.
PRECEDENCIA DEL NOMBRE
En un algoritmo pueden definirse identificadores de variables idénticos siempre
y cuando se definen en procedimientos o funciones distintas.
PROCESO DE INVOCACIÓN DE UN PROCEDIMIENTO O FUNCIÓN
Al ejecutar un programa, el sistema operativo asigna cierta cantidad de
memoria al mismo. El programa en ejecución (proceso en memoria) organiza el
espacio asignado atendiendo al siguiente esquema:
TEXT es la zona de la memoria donde se almacenan las instrucciones del programa.
Muchas veces, en TEXT se almacenan también las constantes, al ser esta zona de la
memoria normalmente de sólo lectura.
En DATA se almacenan las variables globales (no las constantes).
PROCESO DE INVOCACIÓN DE UN PROCEDIMIENTO O FUNCIÓN
El STACK (o pila de llamadas) permite al sistema operativo seguir el flujo de
ejecución del programa.
Finalmente, el HEAP es una zona ampliable de la memoria donde se almacenan
estructuras de datos que pueden variar de tamaño con el tiempo.
Cuando aparece una llamada a una función o procedimiento M, se crea en la pila
(stack) un registro de activación o entorno de ejecución, denominado marco o
frame de la pila, en donde se alojan las variables locales y parámetros formales
declarados en la función o procedimiento, así como, la dirección de retorno a la
instrucción posterior a la invocación.
Una vez creado el entorno, se cede el control a la primera instrucción de M. Si M
llama a otra función o procedimiento M', se creará un nuevo frame en la pila, y
se procede a la primera instrucción de M'. De este modo se pueden ir apilando
llamadas (de ahí, su nombre) mientras sea necesario.
PASO DE PARAMETROS
Mecanismos de paso de parámetros en los lenguajes de programación
Los mecanismos descritos anteriormente, de paso de parámetros de entrada,
salida y entrada/salida, no suelen encontrarse en los lenguajes de programación,
por el contrario, lo más típico es encontrar mecanismos de paso por valor y paso
por referencia
Paso de parámetros por valor
Cuando se realiza la llamada de un procedimiento o función, se efectúa una copia
de la evaluación de los parámetros reales, que se almacena en una variable local
con el mismo nombre que el parámetro formal, dentro del registro de activación.
Esto implica que al finalizar la ejecución, estos parámetros se destruyen, y los
parámetros reales no se ven afectados.
Es el mecanismo más genérico de los lenguajes de programación y en la mayoría
de los cuales no es necesario especificar ningún modificador del parámetro
formal. El parámetro real puede ser cualquier expresión.
PASO DE PARAMETROS
Paso de parámetros por referencia
En el paso de parámetros por referencia, en vez de trabajar con una copia de los
parámetros reales almacenada en la pila de ejecución, se trabaja directamente
sobre el parámetro real, por lo que cualquier modificación realizada sobre el
parámetro formal es repercutida automáticamente en el parámetro real.
El compilador hace que los parámetros formales declarados en la función o
procedimiento apunten a la misma dirección de memoria que los parámetros
reales.
Este mecanismo de paso de parámetros se usa para parámetros de salida y
entrada/salida, por lo que el parámetro real debe ser una variable.
Muchas veces este tipo de paso de parámetros, combinado con restricciones de
solo lectura, se emplea en algunos lenguajes de programación para sustituir al
ineficiente paso de parámetros por valor en pasos de entrada. Nótese que si se
pasara un vector por valor, se estaría copiando todo su contenido.
Funciones
Un programa en C no es más que una colección de funciones, entre las cuales
siempre ha de estar presente la función principal main.
¿Qué es una función en C?
Una función es un módulo independiente de código, diseñado para realizar una
tarea especifica y que tiene asignado un nombre como identificador, a través
del cual puede ser llamada desde otras funciones, y “lanzar” su ejecución.
Definición de funciones
Para crear una nueva función hay que definirla. Dentro de la definición fijamos
el nombre de la función, el tipo del resultado que devuelve, la lista de
argumentos y el cuerpo de la función, siguiendo la siguiente sintaxis:
tipo_del_valor_devuelto nombre_de_la_función (lista_de_parámetros) {
cuerpo_de_la_función
}
Funciones
Basándonos en la lamina anterior:
· Tipo_del_valor_retornado (tipo de la función)
Es el tipo del valor que devuelve la función como resultado, a través de la
sentencia return. Si la función no devuelve ningún valor, es decir, sino existe
ninguna sentencia return dentro de su cuerpo, el tipo de la función debe de ser
void.
· Nombre_de_la_función
Es el identificador de la función.
· Lista_de_parámetros_formales
Son una lista de variables precedidas de su tipo y separadas por comas. Estas
variables copian los valores de los argumentos que utilizamos cuando llamamos
a la función. Cuando la función no tiene argumentos se dejan vacíos los
paréntesis, o bien se pone entre ellos la palabra reservada void, para indicar
exactamente eso, que la función esta ‘vacía’ de argumentos.
Funciones
Llamada a las funciones
Para utilizar las funciones que hemos declarado, simplemente hemos de llamar a
la función por su nombre, pasándole entre paréntesis tantos valores (argumentos)
como parámetros formales hayamos definido.
Estos valores que utilizamos en la llamada, se van copiando sobre las variables
definidas como parámetros; por lo tanto ha de existir una correspondencia, no
sólo entre el número de valores y el número de parámetros, sino también entre
sus tipos.
La sentencia return
Podemos devolver el valor dentro del cuerpo de la función a través de la
sentencia return. Además, es una sentencia de salto que provocaba la salida
inmediata de la función, independientemente de su posición relativa dentro del
cuerpo de la función.
Sintaxis: return valor; // Opcionalmente: return (valor);
Actividades de Tutoría
1. Crear un programa que determine si un numero es primo
2. Crear un programa que determine si un numero es Capicúa
3. Crear un programa que indique si un numero es:
a) Perfecto
b) Abundante
c) Deficiente
Descargar

Funciones y Procedimientos