Está en la página 1de 9

UTN - FRRO

Algoritmos y Estructuras de Datos


* Procedimientos y Funciones * Recursividad * Arreglos

Prof. CLAUDIA DANIA


Analista Universitario de Sistemas Especialista en Docencia Universitaria Licenciada en Sistemas de Informacin

Prof. CLAUDIA DANIA

1/ 8

PROCEDIMIENTOS Y FUNCIONES
DISEO DESCENDENTE: La especificacin detallada de un problema establece QUE debe hacer el programa pero NO COMO hacerlo. Por lo tanto una vez establecido los objetivos, se comenzar con el diseo mediante el enfoque de divide y vencers, tratando de dividir el problema en varias tareas amplias (mdulos), luego cada una de ellas se dividir a su vez en tareas ms pequeas, y as sucesivamente hasta llegar a niveles inferiores donde se pueden traducir directamente a lneas de cdigo. Se la conoce como metodologa Top-Down o de refinamiento sucesivo, donde cada mdulo representa una parte perfectamente definida siendo fcil de depurar y se evita la reprogramacin redundante de un mismo conjunto de instrucciones con diferentes datos. No debemos dejar de lado la prueba ascendente, probando de abajo hacia arriba, desde los distintos mdulos segn el orden establecidos en el programa conductor o principal, con datos supuestos, para determinar si alcanza el objetivo propuesto por el problema. Objetivos bsicos del Top-Down
q q q

Simplificacin del problema y de los subprogramas (mdulos) de cada descomposicin. Las diferentes partes del problema pueden ser programadas de modo independiente e incluso por diferentes personas. El programa final queda estructurado en forma de bloque o mdulos lo que hace mas sencilla su lectura y mantenimiento.

Existen dos tipos de mdulos: Procedimientos y Funciones.

PROCEDIMIENTOS
Es una estructura autnoma incluida en un programa Pascal. Se lo referencia escribiendo su nombre seguido de una lista opcional de parmetros encerrados entre parntesis y separados por comas. Cuando se lo referencia, el control es transferido al comienzo del mismo y cuando finalizan sus instrucciones, el control retorno a la sentencia inmediata posterior a la de referencia al procedimiento. PROCEDURE nombre (parmetros formales); (* este procedimiento realiza un proceso cualquiera*) VAR declaracin de variables propias del procedimiento; BEGIN instruccin 1; instruccin 2; ...; instruccin n END; Las variables y constantes que se utilizan en las instrucciones ejecutables del procedimiento pueden haber sido declaradas externamente en el programa principal o dentro del propio procedimiento. Las que se definieron en el programa principal se las denomina globales y pueden ser usadas dentro y fuera del procedimiento. Por otra parte las declaradas internamente se las denomina locales y no estn definidas (no tienen valor) fuera del procedimiento. Por lo tanto el mbito de un identificador es el lugar donde se lo define. En el momento en que un mdulo necesite intercambiar informacin cuando es referenciado, lo puede hacer con variables globales (por la definicin anterior); pero no siempre es factible, como por ejemplo cuando se lo invoca varias veces, al mismo mdulo, con distintos datos. Para solucionar sto, estn los parmetros. Cada dato se transfiere entre un parmetro actual, incluido en la referencia al procedimiento, y un parmetro formal definido en la declaracin del procedimiento. Cuando se lo invoca a ste, en la ejecucin, los parmetros actuales reemplazan a los formales logrando el intercambio de informacin.

Prof. CLAUDIA DANIA

2/ 8

Reglas de parmetros: El nmero de parmetros actuales de la referencia debe ser igual al nmero de parmetros formales en la definicin del procedimiento. Cada parmetro actual debe ser del mismo tipo que su correspondiente parmetro formal. El orden en que se transmiten los parmetros actuales, debe coincidir con el orden de los parmetros formales (el primer actual enva al primero formal, etc.) Cada parmetro actual debe ser consistente con su correspondiente parmetro formal segn sea la clase de este ltimo (ej. parmetro de retorno). A los parmetros formales se les declara su tipo en la cabecera del Procedimiento/Funcin, no en la declaracin de variables locales. Existen cuatro clases diferentes de parmetros formales: parmetro-valor, parmetro-variable; parmetroprocedimiento y parmetro-funcin. 1) PARAMETRO-VALOR: Son parmetros de entrada (nicamente) a los procedimientos. El uso de ellos implica una transferencia de valores. Los valores de los parmetros actuales son asignados a los parmetros-valor cuando se invoca al procedimiento. Si estos parmetros son modificados en el procedimiento no pueden ser transferidos en direccin opuesta, por lo tanto el programa principal no se entera de dichos cambios. PROGRAM ejemplo (INPUT, OUTPUT); VAR a,b: INTEGER; PROCEDURE cambio (x,y: INTEGER), BEGIN x:= x+25; y:= y-3; writeln(x,y) Muestra 1er. llamado: 30 END; Muestra 2do. llamado: 35 BEGIN a:= 5; b:= 3; cambio (a , b); cambio (a*2 , 7); writeln(a,b) Muestra fin del programa: END.

0 4

3 (sin cambios)

2) PARAMETRO-VARIABLE: Se los utiliza para enviar informacin en ambas direcciones; el procedimiento es capaz de incorporar entrada y salida, hacia y desde el bloque invocante. Cuando se invoca un procedimiento con parmetro-variable, el parmetro formal sustituye al parmetro actual porque, en lugar de transmitir el valor del dato, el parmetro actual transfiere la direccin real de memoria donde la variable se encuentra, compartiendo entonces la misma direccin de memoriaambos parmetros. Por tal motivo, el parmetro actual no puede ser una constante ni una expresin, debe ser una variable. Estos parmetros se los declara en la cabecera del procedimiento anteponindole la palabra clave VAR. PROGRAM ejemplo (INPUT, OUTPUT); VAR a,b: INTEGER; PROCEDURE cambio (var x:integer; y: INTEGER), BEGIN x:= x+25; y:= y-3; Muestra 1er. llamado: 30 writeln(x,y) Muestra 2do. llamado: 85 END; BEGIN a:= 5; b:= 3; cambio (a , b); cambio (a*2 , 7); Muestra fin del programa: writeln(a,b) END.

0 4

85

3 (cambia solo a)
Prof. CLAUDIA DANIA 3/ 8

FUNCIONES
Es una estructura autnoma de programa, similar a un procedimiento, con la condicin de que puede devolver un slo valor de tipo simple a travs de su propio nombre. Se la referencia invocando su nombre en una expresin (asignacin interna, escritura, comparaciones, etc.) como si fuera una variable ordinaria. En la declaracin de la funcin debe especificarse el tipo de la misma, debido a que se la trabaja como una variable. Se pueden utilizar parmetros encerrados entre parntesis y separados por coma. En general los parmetros formales sern parmetros-valor y no variable, de all que los parmetros actuales pueden ser constantes, variables o expresiones; el nico valor de salida suministrado por la funcin vendr representado por su nombre. Pueden asignarse valores al nombre de la funcin, en dos o ms instrucciones dentro del bloque de trabajo, sin embargo una vez que se hace la asignacin no puede modificarse posteriormente, de lo contrario caeramos en recursividad (llamado a si misma, se ver en el ltimo captulo del ao). Las funciones al igual que los procedimientos pueden anidarse dentro de s, y se pueden combinar anidamientos de procedimientos con funciones. Slo hay que tener en cuenta el mbito de declaracin de los mismos. PROGRAM ejemplo (INPUT, OUTPUT); VAR z, a: INTEGER; FUNCTION evaluar (x: INTEGER): REAL, (* la funcin tendr un resultado real, el parmetro-valor es entero*) VAR locales; BEGIN IF x > 100 then evaluar := x * 2 else evaluar := x / 2 END; Se define dos veces pero se asigna solo 1 BEGIN READ ( a , z ); res:= 2 + sqrt (z) + evaluar (z); res:= 2 + sqrt (a) + evaluar (a); ..... END.

DIFERENCIAS PROCEDIMIENTOS 1) Puede devolver cero, uno o ms resultados 2) El llamado se hace invocando su nombre en una instruccin independiente 3) Dentro del procedimiento no se debe usar su nombre 4) Se utilizan parmetros-valor y parmetros variables

ENTRE

FUNCIONES 1) Devuelve un solo resultado en su nombre 2) Se la llama en una instruccin de asignacin, de escritura o expresin (IF, WRITE, etc.) 3) Su nombre se lo usa para asignar el valor de retorno al programa, modificndolo una sola vez 4) Se utilizan parmetros-valor

5) Si hay una funcin y/o un procedimiento dentro de un procedimiento, stos deben ser declarados dentro del procedimiento antes del BEGIN del mismo. Y lo mismo si una funcin invoca a un procedimiento y/o funcin dentro de ella.

Prof. CLAUDIA DANIA

4/ 8

RECURSIVIDAD
Cuando dimos funciones, hicimos incapi en el uso correcto del nombre de la funcin, porque si se da una situacin en que una funcin se llama a s misma es una llamada recursiva; por lo tanto una definicin recursiva clsica se da en trminos de una versin ms pequea de s misma. Cundo se parara el proceso? Cuando hemos alcanzado un caso en el que sabemos la respuesta sin tener que aplicar otra vez la recursividad. El caso para los que se conoce explcitamente la respuesta se llama Caso Base; el caso para el que la solucin se expresa en trminos de una versin ms pequea de s mismo se llama Caso General Recursivo. Conclusin: un Algoritmo Recursivo es un algoritmo que expresa la solucin en trminos de una llamada recursiva a s mismo, consiste en partir de una base e ir construyendo los componentes de la funcin. La recursividad es muy poderosa en el manejo de nmeros naturales y estructuras de rbol. Ejemplo: a) Si 1 es un nmero natural, el siguiente de un natural es otro natural. b) Si 0 es un rbol (denominado rbol vaco), sus descendientes son rboles tambin. c) La funcin factorial n! (para enteros positivos): 0! = 1 y si n >0 entonces n! = n * (n-1)! Por lo tanto los algoritmos recursivos son apropiados para resolver estructuras definidas en forma recursiva, significa que se puede definir un nmero infinito de objetos mediante un enunciado finito. La forma de representar un programa recursivo es mediante procedimientos. Si el procedimiento tiene una referencia explcita a s mismo es Directamente recursivo, en cambio si la referencia es a otro procedimiento que a su vez este ltimo tiene una referencia al procedimiento que lo invoc se dice que el primero es Indirectamente recursivo. La condicin fundamental de un algoritmo recursivo es que ste dependa de una condicin que en algn momento no se cumpla para que finalice la recursividad, por dos conceptos fundamentales: 1) que la recursividad entrara en loop y 2) que el procedimiento adems de manejar variables y constantes locales necesita tambin memoria para almacenar el estado de proceso de clculo para recuperarlo e ir retrocediendo, reanudando situaciones antiguas hasta obtener el clculo final. PROGRAM Exponente (Input, Output); VAR nmero, exponente, respuesta : Integer; ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) FUNCTION Potencia (X, N : Integer) : Integer; BEGIN IF N = 1 THEN Potencia := X (* caso base *) ELSE Potencia := X * Potencia (X, N-1) (* llamada recursiva *) END; ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) BEGIN Readln (numero, exponente); respuesta := Potencia (numero, exponente); (* llamada no recursiva *) Writeln (respuesta) END. Comparacin de dos formas de resolver un factorial. FUNCTION Factorial (N : Integer) : Integer;
(* solucin iterativa *)

FUNCTION Factorial (N : Integer) : Integer;


(* solucin recursiva *)

VAR factor, contador : Integer; BEGIN factor := 1 ; FOR contador:= 2 TO N DO factor := factor * contador; factorial := factor END;

BEGIN IF N = 1 END;

THEN Factorial := 1 (* caso base *) ELSE Factorial := N * Factorial (N-1)


(* llamada recursiva *)

La versin iterativa tiene dos variables locales, la versin recursiva no tiene ninguna. La versin iterativa siempre tiene un bucle, la versin recursiva siempre tiene una bifurcacin.

Prof. CLAUDIA DANIA

5/ 8

ARREGLOS: Tipo de Datos Estructurados


Hasta el momento se han estudiado los datos de tipo simple cuya caracterstica comn es que cada variable representa a un solo dato individual. La diferencia con los datos estructurados es que un nico identificador puede representar a mltiples datos individuales, siendo referenciados en forma separada cada uno de stos por medio de ndices.

ARREGLOS UNIDIMENSIONALES
Puede ser considerado como una lista de datos, todos del mismo tipo, identificados en forma global mediante un nombre de no ms de 8 caracteres formado por letras y/o nmeros. Cada elemento (cada dato) se lo referencia con el nombre del arreglo seguido de un ndice (tambin llamado subndice) encerrado entre corchetes. VAR nombre del array: ARRAY [tipo de indice] OF tipo del arreglo; El tipo de ndice puede ser de tipo simple: entero, char, booleano, enumerativo o subrango, nunca real. El tipo de array puede ser cualquiera: entrero, char, booleano, real. Recordar que no se pueden mezclar datos de distintos tipos en un mismo arreglo. Se puede declarar de dos maneras: VAR columna: ARRAY [1 .. 100] OF integer; TYPE indice = 1 . . 100; VAR columna: ARRAY [indice] OF integer: Los elementos del arreglo pueden ser utilizados en estructuras de control, comparacin, sentencias de asignacin, sentencias de lectura y escritura, etc., identificndolos con el valor del ndice correspondiente, el cual puede ser una constante, una variable o una expresin. Ejemplo con ndice tipo enumerativo: TYPE color = (rojo , blanco , azul , amarillo , verde); VAR indice: color; valores: ARRAY [color] OF integer; ..... BEGIN FOR indice:='rojo' TO verde' DO WRITELN ( valores[indice] ); .... END.

ORDENAMIENTO
Ordenar un arreglo unidimensional de menor a mayor (Falso Burbuja): PROCEDURE orden1, (* intercambiar de menor a mayor los elementos de un array unidimensional *) BEGIN FOR i := 1 TO n-1 DO FOR k:= i + 1 TO n DO IF vec [i] > vec [k] THEN BEGIN aux:= vec [i]; vec [i] := vec [k]; vec [k] := aux END END;
Prof. CLAUDIA DANIA 6/ 8

ARREGLOS MULTIDIMENSIONALES
Valen las mismas consideraciones de los arreglos unidemensionales, en cuanto a los tipos de datos y tipos de ndices. Dentro de los arreglos multidimensionales daremos ejemplos de los bidimensionales compuestos por filas y columnas. La primera dimensin (es decir el primer ndice) se refiere al nmero de fila y la segunda dimensin (segundo ndice) al nmero de columna. En el caso de tres dimensiones, se lo considera como si fuese un conjunto de tablas encuadernadas, donde la tercer dimensin indicara la pgina del cuaderno. VAR nombre del array: ARRAY (tipo indice1, tipo indice2,...,tipo indiceN) OF tipo del arreglo; Se lo puede declarar como: VAR tabla : ARRAY [0 .. 100 , 1 .. 50] OF real; TYPE indice1 = 0 .. 100; indice2 = 1 .. 50; VAR tabla : ARRAY [indice1 , indice2] OF real;

ORDENAMIENTO
Ordenar un arreglo bidimensional de menor a mayor, por una columna en particular (Falso Burbuja): PROCEDURE orden2; CONST fila , col = 25; z = 3; VAR i , r , k , aux : INTEGER; mat : ARRAY [fila,col] of INTEGER; BEGIN FOR i := 1 TO fila-1 DO FOR r := i + 1 TO fila DO IF mat [i,z] > mat [r,z] THEN FOR k := 1 TO col DO BEGIN aux:= MAT [i,k]; MAT [i,k] := MAT [r,k]; MAT [r,k] := aux END END;

OPERACIONES CON ARREGLOS


PROCEDURE carga (VAR vec: ARRAY[1..N] OF REAL); VAR I: INTEGER; BEGIN FOR i := 1 TO N DO READ ( vec[i]) END; PROCEDURE carga (VAR mat: ARRAY[1..fila, 1..col] OF REAL); VAR i , j : INTEGER; BEGIN FOR i:= 1 TO fila DO FOR j := 1 TO col DO READ ( mat [i,j] ) END;

PROCEDURE exhibir (VAR vec: ARRAY[1..N] OF REAL); PROCEDURE exhibir (VAR mat: ARRAY[I..fila, 1..col] OF REAL); VAR i , j : INTEGER; VAR i: INTEGER; BEGIN BEGIN FOR i := 1 TO fila DO FOR i := 1 TO N DO BEGIN WRITE ( vec[i] ) FOR j := 1 TO col DO END; WRITE ( mat [i , j] ); WRITELN END END;
Prof. CLAUDIA DANIA 7/ 8

BUSQUEDA DICOTOMICA
PROCEDURE buscar; (* el arreglo se llama VEC, FIN es igual a la longitud del mismo,*) (* DATO es una variable cualquiera cuyo contenido puede ser *) (* igual no al contenido de algunas de las celdas *) VAR comi, fin, medio: INTEGER; q: BOOLEAN; BEGIN q := .F.; comi := 1; fin := n; REPEAT medio := (comi + fin) DIV 2; IF vec [medio] = dato THEN q := .T. ELSE IF vec [medio] > dato THEN fin := medio - 1 ELSE comi := medio + 1 UNTIL com > fin .OR. q IF q THEN WRITELN ( El Dato existe y est en la posicion = ', medio) ELSE WRITELN ('El dato no existe') END; BUSCA q ! .F. comi ! 1 fin ! n medio ! (comi + fin) DIV 2 vec [medio] = dato V q! .T. V fin ! medio - 1 HASTA comi > fin q q vec [medio] > dato F comi ! medio + 1 F

V WRITELN ('El dato existe y est en la posicin = ', medio)

F WRITELN (El dato no existe')

Prof. CLAUDIA DANIA

8/ 8

También podría gustarte