Resolución de problemas y algoritmos

Slides:



Advertisements
Presentaciones similares
IBD Curso 2007 Clase 2.
Advertisements

Programación de Computadores
Programación de Computadores
Iteración La iteración permite modelar problemas en los cuales una secuencia de instrucciones debe ejecutarse varias veces. La cantidad de iteraciones.
Elementos de Pascal Escribir un programa en Pascal que lea los valores de los catetos de un triángulo rectángulo y calcule y muestre la hipotenusa. program.
Resolución de Problemas y Algoritmos Buffer - Read & Readln
C lase 10 COMPUTACION /17/2014Computacion - Fac. Ingeniería2  Ademas de los ya vistos (tipos simples), puede usarse como parámetros variables.
Cobol C Pascal Fortran 5. UNIDADES DE PROGRAMAS SmallTalk Java C++
Página Web del Lenguaje Pascal.
Resolución de Problemas y Algoritmos Uso de iteración con secuencias
Sesión 5 Sentencias de Selección y repetición Prof:Eridan Otto Programación de Computadores Lenguaje Pascal.
Resolución de Problemas y Algoritmos Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Bahía Blanca - Argentina.
COMPUTACION 2009 C lase 4 Programa PASCAL SENTENCIAS DATOS Expresiones Tipos Declaración de variables Declaración de variables Asignación Entrada/Salida.
Teoría – Alejandro Gonzalez
Ada 2º Parte (variables, ámbitos , subrutinas , tipos abstractos de datos y excepciones)
Definir un vector Forma general Variable=[tipo]*tamaño Tipo: es el valor inicial con el cual quedarán llenas todas las posiciones creadas del vector. Tamaño:
COMPUTACIÓN I TEMA 5. Subprogramas o funciones. Alcance de variables
Contenido:  ¿Qué son los Punteros?  Los Procedimientos: New y Dispose.
Paso de Parámetros a una Función Prof. Flor Narciso Departamento de Computación Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de.
Entrada y Salida en C++, Estructuras de Control Prof. Manuel B. Sánchez.
AYUDANTÍA 2 Lenguaje Imperativo y Java. Punteros Dirección a memoria (puede apuntar a NULL). Permite trabajar con memoria (variables dinámicas de heap).
Trabajar con módulosTrabajar con variables públicasCrear procedimientos Pasar argumentos por valor y por referencia Referencia rápida.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Una estrategia para evitar la sucesiones repetidas de instrucciones convertir la secuencia en un procedimiento e invocarlo cada vez que se necesite.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
Introducción a la Programación Multimedial
Introducción a la programación en JAVA
Introducción a la Programación Multimedial
Olimpiadas Chilenas de Informática - Formación
Olimpiadas Chilenas de Informática - Formación
INFORMATICA DEL CBU Clase 8 Año 2016 PROCEDIMIENTOS.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Conceptos básicos de programación
Métodos en Java.
Página Web del Lenguaje Pascal.
5. SQL Procedural.
Resolución de problemas y algoritmos
Estructuras de control repetitivas
Resolución de problemas y algoritmos
Tema 4 Elementos para el Desarrollo de Algoritmos
Procedimientos y Funciones
Cobol C Pascal Fortran 6. PARAMETRIZACIÓN SmallTalk Java C++
PROGRAMACIÓN 1 INTRODUCCIÓN
Paul Leger Ciclos:FOR Paul Leger
Diego Hernández R Pascal Variables Diego Hernández R
Fundamentos de programación
LENGUAJE C.
Tema 9. Estructuras de repetición. Clase 2
Estructuras de Control Ciclos
INFORMATICA DEL CBU Clase 9 Año 2016 FUNCIONES ARREGLOS.
Análisis y resolución de problemas
Estructuras de Datos Aun en problemas muy simples surge la necesidad de agrupar valores elementales de alguna manera. Cuando representamos una caja de.
FUNCIONES Y PROCEDIMIENTOS
Estructuras de Control 2 Ciclos
Características Objeto Relacionales en Oracle
Informática Ingeniería en Electrónica y Automática Industrial
Macroprocesador.
Diego Hernández R Pascal Variables Diego Hernández R
Procedimientos y Funciones
String, arreglos y arreglos bidimensionales
Programación Modular Programación de Computadoras - Hugo Vega Grupo2: Reina Rodríguez Miriam Salluca.
Diego Hernández R. Archivos Diego Hernández R.
String, arreglos y arreglos bidimensionales
Procedimientos y Funciones
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Variables, Expresiones y Enunciados
Funciones Subprogramas definidos por el usuario Subprogrmas.
Tema 8. Estructuras de decisión. Clases 1 y 2.
UNIDAD V ESTRUCTURA REPETITIVA (Repetir Hasta Que)
UNIDAD VII FUNCIONES (SUBPROCESOS)
Transcripción de la presentación:

Resolución de problemas y algoritmos Dra. Jessica Andrea Carballido jac@cs.uns.edu.ar Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR

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.

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.

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.

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.

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.

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.

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.

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 … -10 7 -3 -9 -2 -3

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 … -10 7 -3 -9 -2 -3 -2 5

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 0011001 0001 1101000 0010 1110110 0011 1100001 0100 0111101 0101 1100110

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 0011001 0001 1101000 0010 1110110 0011 1100001 0100 0111101 0101 1100110 Parámetro por referencia

“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 !

“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 !

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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.

Para estudiar en casa y preguntar a la profe en la consulta

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.

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.

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.

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.

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);

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;

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.

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.

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.

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.

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.

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.

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.

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.