Está en la página 1de 39

PROGRAMACIÓN A

Ingeniería en Informática
Universidad FASTA
Lic. Claudio Gea
Ing. Luis Buffoni
Ing. Gonzalo Amigo

Cap. 5 – Modularización de Algoritmos


1
Capítulo 5 - Contenidos
 Subprogramas: funciones y procedimientos
 Parámetros formales y actuales
 Parámetros por valor y por referencia
 Invocación de un subprograma
 Definiciones e invocaciones anidadas
 Ámbito de alcance
 Programación estructurada
 Cohesión y Acoplamiento

2
Subprogramas
La solución de un problema puede abarcar un
A conjunto de etapas bien diferenciadas, cada una
de ellas, puede ser pensada e implementada como
un proceso individual. La unión de todos ellos lleva
B a la solución del problema completo.
Un subprograma es un módulo o sección
autónoma del programa, que realiza una tarea
C específica.
Puede ser invocado por el programa o por otros
{programa principal} subprogramas siempre que se necesite ejecutar la
begin
tarea para la cual fue hecho.
A;
Al “partir” la solución, cada subprograma, está
B; acotado y atiende una tarea específica, siendo más
fácil de interpretar y corregir, para garantizar el
C; correcto funcionamiento.
A;
End.
End.
3
Aporte de los subprogramas

¿En qué favorece a la programación el uso de subprogramas?

Modularidad: los problemas son divididos en subproblemas, aportando un nivel


de abstracción para controlar la complejidad de los procesos. Para la comprensión
de esta abstracción es necesario especificar el intercambio de información que se
produce entre ellos a través de parámetros.
Mantenimiento: los subprogramas al ser módulos independientes, pueden ser
corregidos y modificados independientemente de los procesos con los que
interactúan. Para controlar esta interacción, la comunicación debe darse
solamente a través de sus parámetros.
Ahorro de código: las tareas que se repiten pueden ser codificadas sólo una vez
en un subprograma, luego se lo invoca o utiliza tantas veces como sea necesario.

Divide y reinarás!!
4
Subprogramas

Función
Tipos de subprogramas
Procedimiento

FUNCIÓN: devuelve un único valor (de tipo simple) en el nombre.


No debería leer ni escribir.

PROCEDIMIENTO: devuelve cero o más resultados de tipo simple o


estructurado (registros, tablas). Puede incluir lectura y/o escritura.

5
Concepto matemático de función
F(x) = 2x2 - 3.8  F(5)= 46.2

Argumento o parámetro actual


Se utiliza para realizar el cálculo utilizando
cuerpo
dicho valor

nombre
Argumento o parámetro formal
Se utiliza para definir o formalizar
lo que calcula la función

Una funcion consta de : 2 * F(5)


46.2
Nombre (lista de parámetros)
cuerpo

Los parámetros formales deben Una funcion devuelve un único


coincidir con los actuales en: resultado, dicho valor remplaza a la
invocación
cantidad
 tipo F(2, 4) ? F( ‘a’ ) ?
 orden
G(x,y)=x/y; G(2,3)=G(3,2) ? 6
Funciones: declaración
Consta de un encabezamiento y un cuerpo (con partes declarativa y ejecutable)

Lista de parámetros formales

Nombre
Tipo de resultado de la
función

Function NombFun(par1: tipo1; par2: tipo2;...parn: tipon): tipof;


{parte declarativa : Const, Type, Var, declaración de otras funciones}
...........
Begin {parte ejecutable}

.............

NombFun := resultado; { debe figurar el nombre de la función recibiendo


el resultado de tipof }
End; 7
Invocación a una función
Una función devuelve un único valor de tipo simple (resultado) en el lugar
donde se realiza la invocación, por el programa invocante, sustituyendo los
parámetros formales por los actuales.
Dicha invocación, sola o como parte de una expresión, se utiliza :

a) A la derecha de una asignación Puede ser el programa principal o un


subprograma
b) Como parte de una condición
c) En una lista de salida
Ejemplo de un programa (usando funciones propias del lenguaje)
Program funciones; {programa invocante}
Var
X: real;
Begin
Readln(X);
if Fracc(X) = 0 Then b)
X := sqrt(X) * 3.4; a)
Writeln(Trunc(X)); c)
End. 8
Parámetros
• Permiten la comunicación con el subprograma (procedimiento o función)
• En la declaración del subprograma, se especifican entre paréntesis los
parámetros formales, de definición o huecos (identificadores y sus respectivos
tipos). A través de ellos se describen (formalizan, definen) las operaciones y
relaciones que forman parte del subprograma. Están huecos, no contienen
datos.
• La invocación a un subprograma requiere la especificación entre paréntesis de
los parámetros actuales o de llamada (no se especifica el tipo). Estos son los
datos con los que se realizan las operaciones y relaciones especificadas en la
declaración.
• Los parámetros actuales deben coincidir con los formales en cantidad, orden y
tipo. La posición en su respectiva lista determina la correspondencia entre
ambos.
• No es necesario que el nombre de los parámetros formales coincidan con el de
los actuales

9
Parámetros: tipos de comunicación

por valor por referencia

 Se establece la comunicación del programa invocante hacia el subprograma


invocado, pasando el dato a través del parámetro.
 Al ejecutarse el subrograma se crea un espacio en su zona de memoria para el
parámetro formal y se le copia el valor del parámetro actual. La comunicación
es unidireccional.
 Cualquier modificación que el subprograma realice sobre la copia (parámetro
formal) no modifica el valor del parámetro actual. Por lo tanto el programa
invocante al retomar el control, encuentra los parámetros actuales valor sin
cambios (no devuelven resultados).
 El parámetro formal VALOR es siempre un identificador, el parámetro actual
VALOR puede ser una variable, una constante o una expresión (la cual se
evalúa antes de copiar el valor).
 Los parámetros de una función son siempre por valor.
10
Ejemplo 1 - Desarrollar una función booleana que indique si un caracter es vocal.

Program Vocales; La definición de los subprogramas


Function EsVocal(Letra:Char): boolean;
va en la sección declarativa.
Begin
Letra := Upcase(Letra);
EsVocal := (Letra='A') or (Letra='E') or (Letra='I') or (Letra='O') or
(Letra='U');
End;
Var
Let :char;
Letra
Begin
Write('Ingresar una letra: '); Readln( Let
Letra );
If EsVocal( LetLetra ) Then
Let
Writeln( Letra , ' es una vocal')
Else
Let
Writeln(Letra , ' NO es una vocal')
End.
¿Cuál es el valor de Let después de la
invocación, si se leyó ‘b’?
11
Ejemplo 2 - Desarrollar una función (entera) que a partir de un entero N devuelva la suma
de 1 a N.

Program SumaN;
Function Suma(N: word): word;
Var
Aux, i: word; Variables locales
Propias del subprograma, no reconocidas fuera de su
Begin
ámbito.
Aux:= 0; Su permanencia en memoria se limita al tiempo de
For i := 1 to N do ejecución del subprograma.
Aux:= Aux + i;
Suma := Aux
End;
Var ¿Por qué no se lee N dentro de la función?
M: word; ¿Por qué se utiliza la variable Aux?
Begin
Write('Ingresar un numero: '); Readln(M);
Writeln('La suma es ' , Suma (M))
End.
12
Ejemplo 3 - Se desarrolla para el ejemplo 11 del capítulo 4 una solución que utiliza una función
string, que a partir de las tres notas (Matemáticas, Física y Química) devuelve una cadena que
indica si el alumno ingreso (‘C1’, ‘C2’, ‘C3’) o no (‘No’).
Program Cap4Ej11; {utilizando una función}
Type
St2 = string[2];

Function Ingresa(M, F, Q: byte): St2;


Begin Begin
if (M >= 40) and (F >= 40) Readln(N);
and (Q >= 40) then ContIng:= 0;
Ingresa := 'C1' For I := 1 to N do
else begin
if (M >= 60) and (Q >= 80) then Readln(Nomb);
Ingresa := 'C2' Readln(NM, NF, NQ);
else Respuesta:= Ingresa(NM, NF, NQ);
if F + Q >= 180 then If Respuesta = 'No' then
Ingresa := 'C3' writeln (Nomb, 'No ingresa')
Else else
Ingresa:= 'No' Begin
End; ContIng:= ContIng + 1;
writeln (Nomb, 'ingresa por condición',
Respuesta);
Var End
I, N, NM, NF, NQ, ContIng : byte; End;
Nomb: string[25]; writeln ('El % de ingresantes es ',
Respuesta: St2; ContIng * 100/N: 8:2);
End.

 13
Subprogramas

Función
Tipos de subprogramas
Procedimiento

FUNCIÓN: devuelve un único valor (de tipo simple) en el nombre.


No debería leer ni escribir.

PROCEDIMIENTO: devuelve cero o más resultados de tipo simple o


estructurado (registros, tablas). Puede incluir lectura y/o escritura.

14
Procedimientos: declaración

Consta de un encabezamiento y un cuerpo (con partes declarativa y ejecutable)

Procedure identificador(lista de parámetros);{encabezamiento}


Var {Sección declarativa}
...........
Begin {Sección ejecutable} cuerpo

...........
...........
End;

15
Ejemplo 4.a - Leer dos valores reales y mostrar como resultado su suma y su producto.

El subprograma debe escribir la suma y el producto, por lo tanto no puede ser una función,
se implementa un procedimiento.

Program Ejemplo4_a;
Procedure CalculaImprime( W, Z : real); {W y Z parámetros formales de entrada}
Begin
Writeln('La suma es = ', W + Z);
Writeln('El producto es = ', W * Z);
End;

Var
X, Y: real;
Begin
Write('Ingresar dos numeros: '); Readln (X, Y);
CalculaImprime (X, Y); {invoca el procedimiento, X e Y parámetros actuales}
End.

16
Ejemplo 4.b - Leer dos valores reales y desarrollar un procedimiento que devuelva su suma y
su producto, siendo el programa invocante el que imprima los resultados.
¿Cómo hacer para que el procedimiento devuelva los
resultados y el programa invocante los imprima?
Program Ejemplo4_b;

Procedure Calcula( W, Z: real; Var Suma, Producto: real);


{W y Z parámetros de entrada, Suma y Producto son parámetros de salida}

Begin
Suma := W + Z;
Producto := W * Z;
End;
Var
X, Y, Sum, Prod: real;
Begin
Write('Ingresar dos números: '); Readln (X, Y);
Calcula (X, Y, Sum, Prod); { invoca el procedimiento }
Writeln ('La suma es = ', Sum);
Writeln ('El producto es = ', Prod);
End. 17
Parámetros variables o por referencia
por referencia

 La comunicación es bidireccional, se produce intercambio de información y


permite obtener resultados a través de los parámetros.
 El parámetro formal no recibe el valor del parámetro actual (no copia), sino la
dirección de éste, por lo tanto cuando el subprograma opera sobre el parámetro
no lo hace sobre una copia sino sobre la misma variable, la referencia a través
de la dirección.
 Cada vez que se modifica el parámetro formal, se modifica el parámetro actual.
 El parámetro formal VARIABLE es siempre un identificador y el actual debe ser
variable (ya que representa una dirección donde se almacenará un resultado).
 En la definición del subprograma a este tipo de parámetro, se le antepone la
palabra VAR.

18
Ejemplo 5.- Procedimiento que a partir de dos variables reales
intercambia el contenido.

Procedure Intercambia(Var A, B : real);


{ A y B son parámetros de entrada salida}
Var
Aux: real;
Begin
Aux := A;
A := B;
B := Aux;
End;

¿Qué devolvería la invocación Intercambia(8, 6)?

19
Pasaje de parámetros por valor

PROGRAM EjemploValor; Comienza la ejecución del


procedimiento
PROCEDURE cambio(y: integer);
Begin
Prog. Principal Proced. Cambio(y: integer)
Y := 1
End; x y
0
Var
x: integer; 0
1
BEGIN
x := 0; El valor de X es 0
Cambio(x);
Writeln('El valor de X es ', x) Termina la ejecución del
END. procedimiento

20
Pasaje de parámetros por valor

Formales: identificadores
Actuales: Variable, Constante, Expresión

PROCEDURE Ejem( A, B:integer; C:real); {declaración}

Ejem(Z, 7, (X+2.5)*Z ); {sentencia de llamado}

21
Pasaje de parámetros por referencia

PROGRAM EjemploVariable; Comienza la ejecución del


procedimiento
PROCEDURE cambio(var y: integer);
Begin
Prog. Principal Proced. Cambio(y:integer)
Y := 1
End; x y
0
Var
x: integer; 
1
BEGIN
x := 0; El valor de X es 1
Cambio(x);
Writeln('El valor de X es ', x) Termina la ejecución del
procedimiento
END.

22
Pasaje de parámetros por referencia

Formales: identificadores
Actuales: Variables

Procedure Ejemplo(var a, b: integer; var zeta: real);

Ejemplo( x, b, w);

23
El siguiente cuadro resume la compatibilidad entre parámetros formales y actuales, de
acuerdo a su comunicación (bidireccional y unidireccional)

Definidos en el ámbito de la invocación

Los parámetros
formales
son siempre
identificadores


(nombres de fantasía
que se utilizan para PARÁMETROS ACTUALES
describir las acciones
que realiza el Debe tener un
subprograma)  valor

F Constante Se evalúa su
resultado
O VALOR (Entrada) Variable
R -unidireccional- Expresión
M
A
VARIABLE (Salida o
L Variable Pueden tener o
E/S)
E no valor previo
-bidireccional-
S
24
¿Cuándo se debe utilizar procedimiento y cuándo una
función?

Se utiliza una función cuando se requiere un único resultado (de


tipo simple), cuando no lee ni escribe.
Un procedimiento en otro caso.

Siempre es posible escribir una función como procedimiento,


pero no siempre es posible escribir un procedimiento como
función. ¿Por qué?

25
Algunas conclusiones
Los parámetros pueden ser clasificados por:
Su intervención en la definición (formales) o en su invocación (actuales)
Su forma de comunicación: unidireccional (valor) o bidireccional (variable o
referencia)
Su rol como ingreso de datos al subprograma (entrada), entrega de resultados
(salida) o ambos aspectos (entrada/salida)

Para mantener acotado lo que una función o un procedimiento pueden operar, de


acuerdo al paradigma de programación estructurada:
•Una función puede invocar a otra función (no a un procedimiento).
•Un procedimiento puede invocar otro procedimiento o una función.
•Estas invocaciones se pueden realizar en forma sucesiva.

 26
Definiciones anidadas de subprogramas
Un subprograma, en su parte declarativa, puede definir otro procedimiento y/o función, se dice que hay
un anidamiento y el subprograma interno es privado del subprograma y solo reconocido dentro de su
ámbito. Estas definiciones se pueden realizar en forma sucesiva. Ejemplo:

Program DefinicionesAnidadas;
Procedure C(. . .);
Procedure B(. . .);
Procedure A(. . .);
Begin {cuerpo del proc. A}
...
End;
Begin {cuerpo del proc. B}
A(....);
...
End;
Begin
B(....); {cuerpo del proc. C}
...
End;
Begin { programa principal }
......... Los procedimientos A y B son desconocidos en el
C(......); programa principal y no pueden ser invocados por éste.
End.
27
Alcance local y global
 Se define el alcance de un objeto (variable, tipo, función o procedimiento) al
ámbito de acción de dicho objeto. Puede ser global o local.
Program Globales;
 En la declaración de un programa (programa Var
X,Y, W: real;
principal) se especifican constantes, tipos, Procedure Muestra(Z: real);
Begin
procedimientos y funciones que son reconocidos Writeln(X, Y, Z)
en todo el programa incluyendo los subprogramas End;
Begin {programa principal}
definidos dentro del mismo, por lo tanto estos Readln(X,Y,W);
Muestra(W);
objetos son globales. End.

Program Locales;
Procedure Muestra(Z: real);
 En la declaración de un subprograma los Var X,Y: real;
Begin
identificadores de parámetros (formales), las Readln(X, Y);
definiciones de constantes, tipos, la declaración de Writeln(X, Y, Z)
End;
variables, procedimientos y funciones propios, son Var
locales al subprograma declarado, no se les W: real;
Begin {programa principal}
conoce fuera de este ámbito, estos objetos son Readln(W);
Muestra(W);
llamados locales. End.

28
Alcance local y global
 Los objetos globales son reconocidos dentro del procedimiento, el cual puede
modificar las variables globales y producir alteraciones no deseadas.
 Al utilizar una variable global, el subprograma establece una dependencia con
el identificador, (en contraste con la independencia de los identificadores
entre los parámetros formales y actuales).
 La cabecera de un subprograma permite a través de su nombre asociar la
tarea que realiza (Suma, Escribe) y los parámetros indican qué información
recibe y qué resultados devuelve.
Ejemplo: Intercambia(A, B) y no Intercambia()

Para garantizar estos importantes


 Seguridad aspectos los valores compartidos entre
procesos deben implementarse
 Reusabilidad mediante parámetros y NO utilizar
variables globales!!!!
 Claridad
29
Ejemplo 7
Para cada uno de N clientes de una compañía de electricidad, se tienen los siguientes datos:
 Número de cliente
 Estado actual del medidor (en kw) Ciclo FOR capta los N datos
calcula e imprime boletas
 Estado anterior del medidor
Desarrollar un programa que lea desde teclado los datos de los clientes, calcule el consumo, el importe e
imprima las boletas.
La boleta deberá contener:
el número de usuario Un procedimiento
imprime la boleta
la cantidad de Kw consumida Un procedimiento calcula el
consumo y el importe
el importe.
Para este último considerar básico fijo de $50 y más un monto variable que depende del consumo, en
base a este se establece el precio por kw :
 $0.54 consumo <= 100
 $0.48 100 < consumo <= 250 Una función calcula el precio del
KW de acuerdo al consumo
 $0.37 250 < consumo

30
Program Electricidad;
Function Precio(Consum : word) : real; {define función, Consum parámetro de entrada}
Begin
If Consum <= 100 then
Precio := 0.54
else
if Consum <= 250 then
Precio := 0.48
else
Precio := 0.37;
End;

Procedure Boleta(EstAct, EstAnt: word; Var Imp: real; Var Cons: word);
Begin
Cons := EstAct - EstAnt;
Imp := 50 + Cons * Precio(Cons); {invoca función, el parámetro actual es parámetro formal del proced}
End;

Procedure Imprime(NroUsuario: String; Imp: real; Cons: word);


Begin
Writeln('Usuario', NroUsuario);
Writeln('Consumo', Cons);
Writeln('Importe', Imp);
End;

{Programa Principal}
Var
NroUsu: string [10]; Cons, EstAct, EstAnt, I, N: word; Imp: real;
Begin
Write('Ingresar cantidad de usuarios: '); Readln(N); Es muy recomendable declarar las variables del
For I := 1 to N do programa principal inmediatamente antes del
Begin
Readln(NroUsu); Readln(EstAct, EstAnt); cuerpo del mismo, en lugar de hacerlo al comienzo
Boleta (EstAct, EstAnt, Imp, Cons); del programa (antes de la implementación de los
Imprime(NroUsu ,Imp, Cons,); subprogramas). La causa de esto es evitar el uso
end; 31
End. accidental de variables globales
Programación Modular
• División del programa principal en módulos independientes
• Facilita división del trabajo en tareas simultáneas
• “Divide y reinarás”

32
Programación Estructurada
• Programa con diseño modular
• Módulos diseñados de modo descendente (top-down)
– Serie de niveles o pasos sucesivos de refinamiento
– Se descompone el problema en etapas o estructuras jerárquicas
• Solamente se usan las 3 estructuras de control básicas: secuencial,
selección y repetición.
– Minimizar complejidad y reducir errores
• No permitir GOTO (salto incondicional a cualquier línea del
programa)

33
Programación Estructurada
• “Un solo punto de entrada y uno solo de salida”
• No salir o cortar arbitrariamente los ciclos con sentencia Break o Continue

• No salir arbitrariamente de subprogramas con sentencia Exit

• No cortar ejecución de programas con sentencia Halt

34
Programación Estructurada - Funciones
Las funciones no deben:
•Tener parámetros de salida

•Leer ni escribir

•Invocar a un procedimiento (riesgo de lectura / escritura indirecta)

35
Acoplamiento
Grado de dependencia entre módulos (subprogramas)
Si hacer cambios en un módulo implica que sea necesario hacerlos en
otro módulo distinto, entonces se puede decir que ambos están
acoplados.
Puede generarse por:
•Tener código repetido
•Compartir contenido
•Por el uso de variables globales (Evitar!)

36
Cohesión
Efecto de reunirse las cosas entre sí, con sentido y una dirección
común.
Alcance definido, límites claros, contenido delimitado.
Las funciones o procedimientos realizan una única tarea. Por ej, si tenemos

Procedure calcula_e_imprime(a, b: integer; var resultado: integer; imprimeSN:


boolean);

Es preferible subdividirlo en 2 subprogramas que hagan una sola cosa cada una
• Function calcula(a, b: integer): integer;
• Procedure imprime(resultado: integer);

Código más autocontenido y con menos dependencias.

37
Acoplamiento vs. Cohesión
Casos extremos:
•Subprograma “gigante” que hace demasiadas cosas.
•Muchos subprogramas pequeños con responsabilidad bien
delimitada, reutilizables. Comprenderlos implica explorar muchos
módulos.

38
Acoplamiento vs. Cohesión
Bajo acoplamiento:
•Más mantenible: facilita cambios sin tener que revisar módulos dependientes
•Más reutilizable
•Pruebas más fáciles
Alta cohesión:
•Código más entendible, legible y coherente
•Más reutilizable: todo lo relacionado con una cosa está junto en un módulo
•Más mantenible: facilidad de localizar funcionalidad

39

También podría gustarte