Está en la página 1de 23

MODULARIZACIÓN

PROCEDIMIENTOS Y FUNCIONES

Explicación Práctica

Programación I - 2021
Facultad de Informática y Facultad de Ingeniería - UNLP
Programa con módulos
Estructura

Program NombrePrograma;
Type
{declaraciones de tipos de datos}

{Declaración de módulos: procedimientos y funciones}

var
{variables a usar en el programa principal}
begin
{Acciones del prog. principal}
end.
Procedimientos( Similares a los procesos vistos del R-info. )

le s:
Program NombrePrograma; Parámetros forma
o:
Type Para cada parámetr
{declaraciones de tipos de datos} • Tipo de pasaje: ia (VAR)
por valor o referenc
etro
Procedure nombre (lista de parámetros); • Nombre del parám
Var • Tipo de dato
{Variables locales al procedimiento}
Begin
{Cuerpo del procedimiento}
end;
var
cedure:
Invocación al pro l proc. con
{variables a usar en el programa
principal} re de
Utilizando el nomb
begin lis ta d e p a rá m e tr os actuales
la
{Acciones del prog. principal} e param.
La asociación entr
nombre(param actuales) les y a ctu a les es p or posición.
forma
end.
Parámetros por valor

Concepto:
• Similar a los parámetros de entrada (E) de R-Info
• USO: El módulo necesita recibir información para realizar su tarea.
• El llamador no ve modificaciones en el parámetro actual.

Mecanismo:
• Se realiza una copia del valor del parámetro actual en otra posición de
memoria correspondiente al parámetro formal. Esta copia se destruye
cuando se termina de ejecutar el módulo.
• Dentro del módulo se puede modificar el valor del parámetro, pero el
cambio no será visto por el llamador.
Parámetros por valor ¿Qué imprime?
Program paramValor;
Procedure uno (a: integer);
var
total: integer;
Begin
total:= 3;
total:= total + a;
a:= a + 1;
writeln ('El valor de total es:
',total);
writeln ('El valor de a es: ', a);

end;
var
x: integer;
begin
x:= 30;
uno(x);
writeln ('El valor de x es: ', x);
readln;
end.
Parámetros por valor ¿Qué imprime?
Program paramValor;
Uno
Procedure uno (a: integer);
var 30
31 3
33
total: integer;
Begin a total
total:= 3;
total:= total + a;
a:= a + 1;
writeln ('El valor de total es:
',total); El valor de total es: 33
writeln ('El valor de a es: ', a); El valor de a es: 31
end;
var Programa principal
x: integer;
begin
x:= 30; 30
uno(x); X
writeln ('El valor de x es: ', x);
readln;
end. El valor de x es: 30
Parámetros por referencia

Concepto:
•Similar que a los parámetros de entrada/salida (ES) del robot.
•USO: El módulo necesita opcionalmente recibir un dato, procesarlo y devolverlo
modificado al llamador.
•Cuando se modifica el parámetro formal, la modificación es vista por el módulo
llamador.

Mecanismo:
•El parámetro formal recibe la dirección de memoria donde se encuentra la
variable que se pasó como parámetro actual.
•El parámetro actual y formal “comparten” el mismo espacio de memoria.
Parámetro por referencia ¿Qué imprime?
Program paramReferencia;
Procedure uno (var a: integer);
var
total: integer;
Begin
total:= 3;
total:= total + a;
a:= a + 1;
writeln ('El valor de total es:
',total);
writeln ('El valor de a es: ', a);

end;
var
x: integer;
begin
x:= 30;
uno(x);
writeln ('El valor de x es: ', x);

readln;
end.
Parámetro por referencia ¿Qué imprime?
Program paramReferencia;
Uno
Procedure uno (var a: integer);
var a 3
33
total: integer; total
Begin
total:= 3;
total:= total + a;
a:= a + 1;
writeln ('El valor de total es: El valor de total es: 33
',total);
El valor de a es: 31
writeln ('El valor de a es: ', a);

end; Programa principal


var
x: integer;
begin 30
31
x:= 30;
uno(x);
X
writeln ('El valor de x es: ', x);
El valor de x es: 31
readln;
end.
Ejercicio
a) Realice un procedimiento que reciba como parámetro un número entero y
calcule y retorne la cantidad de dígitos impares y la cantidad de dígitos pares
que posee el número recibido.

b) Utilizando el procedimiento definido en a) realice un programa que lea 20


números enteros e informe la cantidad de números que tienen más dígitos
pares que impares.

e e l m ód ulo y su
o mu nica r ent r
¿Qué da t o s a c
llamador?

Procedure descomponer (num:integer; var cantP: integer; var


cantI:integer);
Solución
Procedure descomponer (num:integer; var cantP: integer; var
cantI:integer);
Var
V a ria ble s locales del módulo:
dig: integer; o
• Só lo co nocidas por el módul
Begin a al módulo y
a n cu a n do se in vo c
• Se cre
while (num <> 0) do begin
ec en ” a l lle g ar a l “e nd” del módulo
“desapar
dig:= num mod 10;
if (dig mod 2 = 0) then
cantP:= cantP + 1
in ic ia li z o lo s c o n ta do r e s
else ¿Dónde
cantI:= cantI + 1; cantP y cantI?
num:= num div 10; Opción 1: En el módulo, antes del while
end; Opción 2: En el llamador, antes de la
end; invocación
Solución
Procedure descomponer (num:integer; var cantP: integer; var
cantI:integer);
Var
dig: integer;
Begin
cantP:= 0;
cantI:= 0;
while (num <> 0) do begin
dig:= num mod 10;
if (dig mod 2 = 0) then
cantP:= cantP + 1
n de in ic ia li zo lo s c ontadores
¿D ó
else cantP y cantI?
cantI:= cantI + 1;
num:= num div 10; Opción 1: En el módulo, antes del while
end; Opción 2: En el llamador, antes de la
end; invocación
Solución
Program ejercicio;
Procedure descomponer (num:integer; var cantP: integer; var cantI:integer);
{aquí va el cuerpo del procedure descomponer…}
var
i, num, pares, impares: integer;
cant: integer; ó n d e in icia liz o los contadores
¿D
begin cantP y cantI?
cant:= 0;
Opción 1: En el módulo, antes del while
for i:= 1 to 20 do begin
readln(num); Opción 2: En el llamador, antes de la
pares:=0; impares:=0; invocación
descomponer(num, pares, impares);
if (pares > impares) then
cant:= cant + 1;
end;
writeln(‘La cantidad de numeros que tienen mas dig pares que imp es:’,
cant);
end.
Solución
Program ejercicio;
Procedure descomponer (num:integer; var cantP: integer; var cantI:integer);
{aquí va el cuerpo del procedure descomponer…}
var
ppal:
Variables del programa
i, num, pares, impares: integer;
cant: integer; g ppal.
• Accesibles sólo por el pro
begin jecución,
• Se crean al empezar su e
cant:= 0; nd” del
for i:= 1 to 20 do begin desaparecen al llegar al “e
readln(num); programa.
pares:=0; impares:=0;
descomponer(num, pares, impares);
if (pares > impares) then
cant:= cant + 1;
end;
writeln(‘La cantidad de numeros que tienen mas dig pares que imp es:’,
cant);
end.
Funciones Parámetros forma
les:
or valor
Solo parámetros p
o:
Para cada parámetr
etro
• Nombre del parám
Program NombrePrograma; • Tipo de dato
Type
{declaraciones de tipos de datos}

function nombre (lista de parámetros) :


tornan
tipo; - Las funciones re
var un dato simple.
{declaración de variables locales}
begin
{0, 1 o más sentencias}
nombre:= VALOR;
end;
var
{variables a usar en el programa
principal}
begin o ca c ió n a un a function
La In v
distintas
{Acciones del prog. principal} puede hacerse de
end. formas…
Ejercicio 1
Realizar un programa que lea una secuencia de números enteros
positivos hasta que se lee el valor 0 y para cada uno de ellos
informe su factorial.
Analizando el problema…
NO. Se deben procesar nros hasta
1. ¿Conozco la cantidad de números a procesar? que el usuario ingrese un <= 0.
USO UN WHILE

1. Calcular el factorial
2. ¿Qué necesitamos hacer con cada valor leído? 2. Imprimir resultado

Se multiplican los números desde 1


3. Para calcular el factorial de un número… hasta el número en cuestión.
¿Sé cuántas veces debo multiplicar? USO UN FOR

El cálculo del factorial, ya que es una


4. ¿Qué puedo modularizar? tarea lógica.

5. ¿Qué uso? ¿Función o procedimiento? Función, ya que recibe un nro. y


retorna un nro. entero.
Program numeros;
Function factorial (n:integer): integer;
Solución
Var
I : integer;
f unc ió n de debe
fac: integer; una
Begin Al final de or de retorno.
val
fac:= 1; asignar un sm o tip o qu e el tipo
For i:= 2 to n do
c d eb e se r del mi teger)
- Fa nc i ó n (i n
fac:=fac * i; de la fu
factorial:= fac; de retorno
end;

Var
num, c: integer;
Begin
write('Ingrese un numero para calcular su factorial: ');
readln(num);
while (num > 0) do begin
c:= factorial(num);
writeln ('El factorial de ',num, 'es: ', c);
write('Ingrese un numero para calcular su factorial: ');
readln(num);
end;
end.
Program numeros;
Function factorial (n:integer): integer;
Solución
Var
i : integer;
fac: integer;
Begin
r la
fac:= 1;
For i:= 2 to n do ¿ Se p ue d e
al
e
fa
lim
c y
i n
u
a
t i li zar
fac:=fac * i;
factorial:= fac; variable lo c
end; para el cálculo
e n t e f a c t or ial ?
Var
num, c: integer; directam
Begin
write('Ingrese un numero para calcular su factorial: ');
readln(num);
while (num > 0) do begin
c:= factorial(num);
writeln ('El factorial de ',num, 'es: ', c);
write('Ingrese un numero para calcular su factorial: ');
readln(num);
end;
end.
Funciones
Invocación

1) Asignando el valor a una variable (a la derecha de una


asignación)

2) Dentro de un write (en caso que el valor retornado se


pueda imprimir)

3) Dentro de una expresión de una condición.


Invocación a una función
Dentro de una expresión en condición

Ejemplo
Hacer un programa que lea un carácter e indique si el mismo es un carácter
numérico o no. alor
rna un v
Reto
le a n o q ue se
program ejemplo1; boo
n if
function verificar (caracter: char) : boolean; usa en u
begin
verificar := (caracter >= ‘0') and (caracter <= '9');
end;
var
carac: char;
begin
writeln('Introduce un caracter para ver si es numerico.');
readln(carac);
if ( verificar (carac) )then
writeln('El carácter introducido es numérico.')
else
writeln('El carácter introducido no es numérico.');
end.
Invocación a una función
A la derecha de una asignación

Ejemplo
Realice un programa que lea dos números e imprima el cuadrado de ambos.
n a u n v a l or
f u n c ió n retor a lo r es
la h o v
program ejemplo2;
t ip o re al. Dic ble del
de a v a ria
si g na d o a un )
function cuadrado(a:real):real; a ( u a d1, cuad2
i po c
begin mismo t
cuadrado := a*a;
end;

var
x, y, cuad1, cuad2: real;
begin
writeln('Introduzca dos numeros reales: ');
write(' primer numero: '); readln(x);
write(' segundo numero: '); readln(y);
cuad1:= cuadrado (x);
cuad2:= cuadrado (y);
writeln(cuad1,cuad2);
end.
Invocación a una función
Dentro de un write (si el valor retornado se puede imprimir)

Ejemplo
Realice un programa que lea dos números e imprima el cuadrado de ambos.
e c ta m e nte el
u e stra dir
program ejemplo3; Se m
d e la f unción
o
resultad n write.
function cuadrado(a:real):real; d e u
dentro
begin
cuadrado := a*a;
end;
var
x, y: real;
begin
writeln('Introduzca dos numeros reales: ');
write(' primer numero: '); readln(x);
write(' segundo numero: '); readln(y);
writeln(cuadrado (x), cuadrado (y));
end.

También podría gustarte