Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Resolución de problemas y algoritmos
Dra. Jessica Andrea Carballido Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR
2
Procedimientos y Funciones
procedure sigant(n: integer; var na, ns: integer); begin na := n – 1; ns := n + 1; end; El procedimiento sigant tiene tres parámetros. El parámetro n está pasado por valor, cuando empieza la ejecución del procedimiento, se reserva una locación de memoria para n, que se inicializa con el valor del parámetro real y se destruye cuando termina el procedimiento. Los parámetros na y ns están pasados por referencia (también llamados por variable), son referencias a las locaciones de memoria que corresponden a los parámetros reales. También se reservan locaciones de memoria para estas referencias.
3
Procedimientos y Funciones
function doble(n: integer): integer; begin doble := n * 2; end; La función doble tiene un único parámetro, pasado por valor. La función computa un valor y lo asigna a su nombre.
4
Procedimientos y Funciones
Program pyf; var a, b, c: integer; … Begin write (‘Ingrese un número: ‘); readln(a); sigant(a, b, c); a := doble(b) + doble(c); sigant(a, c, b); End.
5
Procedimientos y Funciones
procedure sigant (n: integer; var na, ns: integer); begin na := n – 1; ns := n + 1; end; sigant(a, b, c); La primera invocación de sigant asigna el valor del parámetro real a al parámetro formal n. El parámetro real b queda ligado al parámetro formal na, cualquier modificación en na, afecta al valor almacenado en b. El parámetro real c queda ligado al parámetro formal ns, cualquier modificación en ns, afecta al valor almacenado en c. Cuando termina la ejecución se destruyen las locaciones de memoria ligadas a los parámetros.
6
a:= doble(b) + doble (c);
Procedimientos y Funciones function doble(n : integer): integer; begin doble := n * 2; end; a:= doble(b) + doble (c); En la primera invocación a doble, se reserva una locación de memoria para variable local n, y se inicializa con el valor del parámetro real b. Cuando la función se termina la locación se destruye y se reanuda la evaluación de la expresión. El resultado de la primera invocación constituye el valor del primer operando de la suma.
7
a:= doble(b) + doble (c);
Procedimientos y Funciones function doble(n : integer): integer; begin doble := n * 2; end; a:= doble(b) + doble (c); En la segunda invocación a doble, se reserva una locación de memoria para variable local n, y se inicializa con el valor del parámetro real c. Cuando la función se termina la locación se destruye y se reanuda la evaluación de la expresión. El resultado de la segunda invocación constituye el valor del segundo operando de la suma.
8
Procedimientos y Funciones
procedure sigant (n: integer; var na, ns: integer); begin na := n – 1; ns := n + 1; end; sigant(a, c, b); La segunda invocación de sigant asigna el valor del parámetro real a al parámetro formal n. El parámetro real c queda ligado al parámetro formal na, cualquier modificación en na, afecta al valor almacenado en c. El parámetro real b queda ligado al parámetro formal ns, cualquier modificación en ns, afecta al valor almacenado en b. Cuando termina la ejecución se destruyen las locaciones de memoria ligadas a los parámetros.
9
Un parámetro por valor se inicializa en el momento de la invocación del procedimiento con el valor del parámetro real. Al terminar la ejecución del procedimiento la variable asociada al parámetro formal se destruye y su valor se pierde. Un parámetro por referencia introduce un nuevo nombre para referirse a la celda de memoria que corresponde al parámetro real.
10
Cuando comienza la ejecución de un programa en Pascal se reservan una o más celdas en memoria para cada una de las variables globales (variables declaradas en el programa principal). Cuando un procedimiento o función se invoca se reservan celdas para cada una de las variables locales al procedimiento o función, como así también para los parámetros. Para cada parámetro pasado por referencia se reserva una celda que mantiene la referencia al parámetro real. Todas estas celdas son liberadas cuando el procedimiento o función termina. Manejo de la memoria
11
Variables globales Parámetros formales Parámetros reales
Program parametros; var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1, pf2, local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1, pa2); p(pa1, pa2); end. Variables globales Parámetros formales Parámetros reales
12
Memoria Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1, pf2, local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria Consola
13
Comienza la ejecución del programa
Program parametros; var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local := pf1 + pf2; writeln(pf1,pf2,local); pf1 := pf1 + 1; pf2 := local + 1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=3; writeln(pa1, pa2); p(pa1, pa2); end. Memoria pa1 pa2 Consola Comienza la ejecución del programa
14
Memoria 1 pa1 pa2 3 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 3 Consola
15
Memoria 1 pa1 pa2 3 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 3 Consola 1 3
16
Memoria 1 pa1 pa2 3 1 pf1 pf2 local Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 3 1 pf1 pf2 local Consola 1 3 El control pasa al procedimiento El bloque del programa principal se suspende
17
Memoria pa1 1 pa2 3 1 pf1 pf2 local 4 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 3 1 pf1 pf2 local 4 Consola 1 3
18
Memoria pa1 1 pa2 3 1 pf1 pf2 local 4 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 3 1 pf1 pf2 local 4 Consola 1 3 1 3 4
19
Memoria pa1 1 pa2 3 5 2 pf1 pf2 local 4 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 3 5 2 pf1 pf2 local 4 Consola 1 3 1 3 4
20
Memoria pa1 1 pa2 5 2 pf1 pf2 local 4 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 5 2 pf1 pf2 local 4 Consola 1 3 1 3 4 2 5 4
21
Program parametros; var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 5 El procedimiento termina, la memoria asignada al procedimiento se libera y la ejecución continúa en la instrucción siguiente a la instrucción de la invocación. Consola 1 3 1 3 4 2 5 4 1 5
22
Memoria 1 pa1 pa2 5 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); end. Memoria pa1 1 pa2 5 Consola 1 3 1 3 4 2 5 4 1 5
23
Memoria 1 pa1 pa2 5 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); writeln(pa1, pa2); end. Memoria pa1 1 pa2 5 Consola 1 3 1 3 4 2 5 4 1 5
24
Memoria 1 pa1 pa2 5 5 pf1 pf2 local En esta invocación
Program parametros; var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 1 pa2 5 5 pf1 pf2 local En esta invocación pa2 se liga a pf1 y pa1 se liga a pf2 Consola 1 3 1 3 4 2 5 4 1 5
25
Memoria pa1 1 pa2 5 5 pf1 pf2 local 6 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 1 pa2 5 5 pf1 pf2 local 6 Consola 1 3 1 3 4 2 5 4 1 5
26
Memoria pa1 1 pa2 5 5 pf1 pf2 local 6 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 1 pa2 5 5 pf1 pf2 local 6 Consola … 5 1 6
27
Memoria pa1 1 7 pa2 5 6 pf1 pf2 local 6 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 1 7 pa2 5 6 pf1 pf2 local 6 Consola … 5 1 6
28
Memoria pa1 7 pa2 5 6 pf1 pf2 local 6 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 7 pa2 5 6 pf1 pf2 local 6 Consola … 5 1 6 6 7 6
29
Memoria 7 pa1 pa2 5 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 7 pa2 5 Consola … 5 1 6 6 7 6
30
Memoria 7 pa1 pa2 5 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); end. Memoria pa1 7 pa2 5 Consola … 5 1 6 6 7 6 7 5
31
Memoria 7 pa1 pa2 5 Consola Program parametros; var pa1, pa2: integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); p(-10,pa1); end. Memoria pa1 7 pa2 5 Consola … 7 5
32
Memoria 7 pa1 pa2 5 -10 pf1 pf2 local Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); p(-10,pa1); end. Memoria pa1 7 pa2 5 -10 pf1 pf2 local Consola … 5 1 6 6 7 6 7 5
33
Memoria pa1 -2 pa2 5 -9 pf1 pf2 local -3 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); p(-10,pa1); end. Memoria pa1 -2 pa2 5 -9 pf1 pf2 local -3 Consola …
34
Memoria -2 pa1 pa2 5 Consola Program parametros;
var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local:=pf1+pf2; writeln(pf1,pf2,local); pf1:= pf1+1; pf2:=local+1; end; pa1:=1; pa2:=3; writeln(pa1,pa2); p(pa1,pa2); p(pa2, pa1); p(-10,pa1); end. Memoria pa1 -2 pa2 5 Consola … -2 5
35
La memoria puede visualizarse como una secuencia de celdas cada una de las cuales tiene asociada una dirección y un contenido. dirección contenido 0000 0001 0010 0011 0100 0101
36
Parámetro por referencia
La memoria puede visualizarse como una secuencia de celdas cada una de las cuales tiene asociada una dirección y un contenido. dirección contenido Almacena LA DIRECCION de otra celda 0000 0001 0010 0011 0100 0101 Parámetro por referencia
37
“ERROR: Se espera el nombre de una variable”
Variables GLOBALES program paramProc; Var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; Begin local := pf1+pf2; pf1:= pf1+1; pf2 :=local+1; writeln(pf1:5,pf2:5,local:5); End; p(pa1, -10); writeln(pa1:5,pa2:5); End. “ERROR: Se espera el nombre de una variable” Error en compilación El parámetro real no puede ser una constante cuando el pasaje de parámetros es por referencia !
38
“ERROR: Se espera el nombre
program paramProc; Var pa1, pa2: integer; procedure p(pf1: integer; var pf2: integer); var local: integer; Begin local := pf1+pf2; pf1:= pf1+1; pf2 :=local+1; writeln(pf1:5,pf2:5,local:5); End; p(pa1, pa2+1); writeln(pa1:5,pa2:5); End. “ERROR: Se espera el nombre de una variable” Error en compilación El parámetro real no puede ser una expresión cuando el pasaje de parámetros es por referencia !
40
Si corresponde a un parámetro formal:
Real Por valor Un literal Una variable Una llamada a función Una expresión Por referencia Nombre de una variable Formal DE - Por valor nombre: tipo DE/S - Por referencia var nombre: tipo Invocación Si corresponde a un parámetro formal: Definición
41
1 pa1 pa2 5 1 pf1 pf2 local program paramProc; var pa1, pa2:integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local := pf1+pf2; pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local
42
1 pa1 pa2 5 1 pf1 pf2 local 2 program paramProc; var pa1, pa2:integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local := pf1+pf2; pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local 2
43
3 pa1 pa2 5 11 pf1 pf2 local 2 program paramProc;
var pa1, pa2:integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local := pf1+pf2; pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); writeln(pa1, pa2); end. 3 pa1 pa2 5 11 pf1 pf2 local 2
44
3 pa1 pa2 5 11 pf1 pf2 local 2 11 3 2 program paramProc;
var pa1, pa2:integer; procedure p(pf1: integer; var pf2: integer); var local: integer; begin local := pf1+pf2; pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); writeln(pa1, pa2); end. 3 pa1 pa2 5 11 pf1 pf2 local 2 11 3 2
45
3 pa1 pa2 5 11 3 2 3 5 program paramProc; var pa1, pa2:integer;
procedure p(pf1: integer; var pf2: integer); var local: integer; begin local := pf1+pf2; pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); writeln(pa1, pa2); end. 3 pa1 pa2 5 11 3 2 3 5
46
Diferencia: Primer parámetro por variable
program paramProc; var pa1, pa2:integer; procedure p(var pf1: integer; var pf2: integer); var local:integer; begin local := pf1+pf2; pf1:= pf1+1; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); p(pa2, pa2); end. pa1 pa2 Diferencia: Primer parámetro por variable
47
Diferencia: Los dos parametros por valor
program paramProc; var pa1,pa2:integer; procedure p(pf1: integer; pf2: integer); var local: integer; begin local := pf1+pf2; pf1:= pf1+1; pf2 :=local+1; writeln(pf1, pf2, local); end; pa1:=1; pa2:=5; p(pa1, pa1); end. pa1 pa2 Diferencia: Los dos parametros por valor
48
Se agrega la definición de una función
program parampyf; var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; Begin local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); End; pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); End. 1 pa1 pa2 5 Se agrega la definición de una función
49
1 pa1 pa2 5 1 pf1 pf2 local program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local
50
1 pa1 pa2 5 1 pf1 pf2 local program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local
51
RA= Registro de activación
program parampyf; var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 RA de p pf2 local x 1 RA de f f RA= Registro de activación El RA de cada primitiva almacena un lugar de memoria para cada parámetro formal y variable local.
52
1 pa1 pa2 5 1 pf1 pf2 local x 1 f 2 program parampyf;
var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local x 1 f 2
53
1 pa1 pa2 5 1 pf1 pf2 local program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local 2
54
1 pa1 pa2 5 1 pf1 pf2 local x 5 f program parampyf;
var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local 2 x 5 f
55
1 pa1 pa2 5 1 pf1 pf2 local x 5 f 6 program parampyf;
var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local 2 x 5 f 6
56
1 pa1 pa2 5 1 pf1 pf2 local 8 program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 5 1 pf1 pf2 local 8 2 6
57
1 pa1 pa2 9 11 pf1 pf2 local 8 program parampyf;
var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 9 11 pf1 pf2 local 8
58
1 pa1 pa2 9 11 pf1 pf2 local 8 11 9 8 program parampyf;
var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 9 11 pf1 pf2 local 8 11 9 8
59
1 pa1 pa2 9 11 9 8 1 9 program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2 :integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=5; p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2 9 11 9 8 1 9
60
1 pa1 pa2 program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=f(pa1); p(pa1, pa2); writeln(pa1, pa2); end. 1 pa1 pa2
61
1 pa1 pa2 2 program parampyf; var pa1, pa2: integer;
function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=f(pa1); p(f(pa1*2), pa2); writeln(pa1, pa2); end. 1 pa1 pa2 2
62
program parampyf; var pa1, pa2: integer; function f(x: integer): integer; begin f:=x+1; end; procedure p(pf1: integer; var pf2: integer); var local: integer; local := f(pf1) + f(pf2); pf1:= pf1+10; pf2 :=local+1; writeln(pf1, pf2, local); pa1:=1; pa2:=f(pa1); p(f(pa1*2), f(pa2)); writeln(pa1, pa2); end. pa1 pa2 Error en compilación El parámetro real no puede ser una llamada a función cuando el FORMAL es por referencia
63
Procedimientos y Funciones
Problema: Leer una secuencia de números positivos y generar un archivo con los números leídos que son capicúa. Escriba una función que determine si un número es capicúa y un programa que usando esta primitiva resuelva el problema.
64
Para estudiar en casa y preguntar a la profe en la consulta
65
Procedimientos y Funciones
ACTIVACIÓN DE UN PROCEDIMIENTO Una invocación a procedimiento es una instrucción. Una vez invocado, el control (la ejecución) pasa al procedimiento. El bloque de código que incluye la invocación, se suspende. Cuando comienza la ejecución se reserva espacio en memoria para las variables locales y para los parámetros formales por valor, que se inicializan con los valores de los parámetros reales. También para los parámetros formales por variable que almacenan la dirección de los parámetros reales correspondientes.
66
Procedimientos y Funciones
ACTIVACIÓN DE UN PROCEDIMIENTO El procedimiento se ejecuta y cuando termina, el control retorna, provocando algún efecto. El efecto de la ejecución de un procedimiento puede ser modificar uno o más parámetros por variable o producir una salida por consola o por archivo. El bloque de código que había quedado suspendido se reanuda, en la instrucción siguiente a la invocación.
67
Procedimientos y Funciones
ACTIVACIÓN DE UNA FUNCIÓN Una función se invoca desde una expresión. Una vez invocada el control (la ejecución) pasa a la función. El bloque de código que incluye la invocación, se suspende. Cuando comienza la ejecución se reserva espacio en memoria para las variables locales y para los parámetros por valor, que se inicializan con los valores de los parámetros reales. También se reserva un espacio para el resultado de la función.
68
Procedimientos y Funciones
ACTIVACIÓN DE UNA FUNCIÓN La función se ejecuta y cuando termina, el control retorna, provocando algún efecto. El efecto de la ejecución de una función es retornar un resultado. El bloque de código que había quedado suspendido se reanuda, continuando con la evaluación de la expresión que contiene a la invocación.
69
nombre(lista de parametros reales);
Problema: A partir de los montos de un resumen bancario ingresados por teclado, computar el total de créditos (valores positivos) y de débitos (valores negativos). La secuencia termina en 0. program resumenBanco; var totCre, totDeb:integer; … begin writeln(‘Ingrese los montos finalizando en 0.’); sumarDyC(totCre, totDeb); writeln('Creditos: ', totCre); writeln('Debitos: ', totDeb); end. La sintaxis de la llamada o invocación a un procedimiento es siempre la misma, tanto para los procedimientos predefinidos como para los definidos por el programador. nombre(lista de parametros reales);
70
Datos de salida = parámetros por referencia
procedure sumarDyC(var cc, cd: integer); var num :integer; begin cd:=0; cc:= 0; repeat readln(num); if (num < 0) then cd := cd + num else if (num > 0) then cc := cc + num; until (num = 0); end;
71
Cuando el programa principal invoca a sumarDyC, la ejecución del bloque principal se suspende y el control pasa al procedimiento. El bloque ejecutable del procedimiento se ejecuta completo y cuando termina el control vuelve al bloque principal, que continúa ejecutándose en la instrucción siguiente a la invocación. La variable num es una variable local al procedimiento, se crea justo antes de ejecutarse y se destruye cuando termina sumarDyC.
72
Las variables cc y cd son los parámetros formales del procedimiento sumarDyC.
Las variables totCre y totDeb son los parámetros reales del procedimiento. La palabra reservada var indica que: cc y totCre están ligadas una misma celda de memoria, cualquier cambio en cc dentro del procedimiento, va a ser visible en totCre, cuando el procedimiento termine. cd y totDeb están ligadas una misma celda de memoria, cualquier cambio en cd dentro del procedimiento, va a ser visible en totDeb, cuando el procedimiento termine.
73
procedure sumarDyC(var cc, cd: integer); var num :integer; begin
cd:=0; cc:= 0; repeat readln(num); if (num < 0) then cd := cd + num else if (num > 0) then cc := cc + num; until (num = 0); end; begin writeln(‘Ingrese los montos finalizando en 0.’); sumarDyC(totCre, totDeb); writeln('Creditos: ', totCre); writeln('Debitos: ', totDeb); end.
74
Problema: Leer los montos de un resumen bancario de un archivo y computar y mostrar el total de créditos (valores positivos) y de débitos (valores negativos). Escribir un programa que invoque al procedimiento para computar los totales de débitos y créditos del mes de marzo y luego los muestre.
75
program resumenBanco; var f: text; ccre, cdeb: integer;
procedure sumarDyC(var arch: text; var cc, cd: integer); … begin assign(f, 'c:\archivos\marzo.dat'); sumarDyC(f, ccre, cdeb); writeln('Creditos: ', ccre); writeln('Debitos: ', cdeb); end.
76
procedure sumarDyC(var arch: text; var cc, cd: integer);
var num: integer; begin reset(arch); cd:=0; cc:= 0; while not eof(arch) do readln(arch, num); if (num < 0) then cd := cd + num else if (num > 0) then cc := cc + num; end; close(arch); La ligadura entre los parámetros reales y formales es posicional, el primer parámetro real con el primer parámetro formal, el segundo con el segundo y así siguiendo.
77
Escriba un procedimiento que lea los montos de un resumen bancario de un archivo y compute el total de créditos (valores positivos) y de débitos (valores negativos). Luego, escriba un programa que invoque al procedimiento para computar los totales de débitos y créditos de los meses marzo y abril (almacenados en dos archivos diferentes), y muestre el total de los dos meses acumulados.
78
begin assign(f, 'c:\archivos\marzo.txt'); sumarDyC(f, ccreMarzo, cdebMarzo); assign(f, 'c:\archivos\abril.txt'); sumarDyC(f, ccreAbril, cdebAbril); writeln('Creditos: ', ccreMarzo+ccreAbril); writeln('Debitos: ', cdebMarzo+ccreAbril); readln; end.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.