Professional Documents
Culture Documents
Muchas veces es ms elegante y barato mejorar un algoritmo que comprar una computadora ms rpida.
Los dilemas algortmicos estn presentes en todas las actividades humanas y resolverlos en forma rpida
y eficiente puede ser un desafo entretenido si gustamos de la lgica y la matemtica.
R. Baeza-Yates
Programacin modular
La experiencia ha demostrado que un problema complejo se resuelve mejor si se lo divide en sub-problemas de
menor complejidad, es decir, dado un problema se debe pensar en sub-problemas que constituyan mdulos
separados que luego se ensamblen para construir el algoritmo que resuelva el problema de origen.
Las caractersticas de dichos mdulos son:
cada uno de estos mdulos debe ser independiente de los otros,
cada mdulo debe estar definido en s mismo, con sus entradas, sus acciones, y sus resultados; se los
puede probar en forma independiente y
permite que, diferentes diseadores del programa puedan trabajar simultneamente en cada uno de ellos.
Estos mdulos luego son ensamblados adecuadamente para lograr la resolucin del problema inicial.
Dado que los mdulos son independientes se los puede modificar sin afectar a los otros.
Por otro lado, el concepto de modularizacin se puede asociar al concepto de reuso. En la resolucin de problemas
complejos se pueden utilizar partes de otros problemas previamente resueltos, esto es, reutilizar soluciones ya
conocidas, testeadas con anterioridad.
Un algoritmo o parte de l que puede ser reutilizado en otros contextos de problemas algortmicos recibe el
nombre de mdulo o rutina. Una rutina, segn el diccionario de la Real Academia Espaola, es una secuencia
invariable de instrucciones que forma parte de un programa y se puede utilizar repetidamente.
Una buena parte del tiempo empleado en resolver problemas se usa en identificar rutinas y reutilizarlas en forma
apropiada.
Cada mdulo es parte de un algoritmo general, por lo cual lo denominaremos subalgoritmo.
Concepto de Subalgoritmo
Un subalgoritmo define una tarea que realiza algo especfico y puede ser reutilizada en otros contextos de
resolucin de problemas algortmicos.
Algunos mdulos son tan comunes que estn incluidos en los lenguajes de programacin. Son las denominadas
funciones internas, tales como sin( ), cos( ), abs( ), las cuales son suministradas en forma de biblioteca o paquetes
de mdulos reutilizables.
Como se mencion cada subalgoritmo puede desarrollarse en forma independiente de los restantes. Tiene una
zona de ingreso de datos y otra de salida de resultados.
Los esquemas que se muestran a continuacin representan dos posibles estructuras equivalentes de diseo de
algoritmos utilizando subalgoritmos. Notar que es lo mismo pensar y escribir primero los subalgoritmos, y luego
utilizarlos en el algoritmo principal, o primero pensar y escribir el algoritmo principal proponiendo los
subalgoritmos, y luego escribir cada uno de ellos. Es decir, es indistinto el orden en que se piensan y escriben el
algoritmo y subalgoritmos que componen el mismo.
Ing. L. Angelone
Pgina 1
En general se diferencian dos tipos de subalgoritmo, acorde a las tareas que desarrollan, ellos son los
subalgoritmos funcin y los subalgoritmos subrutina, que veremos a continuacin.
Subalgoritmo funcin
Este tipo de subalgoritmos se implementan cuando la tares a desarrollar devuelven un nico resultado, en general
son clculos. Responden al concepto matemtico de funcin de una o ms variables.
Ejemplos de este tipo de subalgoritmos son las funciones internas, tales como sin( ), cos( ), abs( ), hallar el
mximo de un conjunto de nmeros, etc.
Un subalgoritmo funcin es un subalgoritmo que recibiendo o no datos devuelve un nico resultado.
Una funcin es un objeto del ambiente, con nombre, tipo y valor nico. El tipo se asocia al valor que retorna la
funcin cuando es evaluada con un conjunto dado de valores de sus argumentos.
Sintaxis de la declaracin de funciones
funcin <nombre de la funcin>(<lista de parmetros>): <Tipo de resultado>
var
<declaracin de variables>
Inicio
Cuerpo <acciones>
Devolver (<constante, variable o expresin>)
fin funcin
Nombre de funcin: el nombre de una funcin sigue la misma regla de los nombres de variables, es decir, debe ser
un identificador vlido.
Tipo de resultado: seala el tipo de informacin que devuelve la funcin.
Lista de parmetros: contiene las variables que pasan informacin necesaria para que la funcin ejecute el
conjunto de acciones. Cada variable de la lista debe tener una declaracin de tipo dentro del parntesis. Puede que
no haya lista de parmetros; en dicho caso se escribe el parntesis vaco.
Declaracin de variables: en este lugar se deben declarar aquellas variables que se usarn en la funcin, salvo las
que estn declaradas en la lista de parmetros. Estas variables son llamadas locales dado que su alcance se
restringe a la funcin. Cuando se abandona la funcin dichas variables no pueden ser accedidas, son locales a la
funcin.
Cuerpo de la funcin: lo constituye el conjunto de acciones a realizar por la funcin.
Retornar el resultado: el nico resultado que devuelve la funcin puede ser un valor constante, o una variable o
una expresin vlida, la cual debe colocarse entre parntesis al lado de la accin Devolver. Cuando se ejecuta esta
accin se devuelve el control del algoritmo al lugar donde se ha llamado la funcin.
Ing. L. Angelone
Pgina 2
Modo 2
Algortimo calcul_potencia
var
entero n, real w
inicio
escribir(Evala la funcin y=w^n)
escribir (Ingrese valor de n)
leer (n)
escribir (Ingrese valor de w)
leer(w)
escribir(El valor es:, potencia(w,n))
fin
Algortimo calcul_potencia
var
entero n, real w,z
inicio
escribir(Evala la funcin y=w^n)
escribir(Ingrese valor de n)
leer(n)
escribir(Ingrese valor de w)
leer(w)
z <- potencia(w,n)
escribir (El valor es :, z )
fin
En este ejemplo se muestran dos formas posibles de utilizacin de la funcin potencia: en el modo 1 la funcin
potencia es empleada directamente dentro de la accin escribir, mientras que en el modo 2 el valor devuelto por la
funcin potencia es asignado en la variable real z y es el valor almacenado en z el que luego se muestra.
Diferentes formas de invocar/llamar a un subalgoritmo funcin
Dentro de una condicin, pro ej. Mientras potencia(w,n) < 100 hacer .
Ing. L. Angelone
Pgina 3
Subalgoritmo subrutina
El empleo de los subalgoritmos funcin estn limitados a los casos donde el resultado debe ser expresado por un
nico valor. Sin embargo, en ciertas ocasiones se necesita que el subalgoritmo devuelva ms de un valor (por
ejemplo races de un polinomio) o no devuelva nada (una impresin), en este caso se introduce una nueva idea de
subalgoritmo que se denomina subrutina.
En general se piensa en una subrutina cuando la tarea a desarrollar es un proceso que no necesariamente tenga un
resultado, tales como impresin, ordenamiento, bsqueda de informacin, dibujo de figuras o interfaces, entre
otros.
Una subrutina es un subalgoritmo que recibiendo o no datos permite devolver varios resultados, un resultado o
ninguno.
Ing. L. Angelone
Pgina 4
Ing. L. Angelone
Pgina 5
Notar que existe una nica forma de invocar a las subrutinas, y esto es: escribiendo el nombre de la subrutina
seguido de los argumentos entre parntesis, como si fuera una accin ms - tales como el Leer(..) o el Escribir(...).
INFORMATICA I
')
Ejemplo 9: Escribir un subalgoritmo subrutina que muestre una lnea de asteriscos de longitud a requerimiento del
usuario.subrutina TrazalineaII ( E: entero long)
var entero i
inicio
repetir para i=1 hasta
escribir (*)
finpara
fin subrutina
long
hacer
')
Ejemplo 9: Escribir un subalgoritmo subrutina que muestre una lnea de de longitud y carcter a requerimiento del
usuario
subrutina TrazalineaIII (E: entero long, char simb)
var entero i
inicio
Repetir para i <-1 hasta long hacer
escribir ( simb )
finpara
fin subrutina
Ing. L. Angelone
Pgina 6
')
Ejemplo 11: desarrollar un algoritmo para ordenar tres nmeros reales utilizando la subrutina intercambio.
Algoritmo ordenar
var
real x, y, z
inicio
escribir (Ingrese tres nmeros reales )
leer (x, y, z)
si x > y entonces intercambio (x, y)
fin si
si y > z entonces intercambio (y, z)
fin si
si x > y entonces intercambio (x, y)
fin si
escribir (x, y, z)
fin
Ing. L. Angelone
Pgina 7
En este caso la correspondencia entre argumentos y parmetros es x con x1, y con x2, tiempo con t
temp x * y * tiempo + Cuenta(1.5*x, (x+z)*2.5, tiempo)
lista de argumentos,
(antes de establecer la
correspondencia con los parmetros, formales se deben
resolver evaluar las expresiones: 1.5*x y , (x+yz)*2.5
Como conclusin podemos decir que los parmetros van con las definiciones de los subalgoritmos y los
argumentos con las llamadas a los mismos.
Ejemplo 13: parmetros y argumentos en la subrutina divisin
subrutina divisin (E: entero dividendo,divisor; S: entero cociente, resto)
inicio
cociente dividendo div divisor
lista de parmetros:
resto dividendo mod divisor
fin subrutina divisin
dividendo, diviso y cociente.
lista de argumentos: m, n, p y q
En este caso la correspondencia entre argumentos y parmetros es m con dividendo, n con divisor, p con cociente,
q con resto.
divisin (m*n-4, n+1, s, t )
Ing. L. Angelone
Pgina 8
real x
entero i
Comienzo
Leer( x, i )
Escribir ( Potencia ( x ,i ) )
Fin
yy*x
finpara
Si n < 0 entonces y 1 / y
fin si
Devolver(y)
fin funcin
Memoria RAM
RAM programa
Ing. L. Angelone
RAM subprograma
x
Pgina 9
h, r , x son variables locales ,z es una variable global que es usada por la funcin.
existen dos variables x distintas una est definida en la memoria que tiene asignado el algoritmo y la otra
(local a la funcin) est definida en la memoria que tiene asignado el subalgoritmo funcin. Por lo tanto,
al estar en lugares distintos, no son iguales.
Si se desea que un conjunto de variables tenga "visibilidad "en todo el programa ( algoritmo principal y
subalgoritmos ) las variables deben definirse como globales. En este caso se trabaja sobre una nica
posicin de memoria y todos los mdulos miran a esa posicin al referenciar el nombre de la variable
global. Este tipo de proceso debe usarse en casos muy especficos, pues el abuso genera programas
difciles de mantener, o resultados no deseados.
Ing. L. Angelone
Pgina 10
)
" y = ", c1)
" y = ", c2)
y =", y)
Notemos que :
- a1, a2, b1, b2, c1, c2 , x , y son variables globales, pero ninguna es usada como tales en el subrutina, ya que
ste tiene var a1, a2, b1, b2, c1, c2, sol1, sol2, D , DX y DY que son variables locales a l.
- a1, a2, b1, b2, c1, c2 del algoritmo no son las mismas que las del subrutina.
- sol1 y sol2 son variables de salida de resultados, y dichos resultados son tomados por x e y respectivamente
del algoritmo.
Otra forma ( no conveniente ) de resolucin del subrutina sera usando a : a1, a2, b1, b2, c1, c2 como variables
globales , a saber :
Subrutina RESOLVER
var real D,DX,DY
Comienzo
D= a1 * b2 DX = c1 * b2
DY = a1 * c2
sol1 = DX /
sol2 = DY /
fin subrutina
Ing. L. Angelone
a2 * b1
- c2 * b1
- a2 * c1
D
D
Pgina 11
n!= n * (n 1) * ... * 2 * 1
Viendo la frmula del factorial podemos utilizar factorial ( n) = n * factorial ( n 1) donde se utiliza la
funcin factorial para calcular el nuevo factorial.
Comencemos a construir, en forma recursiva, el factorial (n)
Ing. L. Angelone
Pgina 12
si n = 0
factorial (n)
n * factorial (n 1) si n <> 0
El subalgoritmo factorial (n) construido en forma recursiva, resulta:
Funcin factorial ( n : entero) : entero
inicio
Si n=0 entonces Devolver(1)
Sino Devolver(n*factorial(n-1))
finsi
fin
En muchos casos, sin embargo, la solucin recursiva no es la mejor, porque una simple solucin puede obtenerse
utilizando un esquema de repeticin o una frmula matemtica.
Ing. L. Angelone
Pgina 13
Men
Hasta ahora realizamos los algoritmos por separado sin ningn nexo de unin entre ellos.
Generalmente esto no sucede as, en problemas ms complejos aparecen relaciones entre distintos algoritmos, y se
debe realizar uno que indique cul es el que deseamos ejecutar en ese instante, el algoritmo principal. Gracias a la
existencia de subalgoritmos, esto es posible.
Un men consiste en presentar en pantalla una ventana con una serie de opciones a realizar,
cada una de las cuales realiza una operacin determinada.
En cada opcin podremos colocar la llamada a un subalgoritmo, que cuando se termina de ejecutar, el algoritmo
vuelve de nuevo a presentar el men del que haba partido.
A veces los mens se presentan anidados, es decir, alguna de las opciones del men, al ser seleccionada, hace que
aparezca otro men, dando lugar a nuevas posibilidades de eleccin.
Los mens permiten ejecutar ms de un programa, sin necesidad de tener que escribir su nombre, cada vez que se
desea ejecutarlo. Simplemente, le indicaremos mediante una variable la opcin deseada.
La seleccin de opciones del algoritmo generalmente se realiza con la estructura de seleccin mltiple Segn sea.
La idea es:
Repetir
Escribir ( Men de opciones)
Escribir ( 1: Ingresar un nuevo artculo )
Escribir ( 2: Buscar precio por artculo )
Escribir ( 3: Modificar precios )
Escribir ( 4: Dar de baja un artculo)
Escribir ( 0: FIN )
Escribir ( Ingrese su opcin)
Leer ( opcin )
Segn sea opcin hacer
1: INGRESO
2: BUSQUEDA
3: MODIFICAR
4: SACAR
Ing. L. Angelone
Pgina 14
Opcin 1:
Se deber registrar un nuevo feriado con la Fecha y con el Nombre del Feriado, siempre y
cuando ste no exista.
Opcin2:
Al ingresar los datos de un nuevo registro se deber validar que la fecha no corresponda a algn
feriado. Si correspondiera a un feriado, se deber reingresar la fecha hasta que sea vlida.
Para cada fecha, se deber registrar por separado la cantidad producida en cada turno. Se sabe que
puede haber ms de un registro con la mismo fecha y del mismo turno. En ese caso se deber
sumar al anterior.
Opcin3:
Finalizar la ejecucin del programa
El algoritmo/programa principal slo deber manejar el men de opciones e invocar a los subalgoritmos
necesarios.
Los datos pueden ser pensados segn el siguiente ejemplo:
FERIADOS 2012
FechaNombre
01/01/20120
FERIADOS 2012
5Primero
de
Fecha Nombre
Ao01/05/201205Da
del
01/01/2012 Primero de Ao
Trabajador20/06/201205Da
Da del Trabajador
de la01/05/2012
Bandera
20/06/2012 Da de la Bandera
FechaMaanaTardeNoche
02/01/201205
MOTORES TURNOS Registros ao
2012
120015
03/01/2012050036
10/02/20120
Fecha
Maana Tarde Noche
548251312/02/20120512554908/03/2
02/01/2012
12
0
15
012059582009/03/2012051026583
03/01/2012
0
0
3
10/02/2012
12/02/2012
08/03/2012
09/03/2012
48
12
95
102
25
55
82
65
13
49
0
83
type
m0: array[365] string
var
entero opcion
m0 motores0
Ing. L. Angelone
Pgina 15
m1 motores1
m2 feriados
inicio
Repetir
escribir(1.- Agregar nuevo feriado)
escribir(2.- Insertar nuevo Ticket)
escribir(3.- Salir)
escribir(Ingrese su Opcin)
Repetir mientras (opcion<1) OR (opcion>3)
escribir(La opcin elegida no es correcta.
Por favor ingrese nuevamente su eleccin)
leer(opcion)
fin mientras
Segn sea opcion hacer
1:
2:
3:
agregar_feriado(feriados)
insertar_ticket( motores0, motores1)
fin
fin_segun
hasta_que (opcin==3)
fin
subrutina agregar_feriado (E/S m2 feriados)
var
string fecha_feriado
string nombre_feriado
entero i
inicio
repetir
escribir(Ingrese Fecha [dd/mm/aa])
leer(fecha_feriado)
hasta_que feriado_existente(fecha_feriado)=1
escribir(Ingrese el nombre del feriado)
leer(nombre_feriado)
i=1
Repetir mientras (feriados[i,1]<>) y (i<366) hacer
i=i+1
fin_mientras
feriados[i+1,1] = fecha_feriado
feriados[i+1,2] = nombre_feriado
fin_subrutina
Pgina 16
var
string fecha
entero cant_motores, posicion
char turno
inicio
repetir
escribir(Ingrese Fecha de Fabricacin)
leer(fecha)
hasta_que feriado_existente(fecha)=0
repetir
escribir(Ingrese Cantidad de Motores fabricados)
leer(cant_motores)
hasta_que cant_motores>0
repetir
escibir(Ingrese Turno)
leer(turno)
hasta_que (turno=M) o (turno=T) o (turno=N)
posicin=buscar_fecha(motores0, fecha)
motores0[posicin] = fecha
segn_sea turno
M: motores1[posicin,1] = motores1[posicin,1] + cant_motores
T:
N:
fin_segun
fin_subrutina
Bibliografa
Joyanes Aguilar, L. Fundamentos de Programacin. Algoritmos, estructuras de datos y objetos (2009) 3ra Edicin
McGraw-Hill.
Lage F., Cataldi, Z., Salgueiro, F., (2008) Fundamentos de Algoritmos y Programacin, Editorial NUEVA
LIBRERA.
Ing. L. Angelone
Pgina 17