Documente Academic
Documente Profesional
Documente Cultură
Algoritmia
Un enfoque prctico y didctico
para el diseo de algoritmos
Agradecimientos
Para Cristi, Anto, Meli,
Euge, Gustavo, Nahuel, Esteban, Ornella, Yamila y
todos los estudiantes de UTN FRBA, USAL y el KRAUSE.
A mis amigos Carlos Tomassino, Jorge Muchnik, Marcelo Zanitti y Alicia Giorgetti y
Zulma Cataldi
A mis maestros Leopoldo Carranza,
Roberto Laborero,
Carlos Cullen
PROLOGO
Quien este prlogo escribe, lleva ms de cuarenta aos dedicado a la actividad
informtica cuando an ni siquiera se llamaba informtica! habindose iniciado
como programador y vivido lidiando en todos los rdenes con los proyectos de estas
tecnologas, tanto desde la docencia como desde la gestin, en la actividad de campo y
la consultora.
En aquellos lejanos tiempos, la programacin era desarrollada con criterios ms basados
en la intuicin y la creatividad que en las metodologas.
Cuando con el devenir de las dcadas las tecnologas fueron miniaturizndose y con
ello, consecuentemente, debieron bajarse los costos de los proyectos informticos, los
programas de computacin debieron a su vez volverse ms cercanos a las realidades de
las pocas, y hubieron mtodos que acercaron los costos de la programacin a los
nuevos tiempos y esfuerzos.
Y si bien esto fue llevndose a la prctica con la aparicin de las nuevas formas de la
Programacin Estructurada durante los aos ochenta, recin con la visin de Objetos,
sobre finales del milenio, puede aseverarse que estamos en el camino correcto, cual es el
de mezclar mtodo con creatividad.
El libro Programacin y Algoritmiaque hoy se presenta describe con claridad de
conceptos todo lo que debe ser tenido en cuenta para que un programa de cualquier
ndole y con independencia del lenguaje, termine exitoso.
Su autor, un estudioso y entraable amigo, el Magister en Docencia Universitaria y
Licenciado Oscar Ricardo Bruno, vuelca en l su larga experiencia en este campo, tanto
en la Universidad Tecnolgica Nacional, como en la Universidad del Salvador o la
Escuela Tcnica Nmero 1 Otto Krause, y permite al lector alcanzar un alto nivel de
aprendizaje del manejo metodolgico de la programacin con las mejores tcnicas.
Pero, tanto Bruno como quien esto escribe, sabemos la verdad revelada sobre el tema y
la debemos transmitir a los jvenes lectores: la programacin solo se aprende en
gerundio: esto es, programando. Por lo que debemos decirle que cuando Ud. se
encuentre ante el problema, sentado frente a la PC, recin all sabr cabalmente cmo
llevar el programa adelante, ya que las experiencias a veces muy ricas en contenido no son traspasables.
En Programacin y Algoritmia solo le suministramos las reglas: Ud deber ver cmo
las aplica para llevar su programa a buen puerto. Buena suerte!
________________
Lic Carlos Tomassino
Presidente de Fundesco y
Director de la Ctedra Proyecto en la UTN - Facultad Regional Buenos Aires
Contenido
Conceptos bsicos _____________________________________________________ 8
Introduccin:_______________________________________________________ 8
Informtica ________________________________________________________ 8
Programacin ______________________________________________________ 8
Partes de un programa_______________________________________________ 9
Dato ______________________________________________________________ 9
Abstraccin _______________________________________________________ 10
Modelizacion ______________________________________________________ 10
Precondicin ______________________________________________________ 10
Poscondicin ______________________________________________________ 10
Especificacin _____________________________________________________ 10
Lenguaje de programacin __________________________________________ 10
Del problema real a su solucin por computadoras ______________________ 10
Caractersticas de un algoritmo ______________________________________ 13
Propiedades de los algoritmos ________________________________________ 14
Eficiencia de un algoritmo ___________________________________________ 14
Complejidades ms comunes_________________________________________ 15
Lxico y algoritmo _________________________________________________ 15
Estructura de un algoritmo __________________________________________ 15
Proceso Computacional _____________________________________________ 16
Representaciones grficas de algoritmos__________________________________ 21
Diagrama de Nassi-Sneiderman ______________________________________ 21
Diagramas de Jackson ______________________________________________ 21
Diagramas de Lindsay.______________________________________________ 22
Llaves de Warniel __________________________________________________ 23
Notacin Algoritmica _______________________________________________ 23
Asignacin - Control Iteracin ________________________________________ 24
Introduccin:______________________________________________________ 24
Asignacin, secuenciacin y anlisis de casos ___________________________ 24
Asignacin. _______________________________________________________ 24
Anlisis de casos ___________________________________________________ 25
La necesidad de iterar ______________________________________________ 29
Composiciones iterativas ____________________________________________ 30
Composiciones iterativas No Exactas __________________________________ 31
Composiciones iterativas Exactas _____________________________________ 31
Recursividad ______________________________________________________ 33
Iteracin vs. Recursion______________________________________________ 34
Algoritmos que utilizan secuencias ____________________________________ 35
Estilos de Indentacin ______________________________________________ 40
Acciones y Funciones _________________________________________________ 42
Introduccin ______________________________________________________ 42
Modularizacion ____________________________________________________ 42
Mdulos __________________________________________________________ 42
Alcance de los datos ________________________________________________ 43
Datos locales y globales _____________________________________________ 43
Ocultamiento y proteccin de datos ___________________________________ 43
Parmetros _______________________________________________________ 43
Integridad de los datos ______________________________________________ 43
Proteccin de datos_________________________________________________ 44
Uso de parmetros para retornar valores ______________________________ 44
Utilidad del uso de parmetros _______________________________________ 44
Reusabilidad ______________________________________________________ 44
Acciones __________________________________________________________ 44
Utilizacin de acciones ______________________________________________ 44
Acciones con parmetros ____________________________________________ 45
Abstraccin y acciones ______________________________________________ 45
Tipos de Parmetros________________________________________________ 46
Beneficios del uso de acciones ________________________________________ 47
Funciones_________________________________________________________ 47
Estructuras Enlazadas_________________________________________________ 49
Introduccin ______________________________________________________ 49
Estructuras enlazadas vs. estructuras indexadas ________________________ 49
Estructuras enlazadas con asignacin dinmica en memoria ______________ 49
El tipo de dato Puntero______________________________________________ 51
Conceptos bsicos
Objetivos de aprendizaje
Dominando los temas del presente capitulo Usted podr.
1. Conocer la terminologa propia de la disciplina.
2. Definir y comprender claramente conceptos especficos muchas veces mal
definidos
3. Comprender el valor de la abstraccin.
4. Dar valor a la eficiencia en las soluciones
5. Introducirse en la notacin algortmica y a la forma e encarar los problemas de
programacin
Introduccin:
Se introducen conceptos fundamentales de algoritmia y programacin, los que servirn
de base para el desarrollo de los temas a trataren materias de algoritmos y estructurad e
datos.
Informtica
Disciplina del estudio sistematizado de los procesos algortmicos que describen y
transforman informacin, su teora, anlisis, diseo, eficiencia, implementacin y
aplicacin.
La informtica es una disciplina cientfica, matemtica y una ingeniera; tiene tres
formas de pensar propias: Teora, abstraccin y diseo.
Las tres se complementan para la resolucin de la mayora de los problemas.
Teora: Con el pensamiento terico se describen y prueban relaciones.
Abstraccin: Recoleccin de datos y formulacin de un modelo, se eliminan los
detalles irrelevantes.
Diseo: se tienen en cuenta requisitos, especificaciones y se disean o analizan
mecanismos para resolver problemas. Supone llevar a la prctica los resultados
tericos.
Programacin
La programacin es una actividad transversal asociada a cualquier rea de la
informtica, aunque es la ingeniera del software el rea especfica que se ocupa de la
creacin del software.
En principio la programacin se vea como un arte, solo era cuestin de dominar un
lenguaje de programacin y aplicar habilidades personales a la resolucin de problemas,
casi en forma artesanal. El software era visto como algo desarrollado a travs de la
intuicin sin la utilizacin de mtodos de diseo con tcnicas para proceder en forma
sistemtica y sin ningn control de su desarrollo. Con el reconocimiento de la
complejidad del desarrollo del software naci la ingeniera del software.
Se considero que al igual que cualquier otra disciplina la creacin de software deba ser
reconocida como una actividad de ingeniera que requera la aplicacin de slidos
principios cientficos.
La ingeniera del software es la disciplina que se ocupa de la aplicacin del
conocimiento cientfico al diseo y construccin de programas de computacin y a
todas las actividades asociadas de documentacin, operacin y mantenimiento, lo que
proporciona un enfoque sistemtico.
La programacin es una actividad en la que la creatividad juega un rol primordial
Programa:
Conjunto de instrucciones, ejecutables sobre una computadora, que permite cumplir una
funcin especifica. Se asocia al programa con una determinada funcin o requerimiento
a satisfacer por la ejecucin del conjunto de instrucciones que lo forman. En general
alcanzan su objetivo en tiempo finito, aunque hay excepciones, por ejemplo los
programas de control de un sistema de alarma poseen requerimiento de tiempo infinito.
Un programa sin errores que se ejecuta puede no ser correcto si no cumple con los
requerimientos.
Definicin
Programa: conjunto de instrucciones no activas almacenadas en un computador, se
vuelve tarea a partir de que se selecciona para su ejecucin y permite cumplir una
funcin especfica. Un proceso es un programa en ejecucin.
En principio las tareas ms importantes a la que se enfrenta quien debe escribir
programas en computadoras son:
1. Definir el conjunto de instrucciones cuya ejecucin ordenada conduce a la
solucin.
2. Elegir la representacin adecuada de los datos del problema.
La funcin esencial del especialista informtico es explotar el potencial de las
computadoras para resolver situaciones del mundo real. Para esto debe analizar los
problemas del mundo real, ser capaz de sintetizar sus aspectos principales y poder
especificar la funcin objetivo que se desee. Posteriormente debe expresar la solucin
en forma de programa, manejando los datos del mundo real mediante una
representacin valida para una computadora.
Partes de un programa
Los componentes bsicos son las instrucciones y los datos. Las instrucciones o
sentencias representan las operaciones que se ejecutaran al interpretar el programa.
Todos los lenguajes de programacin tienen un conjunto mnimo de operaciones que
son las de asignacin, seleccin e iteracin. Un lenguaje con solo estas tres
instrucciones permite escribir cualquier algoritmo.
Los datos son valores de informacin de los que se necesita disponer, en ocasiones
transformar para ejecutar la funcin del programa.
Los datos estn representados simblicamente por un nombre que se asocia con una
direccin nica de memoria.
El contenido de la direccin de memoria correspondiente a un dato constante se asigna
solo una vez y solo puede ser modificado en una nueva compilacin. En cambio el
contenido o valor de la direccin de memoria correspondiente a un dato variable puede
ser asignado o modificado en tiempo de ejecucin.
Un programa se corresponde con una transformacin de datos. A partir de un contexto
determinado por las precondiciones.
El programa transforma la informacin debiendo llegar al resultado esperado
produciendo el nuevo contexto caracterizado por las poscondiciones.
Dato
Representacin de un objeto el mundo real mediante el cual se pueden modelizar
aspectos de un problema que se desea resolver con un programa en una computadora.
Definicin
Dato representacin de un objeto el mundo real mediante el cual se pueden modelizar
aspectos de un problema que se desea resolver con un programa en una computadora.
<dato> -> <objeto><atributo><valor>
Abstraccin
Proceso de anlisis del mundo real con el propsito de interpretar los aspectos
esenciales de un problema y expresarlo en trminos precisos.
Modelizacion
Abstraer un problema del mundo real y simplificar su expresin, tratando de encontrar
los aspectos principales que se pueden resolver, requerimientos, los datos que se han de
procesar y el contexto del problema.
Precondicin
Informacin conocida como verdadera antes de iniciar el programa.
Poscondicin
Informacin que debiera ser verdadera al cumplir un programa, si se cumple
adecuadamente el requerimiento pedido.
Especificacin
Proceso de analizar problemas del mundo real y determinar en forma clara y concreta el
objetivo que se desea. Especificar un problema significa establecer en forma univoca el
contexto, las precondiciones
el resultado esperado, del cual se derivan las
poscondiciones.
Lenguaje de programacin
Conjunto de instrucciones permitidas y definidas por sus reglas sintcticas y su valor
semntico para la expresin de soluciones de problemas.
Del problema real a su solucin por computadoras
Analizando un problema del mundo real se llega a la modelizacin del problema por
medio de la abstraccin.
A partir del modelo se debe elaborar el anlisis de la solucin como sistema, esto
significa la descomposicin en mdulos. Estos mdulos deben tener una funcin bien
definida.
La modularizacin es muy importante y no solo se refiere a los procesos a cumplir, sino
tambin a la distribucin de los datos de entrada, salida y los datos intermedios
necesarios para alcanzar la solucin.
Estudio de los datos del problema.
Cada mdulo debe tener un proceso de refinamiento para expresar su solucin en forma
ordenada, lo que llevara a la construccin del algoritmo correspondiente.
A partir de los algoritmos se pueden escribir y probar programas en un lenguaje
determinado y con un conjunto de datos significativos.
Etapas de resolucin de problemas con computadoras.
1. Anlisis del problema: en su contexto del mundo real.
debe utilizarse todas las herramientas al alcance de la mano para el desarrollo del
algoritmo como paso previo a la solucin del problema por el computador.
Existen varias tcnicas para representar formalmente un algoritmo, una descriptiva
llamada pseudo cdigo, y otras graficas como los diagrama de flujo, diagrama Nassi
Sneiderman, Diagramas de Lindsay, diagramas de Jackson, entre otros, en este caso se
presentara una notacin algortmica similar a la presentada por Piere Scholl en el texto
Esquemas algortmicos fundamentales: Secuencia e iteracin.
Definicin
Algoritmo:
Secuencia finita de instrucciones, reglas o pasos que describen en forma precisa las
operaciones que una computadora debe realizar para llevar a cabo una tarea en tiempo
finito [Knuth, 1968].
Descripcin de un esquema de comportamiento expresado mediante un repertorio finito
de acciones y de informaciones elementales, identificadas, bien comprendidas y
realizables a priori. Este repertorio se denomina lxico[Scholl, 1988].
Esta formado por reglas, pasos e instrucciones.
Las reglas especifican operaciones.
La computadora es el agente ejecutor.
La secuencia de reglas y la duracin de la ejecucin son finitas.
Caractersticas de un algoritmo
Un algoritmo debe tener al menos las siguientes caractersticas:
1. Ser preciso: esto significa que las operaciones o pasos del algoritmo deben
desarrollarse en un orden estricto, ya que el desarrollo de cada paso debe
obedecer a un orden lgico.
2. Ser definido. Ya que en el rea de programacin, el algoritmo es el paso
previo fundamental para desarrollar un programa, es necesario tener en cuenta
que el computador solo desarrollar las tareas programadas y con los datos
suministrados; es decir, no puede improvisar y tampoco inventar o adivinar el
dato que necesite para realizar un proceso. Por eso, el algoritmo debe estar
plenamente definido; esto es, que cuantas veces se ejecute, el resultado depende
estrictamente de los datos suministrados. Si se ejecuta con un mismo conjunto
de datos de entrada, el resultado deber ser siempre el mismo.
3. Ser finito: esta caracterstica implica que el nmero de pasos de un algoritmo,
por grande y complicado que sea el problema que soluciona, debe ser limitado.
Todo algoritmo, sin importar el nmero de pasos que incluya, debe llegar a un
final. Para hacer evidente esta caracterstica, en la representacin de un
algoritmo siempre se incluyen los pasos inicio y fin.
4. Presentacin formal: para que el algoritmo sea entendido por cualquier persona
interesada es necesario que se exprese en alguna de las formas comnmente
aceptadas; pues, si se describe de cualquier forma puede no ser muy til ya que
solo lo entender quien lo dise. Las formas de presentacin de algoritmos
son: el pseudo cdigo, diagrama de flujo y diagramas de Nassi/Schneiderman,
entre otras. En esta publicacin se propondr una notacin algortmica y se
darn las equivalencias entre la propuesta y las existentes y tambin con las
sentencias de los lenguajes de programacin, en particular Pascal y C.
5. Correccin: el algoritmo debe ser correcto, es decir debe satisfacer la necesidad
o solucionar el problema para el cual fue diseado. Para garantizar que el
Iteraciones
14
10.000
140.000
10.000 2
10.000 K
2 10.000
Tiempo estimado
Microsegundos
0.1 segundo
2 segundos
15-20 minutos
Horas
Inmedible
Complejidades ms comunes
1. Complejidad constante: se expresa como O(1). Se encuentra en algoritmos sin
ciclos, por ejemplo en un intercambio de variables.
2. Complejidad logartmica: Es una complejidad eficiente, la bsqueda binaria
tiene esta complejidad.
3. Complejidad lineal: se encuentra en los ciclos simples.
4. Complejidad logartmica lineal: Los mejores algoritmos de ordenamiento tienen
esta complejidad.
5. Complejidad cuadrtica: Aparece en el manejo de matrices de dos dimensiones,
generalmente con dos ciclos anidados.
6. Complejidad cbica: Aparece en el manejo de matrices de tres dimensiones,
generalmente con tres ciclos anidados.
7. Complejidad exponencial: es la complejidad de algoritmos recursivos.
Lxico y algoritmo
Para escribir un algoritmo deben seguirse un conjunto de pasos bsicos
1. Comprender el problema
2. Identificar los elementos a incluir en el lxico: constantes, tipos, variables y
acciones.
3. Encontrar la forma de secuenciar las acciones para obtener el resultado, esto es,
alcanzar las poscondiciones a partir de un estado inicial que cumple con la
precondicin. Para establecer el orden de las acciones los lenguajes de
programacin proporcionan mecanismos de composicin: Secuenciacin,
anlisis de casos, iteracin y recursion.
4. Al organizar las acciones en el tercer paso puede ocurrir que se detecte que
faltan elementos en el lxico o que algn aspecto del problema no ha sido bien
comprendido lo cual requerira volver a los pasos anteriores.
5. Nunca la solucin aparece en el primer intento, en general aparece en un proceso
cclico, entonces se debe:
6. Escribir el lxico,
a. escribir la primera versin,
b. incluir en el lxico nuevos elementos que faltaban,
c. escribir la nueva versin del algoritmo y as sucesivamente
Estructura de un algoritmo
LEXICO {Lxico Global del algoritmo}
{Declaracin de tipos, constantes, variables y acciones}
Accin 1
PRE {Precondicin de la accin 1}
POS {Poscondicin de la accin 1}
LEXICO {Lxico local, propio de la accin 1}
Declaraciones locales
ALGORITMO {Implementacin de la accin 1}
{Secuencia de instrucciones de la accin 1}
FIN {Fin implementacin algoritmo de la accin 1}
ALGORITMO
PRE {Precondicin del algoritmo principal}
POS {Poscondicin del algoritmo principal}
{Secuencia de instrucciones del algoritmo principal}
FIN {Fin del algoritmo principal}
Proceso Computacional
Se refiere a un algoritmo en ejecucin. La ejecucin de las instrucciones origina una
serie de acciones sobre elementos de memoria que representan informacin manejada
por el algoritmo. A nivel algortmico se asigna un nombre a cada informacin de modo
de manejar un par nombre-valor para cada informacin.
Una variable representa alguna entidad del mundo real, relevante para el problema que
se quiere resolver. El efecto que producen las acciones del proceso sobre las variables
produce cambio de estados o de sus valores.
Definiciones
Programa: Algoritmo escrito en un lenguaje cuyas instrucciones son ejecutables por
una computadora y que estn almacenados en un disco.
Tarea: Un programa se vuelve tarea a partir del momento que se lo selecciona para su
ejecucin y hasta que esta termina.
Proceso: programa en ejecucin, se ha iniciado pero an no ha finalizado.
Lenguajes de programacin: notacin que permite escribir programas a mayor nivel
de abstraccin que los lenguajes de mquina. Sus instrucciones deben ser traducidas a
lenguaje de mquina.
Lenguaje de mquina: Instrucciones que son ejecutables por el hardware de una
computadora.
Paradigmas de programacin
Paradigma: Coleccin de conceptos que guan el proceso de construccin de un
programa. Estos conceptos controlan la forma en que se piensan y formulan los
programas.
Imperativo Procedural Objetos.
Declarativo Funcional Lgico.
Dato Informacin Conocimiento
Dato: <objeto><atributo><valor> sin interpretar.
Informacin: aade significado al dato.
Conocimiento: Aade propsito y capacidad a la informacin. Potencial para generar
acciones.
Problema
Enunciado con una incgnita, la solucin es encontrar el valor de esa incgnita.
Problema computacional o algortmico: tarea ejecutada por una computadora con una
especificacin precisa de los datos de entrada y de los resultados requeridos en funcin
de estos.
Clase de problemas
No computables: No existe un algoritmo.
Computables
Tratables: Existe un algoritmo eficiente.
Intratable: No existe algoritmo eficiente.
Expresiones Sentencias Lxico
Expresiones: secuencia de operadores y operandos que se reduce a un solo valor.
Sentencias: accin produce un efecto, puede ser primitiva o no primitiva.
Lxico: Descripcin del conjunto de acciones e informaciones a partir de la cual se
expresa el esquema de comportamiento del algoritmo.
Pasos para resolver un algoritmo
Comprender el problema.
Identificar informacin y acciones a incluir en el lxico (constantes, tipos, variables y
acciones).
Encontrar un camino de secuenciar las acciones para obtener el resultado, es decir para
alcanzar la poscondicin a partir del estado inicial que cumple con la precondicin.
Acciones primitivas y derivadas
Acciones primitivas: Incorporadas por el lenguaje.
Acciones derivadas: realizadas mediante la combinacin de acciones primitivas con el
objeto de desarrollar una tarea en particular. Son complementarias y pueden ser
desarrolladas por el programador.
Estructura de un algoritmo
LEXICO {Lxico Global del algoritmo}
{Declaracin de tipos, constantes, variables y acciones}
Accin 1
PRE {Precondicin de la accin 1}
POS {Poscondicin de la accin 1}
LEXICO {Lxico local, propio de la accin 1}
Declaraciones locales
ALGORITMO {Implementacin de la accin 1}
{Secuencia de instrucciones de la accin 1}
FIN {Fin implementacin algoritmo de la accin 1}
ALGORITMO
PRE {Precondicin del algoritmo principal}
POS {Poscondicin del algoritmo principal}
{Secuencia de instrucciones del algoritmo principal}
FIN {Fin del algoritmo principal}
Resumen:
En el presente capitulo se introdujeron trminos y frases de la disciplina en estudio.
Se abordo el problema desde un punto de vista conceptual definiendo con precisin
trminos y frases para evitar ambigedades. Se puso especial nfasis en la necesidad de
pensar las soluciones antes de escribir cdigo. Se establecieron cuales son los pasos que
deben seguirse para una solucin correcta de problemas y cuales son los problemas que
pueden tratarse en forma algortmica. Se defini cuales son las caractersticas deseables
de los algoritmos y se introdujo el concepto de eficiencia de modo de hacer, tal como
recomendaba Albert Enstein, las cosas tan simple como se pueda.
Se introdujo, adems una representacin sem. formal para la descripcin de los
algoritmos
Condicin 1
T
Accin 1
Accin 5
Accin 2
Mientras condicin 3
Condicin 2
T
Accin 6
F
Accin 3
Accin 7
Accin 8
Accin 9
Accin 4
Accin 10
Accin 11
Accin 12
Diagramas de Jackson
Diagramas de Lindsay.
PASCAL
DIAGRAMA DE DETALLE
Variable expresin
Variable = expresin
var1, var2,....
, ..... )
WRITE
liter1 liter2
var 1
liter1
IF condicin
THEN
sentencia 1
ELSE
sentencia 2
,....
liter2
Condicin
Instruccin 1
Instruccin 2
Condicin
WHILE condicin
DO
sentencia
Instruccin
REPEAT
sentencia;
:
:
sentencia n
UNTIL condicin
FOR variable: expres1
var 2
Instruccin 1
:
:
Instruccin n
Condicin
TO
expres2
DOWNTO
Instruccin
DO sentencia
CASE expresin
OF
const1....... const n : instruccin1
:
:
const1...... const p : instruccin m
END
Cualquier sentencia puede ser reemplazada por
un bloque:
BEGIN
sentencias 1;
:
:
sentencias n
END
Expresin
Const1... Const n
Const1... Const p
Instruccin1
Instruccin m
Llaves de Warniel
HacerUnaCosa)
Si
Condicin
Exclusin
No
1
Algoritmo
Case
Ordinal
Mientras
Condicin
HacerOtraCosa
Vacio
2
HacerUnaCosa;
HacerOtraCosa;
HacerAlgoMas
Notacin Algoritmica
LEXICO {Lxico Global del algoritmo}
{Declaracin de tipos, constantes, variables y acciones}
Accin 1
PRE {Precondicin de la accin 1}
POS {Poscondicin de la accin 1}
LEXICO {Lxico local, propio de la accin 1}
Declaraciones locales
ALGORITMO {Implementacin de la accin 1}
{Secuencia de instrucciones de la accin 1}
FIN {Fin implementacin algoritmo de la accin 1}
ALGORITMO
PRE {Precondicin del algoritmo principal}
POS {Poscondicin del algoritmo principal}
{Secuencia de instrucciones del algoritmo principal}
FIN {Fin del algoritmo principal}
Efecto
Si la expresin toma el valor verdadero entonces se ejecuta
la secuencia S si es falso ejecuta la accin siguiente a la
instruccin en caso de existir.
Efecto
Si la expresin toma el valor verdadero entonces se ejecuta
la secuencia S si es falso se ejecuta la secuencia R.
Formato
SEGN expr
V1 : S1
V2 : S2
FIN_SEGN
Efecto
Segn el valor Vi de la expresin ordinal expr, se ejecuta la
secuencia Si(i = 1 ..n). Cualquier valor no especificado no
tiene accin asociada
Estructura de decisin mltiple Completa. Agrega una clusula para realizar acciones
particulares en caso de que el ordinal no se corresponda con ninguno de los valores
determinados.
Formato
SEGN expr
V1 : S1
V2 : S2
EN_OTRO_CASO : Sn
FIN_SEGN
Efecto
Segn el valor Vi de la expresin ordinal expr, se ejecuta la
secuencia Si(i = 1 ..n). Cualquier valor no especificado
realiza la secuencia Sn.
// si los meses son los que se enumeran y el dia menor o igual a 31 es valida//
mes = 4,6,9,11
: FechaValida dia <= 30
//en estos meses para ser valida el dia debe ser menor o igual a 30//
mes = 2
: AoBisiesto; FechaValida dia <=28 o (AoBisiesto y
dia<=29)
// en febrero debe verificar si el ao es o no bisiesto//
EN_OTRO_CASO : FechaValida Falso
// de no ocurrir nada de lo anterior, la fecha es falsa, no es una fecha valida//
FIN_SEGUN
FIN_SI
Escribir (La fecha , dia, /, mes,/.ao, : );
SI FechaValida
ENTONCES Escribir (Es Valida)
SI_NO Escribir(No es valida)
FIN_SI
FIN
A los efectos de simplificar la notacin de los anlisis de casos en una nica forma de
escritura se podra utilizar la notacin SI, con las variantes que correspondan y con la
sentencia equivalente segn el lenguaje de programacin.[J.D. Muchnik]
Formato
SI Condicin
ENTONCES
S
FIN_SI
Propuesta JDM
Si Condicin
S
FIN_SI
Formato
SI Condicin
ENTONCES
S
SI_NO
R
FIN_SI
Propuesta JDM
SI
Condicion1 S;
Condicion2 R;
FIN_SI
Formato
SEGN expr
V1 : S1
V2 : S2
FIN_SEGN
Propuesta JDM
SI
Condicion1 S1;
Condicion2 S2;
FIN_SI
Formato
SEGN expr
V1 : S1
V2 : S2
EN_OTRO_CASO : Sn
FIN_SEGN
Propuesta JDM
SI
Condicion1 S1;
Condicion2 S2;
CondicionB Sn;
FIN_SI
ALGORITMO
Leer (Operando1, Oprando, Operador);
SI
(Operador = +) Escribir (Operando1 + Operando2);
(Operador = -) Escribir (Operando1 - Operando2);
(Operador = *) Escribir (Operando1 * Operando2)
(Operador = /) Escribir (Operando1 Div Operando2)
FIN_SI
FIN.
La necesidad de iterar
Supongamos que de un determinado curso se dispone de cada uno de los alumnos de su
nota y se requiere conocer la nota promedio del curso.
Para ello ser necesario conocer la nota de cada estudiante, se debe saber adems la
suma de todas las notas de los estudiantes y, para calcular el promedio, es
imprescindible conocer la cantidad de estudiantes.
Podramos pensar en un algoritmo con una estructura como la siguiente
LXICO
V : Real //Contiene la nota leda
S : Real //Contiene la sumatoria de las notas
N : Entero //Contiene el numero de alumnos
ALGORITMO
S <- 0 ;
N <- 0 ;
Leer (V) ;
S <- S + V ; //Suma las notas
N <- N + 1 ; // Cuenta los alumnos
Este bloque debe repetirse una cantidad de veces que no se puede determinar con
precisin, seria necesario escribir un texto diferente para cada caso particular, hasta
podra llegarse al extremo de tener que escribir un texto infinito, cosa imposible en la
implementacin. El infinito se lo puede pensar desde un punto de vista terico pero no
es posible implementarlo. Habamos mencionado entre las caractersticas de los
algoritmos su finitud en tiempo y en instrucciones.
La necesidad de un mecanismo de iteracin es clara si pensamos en computadoras como
maquinas de gran utilidad porque automatizan tareas, si solo se dispusiera de
composicin secuencial o anlisis de casos estaramos realmente limitados y los
programas deberan tener una gran extensin para ejecutar muy pocas acciones si estas
se repiten.
Secuencias
Algunas operaciones tienen que ver con secuencia de datos. Una secuencia es una
coleccin de elementos del mismo tipo. En ella se puede aplicar algn tratamiento a
cada uno de los elementos que componen la secuencia o buscar alguno que cumpla con
cierta propiedad.
Las secuencias pueden representarse de diferentes formas y se caracteriza por el acceso
secuencial a cada elemento. Esto es, para acceder al elemento de la posicin p, hay que
recorrer los p-1 elementos anteriores.
La secuencia debe contar con un elemento caracterstico que indique que se ha
alcanzado el final de la misma en forma correcta. Esta marca puede determinarse segn
una especificacin precisa de la cantidad de elementos o por un valor particular que
indique la finalizacin. Las secuencias estn vinculadas con las composiciones iterativas
y la reursion
Composiciones iterativas
Los componentes de una iteracin son
1. Inicializacin: instrucciones que se ejecutan para inicializar las variables que
participan de la iteracin.
2. Condicin de terminacin: expresin booleana que determina cuando acaba la
iteracin.
3. Cuerpo: conjunto de instrucciones que se ejecutan mientras no se cumple la
condicin de terminacin.
4. Finalizacin: conjunto de instrucciones que deben ejecutarse cuando la iteracin
termina.
Se presentan dos composiciones iterativas en las que la finalizacin viene determinada
por una condicin. Estas son la composicin MIENTRAS, REPETIR. Lo que las
diferencia es el lugar donde se comprueba la condicin: al principio o al final. Y
tambin si es una condicin de terminacin o de continuacin. Existe adems
composiciones iterativas en la que la finalizacin esta dada por la cantidad de elementos
que se deben evaluar
Diseo iterativo: nocin de invariante
El invariante de un ciclo, INV, es una condicin que se cumple al inicio y a cada paso de
la iteracin. Cuando finaliza la iteracin, el hecho de que se satisfaga el invariante y la
condicin de terminacin implica que se alcanz la solucin.
Dada una especificacin de un problema de recorrido de secuencias, la estrategia de una
solucin iterativa consta de los siguientes pasos:
1. Identificar qu variables son necesarias a partir de la poscondicin.
2. Establecer el invariante del ciclo.
3. Aplicar un razonamiento inductivo.
4. Escribir el algoritmo iterativo.
La composicin iterativa es el medio que permite escribir programas cortos que
involucran gran cantidad de acciones.
Existen varios formatos de iteracin que varan entre lenguajes pero que, en general
responden a tres modelos de repeticin: repetir mientras se cumpla una condicin,
repetir hasta que se cumpla una condicin y repetir una determinada cantidad de veces
Repetir mientras se cumpla una condicin
MIENTRAS condicin HACER
Accin
FIN_MIENTRAS
Repetir hasta que se cumpla una condicin
REPETIR
accin
HASTA_QUE Condicin
Repetir N veces
PARA i [1..n] HACER
accin
FIN_PARA
Efecto
Ejecutar la secuencia S mientras la condicin Cond tenga
el valor de verdadero
Efecto
Ejecutar la secuencia S hasta que la expresin Cond tome
el valor de verdadero
Efecto
Ejecutar la secuencia S (Vf Vi + 1) veces.
FIN_PARA
Exacta. Una forma natural de esta estructura consiste en repetir un bloque de acciones
una cantidad fija de veces o conocido de antemano.
Tiene definido un contador o ndice como una variable de tipo ordinal que se
incrementa en una cantidad constante con cada iteracin y permite controlar el numero
de veces que se ejecutara el ciclo.
En cada iteracin el ndice toma el valor siguiente de acuerdo al tipo de valor asociado
al ordinal. Hay lenguajes que solo permiten que la variacin (que puede ser positiva o
negativa) sea solamente 1, y otros lenguajes que pueden modificar ese incremento. De
todas formas la variable ndice se actualiza con cada iteracin y se testea en cada ciclo
respecto del valor final deseado.
Si el incremento es uno la cantidad de repeticiones esta dada por:
Cantidad de repeticiones = Valor final del ndice Valor inicial del ndice + 1.
En el caso de que valor inicial y valor final coincidan se ejecuta 1 vez, en el caso de que
el valor inicial es mayor que el final y por cada iteracin se incrementa el ndice el ciclo
no se ejecutara y no producir errores en tiempo de ejecucin.
El ejemplo planteado utilizando composicin iterativa
LXICO
V : Real //Contiene la nota leda
S : Real //Contiene la sumatoria de las notas
N : Entero //Contiene el numero de alumnos
La composicin iterativa para puede no ejecutarse ya que el valor ledo de N puede ser
cero, en ese caso no corresponde la iteracin por lo que es necesario al final del proceso
verificar si hubieron valores, el valor de n se puede utilizar para verificar esa condicin.
Recursividad
La repeticin puede relacionarse con el concepto de induccin matemtica, este tipo de
razonamiento permite demostrar una proposicin que depende de cierto parmetro N,
normalmente en el rango de los nmeros naturales, una forma de demostrar si una
proposicin P es cierta para todo natural N es:
Se demuestra que es cierta para N=0, inicio de la induccin o caso base
Se asume que P es cierto para n-1, hiptesis de induccin
Entonces se demuestra que tambin lo es para n, relacin de induccin
Tambin se puede utilizar la induccin para realizar definiciones matemticas de
funciones y sucesiones.
Por ejemplo se puede definir el factorial introduciendo el valor cuando n = 0 e
introduciendo una relacin para n > 0 a partir del factorial de n-1
0! = 1
N! = N * (N 1)!
La primera igualdad corresponde al caso base, la siguiente es la relacin d induccin
Otro ejemplo Es la conocida sucesin de Fibonacci
Fibo(0) = 1
Fibo(1) = 1
Fibo(N) = Fibo(n-1) + Fibo(N-2) para N>1
Los primeros valores de la serie son 1, 1, 2, 3, 5, 8, 11, 19, 21,......
Una funcin con sentencias entre las cuales se encuentra una llamada a si misma se dice
que es recursiva. Existen muchas aplicaciones matemticas y computacionales de la
recursividad. Numerosas circunstancias de la vida comn tiene naturaleza recursiva
Se debe tener en cuenta
1. Define el problema en trminos de un problema ms simple de la misma
naturaleza.
2. Debe disminuir el espacio del problema en cada llamada recursiva
Hay una instancia particular que se conoce como caso base o caso degenerado
3. Divide el problema original en subproblemas ms pequeos. Cuando es lo
suficientemente chico se resuelve directamente y se combinan soluciones del
subproblema hasta que queda resuelto el problema
HANOI
Este es un juego que tiene su origen en la cultura oriental y en una leyenda sobre el
templo de Brama, cuya estructura simulaba una plataforma metlica con tres varillas y
discos en su interior. El problema supona tres varillas Inicial, Central y Final en la que
se alojaban discos que podan trasladarse de una varilla a otra con la condicin que cada
disco era ligeramente inferior en dimetro al que estaba justo debajo de el. Los discos
originalmente estn en la varilla Inicial y se los desea trasladar a la final cumpliendo en
todos los pasos la condicin del tamao de los discos, el superior ligeramente menor al
inferior.
Si n = 1 ENTONCES
Mover n de I a F
SI_NO
Mov n-1 de I a C usando F
Mover n de I a F
Mover n-1 de C a F usando I
FIN_SI
El flujo de control de una funcin recursiva requiere tres condiciones para una
terminacin normal:
1. Un test para detener o continuar con la recursion.
2. una llamada recursiva para continuar la recursion, con un problema de la misma
naturaleza pero de menor complejidad.
3. un caso base para terminar la recursion
ALGORITMO
SI Es el caso base
ENTONCES
Ejecutar la accin final
Terminar con la recursion
SI_NO
Disminuir el espacio del problema
Volver a invocar a la funcin
FIN_SI
Iteracin vs. Recursion
Considerar solucin recursiva solo si una solucin iterativa sencilla no es posible.
Solo utilice recursividad dentro de limites aceptables de ejecucin y uso de memoria.
Si son posibles las soluciones iterativas y recursivas esta ultima requerir mas tiempo y
mas recursos de memoria.
En ciertos problemas la recursion produce soluciones mas simples de leer. Los
beneficios de la claridad compensan el costo extra
Ambas implican repeticin. Iteracin explcitamente y recursion con llamadas repetidas.
Ambas consideran un test de salida. Iteracin en la condicin, recursividad en el caso
base.
Muchas veces la resolucin de problemas exige probar sistemticamente todas las
posibilidades que pueden existir para encontrar la solucin.
En este caso se utilizan algoritmos de vuelta atrs o backtraking, que utilizan la
recursividad para probar cada una de las posibilidades hasta encontrar la solucin.
Una de las caractersticas principales de estos algoritmos es la bsqueda exhaustiva con
todas las posibilidades de soluciones parciales que conducen a la solucin del problema,
otra caracterstica es la vuelta atrs, en el sentido que si una solucin parcial no conduce
a la solucin total del problema se vuelve atrs para ensayar con otra solucin posible
de solucin.
El esquema general de estos algoritmos responden a
accin EnsayarSolucion
ALGORITMO
<Inicializar cantidad de posibles soluciones>
REPETIR
<tomar la siguiente seleccin>
<determinar si es seleccin valida>
SI Valido
ENTONCES
<anotar seleccin>
SI Problema Solucionado
ENTONCES
xito = Verdadero
SINO
EnsayarSolucion
llamada para realizar otra tarea
SINO xito
ENTONCES
<Borrar anotacin y probar otra solucin>
FINSI
FINSI
FINSI
HASTA xito O <No mas posibilidades>
Si sale por xito habr encontrado la solucin, si agota las posibilidades sin xito, el
problema no tiene solucin
FIN.
Algoritmos que utilizan secuencias
Algoritmos de bsqueda.
Dada una coleccin de elementos es posible extraer dos tipos diferentes de informacin:
Informacin relativa al conjunto de los datos que forman la coleccin
Informacin detallada de algn tem particular
En el caso en que se requiera informacin particular de un determinado tem de la
coleccin este debe ser ubicado y, eventualmente extrado de la misma para su
tratamiento particular.
El proceso de ubicar informacin particular en una coleccin de datos es conocido como
algoritmo de bsqueda.
Los procesos de bsqueda que consisten en ubicar un elemento particular deben
suministrar alguna informacin del resultado de la bsqueda. Existen bsquedas con
eficiencia optima (Ef =1), cuando se conoce el lugar preciso donde el dato se encuentra
y se denomina bsqueda directa, otras bsquedas de eficiencia logartmica las que
reducen el espacio del problema a la mitad con cada intento llamada bsqueda binaria o
dicotomica, y existe una bsqueda menos eficiente de orden N donde n representa la
cantidad de elementos de la lista. El desarrollo de estos procesos ser visto en captulos
posteriores.
Mximos y mnimos
En lo que hace a la informacin relativa a un conjunto de datos puede ser necesario
encontrar cual o cuales de los elementos de ese conjunto cumplen con ciertas
caractersticas. Por ejemplo si se tiene informacin de los nombres de los estudiantes y
sus calificaciones puede ser posible conocer el nombre del mejor estudiante, segn el
valor de sus notas, o conociendo el nombre de los atletas y el tiempo empleado en una
carrera de velocidad puede requerirse conocer el ganador. En el primer caso se busca al
estudiante cuyo promedio es el mayor, en el otro caso se busca el atleta cuyo tiempo es
el menor. Existen algoritmos puntuales que permiten buscar mximos y mnimos.
Buscar un mximo
Datos e entrada L1 ... L n Lista de n elementos
ALGORITMO
Leer(V);
Mximo = V ;//Asigna al mximo la primer lectura
PosRel = 1
MIENTRAS (V <> 0) HACER
SI (V > Mximo)
ENTONCES
Mximo v;
PosRel i
FIN_SI;
Leer(v);
FIN_MIENTRAS;
SI (Mximo <> 0)
ENTONCES
Escribir(Mximo es : ,Mximo. y su posicin relativa ,PosRel);
SI_NO
Escribir(No se ingresaron valores);
FN_SI;
FIN.
Dado un conjunto de valores, que finalizan con un valor igual a 0 buscar el mximo del
conjunto y su posicin relativa dentro del mismo
//Bsqueda con una cantidad indefinida de datos
LXICO
I : Entero // variable para la iteracin
V : Entero // para las distintas lecturas
Mximo : Entero // Contiene el mximo del conjunto
PosRel : Entero // Contiene la pos del mximo dentro del conjunto
ALGORITMO
Leer(V);
Mximo = 0; PosRel = 0;
MIENTRAS (PosRel = 0 o V <> 0) HACER
Leer(V);
SI (V > Mximo)
ENTONCES
Mximo v;
PosRel i
FIN_SI;
Leer(v);
FIN_MIENTRAS;
SI (Mximo <> 0)
ENTONCES
Escribir(Mximo es : ,Mximo. y su posicin relativa ,PosRel);
SI_NO
Escribir(No se ingresaron valores);
FIN.
Corte de control
La utilizacin de este algoritmo puntual permite resolver el anlisis de una secuencia de
datos que cumplen con la precondicin de tener una clave que se repite, estn ordenados
o agrupados por esta clave y se requiere informacin de cada subconjunto formado por
todos los valores de la misma clave y adems informacin sobre la totalidad de los
datos. Debe garantizarse que se evaluaran todos los datos y que los que corresponden al
mismo subgrupo sern evaluados agrupados.
LXICO
Importe,Suma : Entero;
NumeroCliente, Anterior : Entero;
AGORITMO
Leer(NumeroCliente)
// hace una lectura anticipada del dato de la expresin lgica//
MIENTRAS (NumeroCliente > 0) HACER
//garantiza la secuencia de lectura de todos los datos//
Suma = 0; //inicializa acumuladores//
Anterior = NumeroCliente; //guarda e valor a controlar//
MIENTRAS (NumeroCliente > 0 y Anterior = NumeroCliente;) HACER
//ciclo que garantiza estar en el mismo subgrupo y que aun haya datos//
Leer(Importe); // lectura del resto de los datos//
Suma = Suma + Importe;
Leer(NumeroCliente)//lectura del nuevo s es igual al anterior
Continua, sino sale del ciclo.
FIN_MIENTRAS
Escribir(El Cliente : ,Anterior, Compro : ,Suma);
FIN_MIENTRAS
FIN.
Pascal
If expresion condicional
Then
S
Else
R;
C
If (expresion)
S;
Else
R;
Formato
SEGN expr
V1 : S1
V2 : S2
EN_OTRO_CASO : Sn
FIN_SEGN
Pascal
Case selector of
Valor1 : S1;
.........................
else Ve: Se;
end;
C
switch (selector) {
case etiqueta:S; break;
..............................
default: R;
}
ITERACION
Formato
Mientras Cond. Hacer
S
FIN_MIENTRAS
Pascal
While Expresion logica do
S;
C
while(expresion)
S;
Formato
REPETIR
S
HASTA Cond
Efecto
Repeat
S
Until expresion logica
do
S;
while(expresion)
Formto
PARA i [Vi..Vf] HACER
S
FIN_PARA
Efecto
For i:=Vi to vf do
S;
for(i=0;i<vf;i++)
S;
Estilos de Indentacin
Recomendacion de estilos de indentacion para desarrollos ms claros y legibles.(Ing. J.
M. Sola)
Estilo The One True Brace Style
while( SeaVerdad() ) {
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
BSD/Allman.
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo Whitesmiths
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo GNU
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo Pico
while( SeaVerdad()
{
HacerUnaCosa();
HacerOtraCosa(); }
HacerUnaUltimaCosaMas();
Estilo Banner
while( SeaVerdad() ) {
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Acciones y Funciones
Objetivos de aprendizaje
Dominando los temas del presente capitulo Usted podr.
1. Entender la descomposicin como forma de resolucin de problemas.
2. Dar valor a la reusabilidad en bsqueda de la eficiencia en la escritura el cdigo.
3. Establecer comunicacin entre mdulos.
4. Comprender las ventajas de la descomposicin
5. Diferenciar acciones de funciones y los distintos tipos de parmetros
Introduccin
En este capitulo se analiza la descomposicin como forma de alcanzar la solucin de
problemas. Una regla bsica de la programacin indica que si existe un programa de
longitud L tal que L = L1 + L2, se dice que el esfuerzo de resolver L es mayor que la
suma de los esfuerzos de resolucin de L1 y L2, aun cuando haya que derivar esfuerzo
para la integracin de los mdulos.
SI L = L 1 + L 2
Entonces
Esfuerzo(L) > Esfuerzo(L1) + Esfuerzo (L2)
Antes de analizar las particularidades de las acciones y funciones es necesaria la
definicin de los trminos que se utilizan.
Modularizacion
En general los problemas a resolver son complejos y extensos, puede incluso
presentarse situaciones en que una parte del problema deba ser modificada para
adaptarse a nuevos requerimientos. Se hace necesario conocer algunas herramientas que
permitan facilitar la solucin de estos problemas, la abstraccin y la descomposicin
pueden ayudar a ello. La abstraccin permitir encontrar y representar lo relevante del
problema y la descomposicin se basa en el paradigma de dividir para vencer . La
descomposicin tiene como objetivo dividir cada problema en subproblemas cada uno
de los cuales ser de ms simple solucin.
Es conveniente, e importante descomponer por varias razones:
Una persona entiende un problema de caractersticas complejas partiendo la
informacin. Por esto para comprender un problema complejo del mundo real es
necesario dividirlo o modularizar.
Favorece el trabajo en equipo, cada programador recibe las especificaciones la tarea a
realizar y las restricciones con las que debe manejarse.
Favorece el mantenimiento. Las tareas involucradas en este mantenimiento, corregir
errores y modificar cdigo, se hace mucho mas simple el anlisis y control de una
porcin o modulo que de la totalidad del problema.
Permite la reusabilidad del cdigo. Siempre es deseable, de ser posible, hacer uso de
cdigo ya escrito.
Mdulos
Un problema debe ser descompuesto en subproblemas que se denominan mdulos en
los que cada uno tendr una tarea especifica, bien definida y se comunicaran entre si
adecuadamente para conseguir un objetivo comn. Un modulo es un conjunto de
instrucciones mas un conjunto de datos que realizan una tarea lgica.
Proteccin de datos
Si una variable es local a un modulo se asegura que cualquier otro modulo fuera del
alcance de la variable no la pueda ver y por lo tanto no la pueda modificar. Dado que las
variables globales pueden ser accedidas desde distintos mdulos, la solucin para evitar
modificaciones no deseadas es el pasaje como parmetros valor.
Uso de parmetros para retornar valores
Si bien el pasaje por valor es til para proteger a los datos, existen situaciones en las que
se requiere hacer modificaciones sobre los datos y se necesitan conocer esas
modificaciones. Para esto se deben utilizar parmetros pasados por referencia. Los
parmetros enviados por referencia son aptos adems para enviar datos en ambos
sentidos.
Utilidad del uso de parmetros
El uso de parmetros independiza a cada modulo del nombre de los identificadores que
utilizan los dems. En el caso de lenguajes fuertemente tipiados solo importa la
correspondencia en cantidad tipo y orden entre los actuales del llamado y los formales
de la implementacin con independencia del nombre del identificador.
Reusabilidad
El uso de parmetros permite separar el nombre del dato, del dato en si mismo, lo que
permite que el mismo cdigo sea utilizado en distintas partes del programa simplemente
cambiando la lista de parmetros actuales.
Acciones
El lxico establece el nivel de abstraccin de un algoritmo. Es decir, introduce las
variables, las constantes, los tipos de datos y las acciones con que se construye el
algoritmo. Ahora se profundizara sobre el estudio de las acciones.
El concepto de accin est muy ligado al concepto de abstraccin. Se analiza como
abstraccin por parametrizacin y abstraccin por especificacin.
Utilizacin de acciones
Una accin es una secuencia de instrucciones que se identifica por un nombre y que
puede ser invocada desde un algoritmo principal o desde otra accin. Cuando una
accin es invocada desde algn punto de un algoritmo, el flujo de ejecucin se traslada a
la primera instruccin de la accin, entonces la accin se ejecuta hasta el final y cuando
acaba, el flujo se traslada de nuevo a la instruccin del algoritmo que sigue a aquella
que origino la invocacin.
Una accin debe tener un efecto bien definido, lo que significa que debe ser cohesiva.
El nombre de la accin es conveniente que evoque la tarea que realiza. Hay que definir
acciones que sean aplicables a cualquier posible conjunto de valores de entrada y no a
un valor concreto.
Entre una accin y el algoritmo que la invoca se debe producir una comunicacin de
valores: el algoritmo debe proporcionar los valores de entrada y la accin puede retornar
el resultado, o puede modificar el estado de alguno de ellos.
Puede haber acciones en las que la comunicacin se realice mediante variables globales
definidas en el mbito del algoritmo principal, que pueden ser manejadas por la accin.
Pero esta no es la forma mas apropiada. Una accin, en principio, nunca debera acceder
a variables globales.
Los parmetros son el mecanismo que posibilita escribir acciones generales, aplicables
a cualquier valor de la entrada, e independientes del lxico del algoritmo.
Acciones con parmetros
Un parmetro es un tipo especial de variable que permite la comunicacin entre una
accin y el algoritmo que la invoca, ya sea que este pase a la accin un valor de entrada
o bien que la accin devuelva el resultado al algoritmo, o que pasen ambas cosas
simultneamente.
A los parmetros que proporcionan un valor de entrada se los llaman Parmetros dato,
y a los que, adems de recoger un valor, retornan un resultado, se los llama datoresultado. En la declaracin de una accin, la lista de los parmetros se indica despus
del nombre de la accin entre parntesis y separados por punto y coma.
Nombre(dato p1 : TipoDato; dato-resultado p2 : TipoDto) :
una accin
Una funcin no debe tener efectos laterales. Es decir, debe limitarse a calcular un valor
y no modificar ninguno de los que se describen en el momento de la invocacin.
Las acciones se utilizan para extender el conjunto de acciones primitivas. Las funciones
permiten extender el conjunto de funciones u operadores primitivos. Siempre deben
utilizarse dentro de una expresin.
FIN_SI
FIN.
Resumen:
En este capitulo se avanza sobre la necesidad de mayor abstraccin procedural
introduciendo conceptos claves de programacin como acciones y funciones como la
forma mas adecuada de estructurar problemas en el paradigma procedural. Es una
introduccin a la abstraccin procedural y de datos que servir de base para sustentar
futuros conocimientos de estructuracin de programas en clases cuando se aborde, en
otra instancia, la programacin orientada a objetos.
Se dio valor a trminos como reusabilidad, ocultamiento de datos y cohesin
Estructuras Enlazadas
Objetivos de aprendizaje
Dominando los temas del presente capitulo Usted podr.
1. Manejar estructuras complejas.
2. Introducirse a la semntica de direcciones
3. Comprender como se asigna memoria dinmicamente en tiempo de ejecucin.
4. Conocer estructuras enlazadas lineales
5. Diferenciar entre estructuras indexadas y estructuras enlazadas
Introduccin:
En el presente trabajo se incorpora el concepto de asignacin dinmica en memoria.
Esto permite romper con la limitacin de tamao fijo que proporcionan las tablas
cuando es necesario trabajar con coleccin de datos el mismo tipo en memoria.
Para esto se incorporan los conceptos de estructuras enlazadas, punteros y asignacin
dinmica en memoria.
Estructuras enlazadas vs. estructuras indexadas
Como vimos una tabla es una secuencia de datos del mismo tipo donde a cada elemento
se puede acceder a travs de un ndice. En esta estructura las posiciones de memoria son
contiguas y se las puede ir recorriendo con solo incrementar el ndice. En estas
estructuras el primer elemento lgico coincide con el primero fsico, es decir se
comienza desde la primera posicin, y el siguiente lgico coincide con el siguiente
fsico, es decir al prximo elemento se accede incrementando en uno el ndice. Estas
estructuras, con esta organizacin son estructuras indexadas. Las estructuras pueden
organizarse de forma diferente. El primer elemento lgico puede no coincidir con el
primero fsico, en ese caso, para conocer donde comienza lgicamente se debe saber la
posicin de ese primero. El siguiente elemento lgico no necesariamente debe estar en
la posicin contigua, para saber donde esta ser necesario tener algo que referencie la
posicin del siguiente elemento. Una estructura con esta organizacin es una estructura
enlazada. Las estructuras enlazadas tienen la particularidad que se necesita conocer la
posicin del primer elemento y en cada posicin se tiene un registro, llamado nodo, con
al menos dos campos, uno que contenga la informacin y otro que indique o referencie
donde se encuentra el siguiente que no necesariamente debe ser el contiguo.
Por otro lado vimos que si se quiere definir en memoria una coleccin de datos del
mismo tipo mediante una tabla esta requiere establecer una capacidad mxima. Estas
son estructuras con tamao fijo, el mismo no puede ser modificado en tiempo de
ejecucin. Existe entonces riesgo que la cantidad de posiciones definidas en tiempo de
declaracin no alcancen, o, que se utilicen muy pocas de las posiciones definidas
haciendo un uso poco eficiente de los recursos.
Estructuras enlazadas con asignacin dinmica en memoria
Una estructura con asignacin dinmica es un conjunto de elementos de tipo
homogneo donde los mismos no ocupan posiciones contiguas de memoria, pueden
aparecer fsicamente dispersos manteniendo un orden lgico y son instanciados y/o
liberados en tiempo de ejecucin.
Operaciones con listas
ALGORITMO
Registro.Campo1 5; //asigna valores al registro
Registro.Campo2 10;
PunteroRegistro direccin_de(Registro);//
PunteroRegistro.Campo1 35;
Escribir(Registro.Campo1); //imprime el valor 35
FIN
Obviamente, cuando una variable de tipo apuntador haga referencia a una variable
declarada en el lxico, como en el caso del ejemplo anterior, no ser posible destruir su
contenido mediante la accin Destruir, ya que solo pueden destruirse las instancias que
se crean en tiempo de ejecucin con la accin Nuevo.
Tipos de datos autorreferenciados o recursivos
Hemos mostrado que con punteros se pueden definir tipos que se autorreferencian, lo
que permite que el tamao de una estructura enlazada slo est limitado por la
disponibilidad de memoria principal. Con una nica variable de tipo puntero ser
posible referenciar a una secuencia cuyo nmero de elementos podr crecer o disminuir
en tiempo de ejecucin.
En tipo de dato recursivo o autorreferenciado es un registro, llamado nodo, que contiene
entre sus elementos al menos dos campos, uno con la informacin y el otro es un
puntero a una estructura del mismo tipo. La bibliografa denomina nodo para referir a
ese elemento ya que es el trmino utilizado habitualmente para referirse a los elementos
de una estructura dinmica.
TPNodo = TIPO Apuntador a Nodo;
Nodo = TIPO < dato : Entero; sig : TPNodo >;
Cada vez que reservemos espacio para una variable se crea una nueva variable de tipo
Nodo. Es posible construir sucesivamente una secuencia indefinidamente larga de datos
de tipo Nodo, en la que el campo sig de cada uno de ellos apunta al siguiente elemento
de tipo Nodo creado. El ltimo elemento de tipo Nodo contiene en su campo sig el valor
NULO para indicar que no existen ms elementos siguientes.
El tipo Nodo es, por tanto, un tipo de dato autorreferenciado.
La siguiente funcin CrearSecuencia lee de la entrada n valores de tipo entero, crea una
secuencia con esos valores en el orden inverso de entrada y devuelve como resultado un
apuntador al primer elemento de la secuencia. La variable r se utiliza para apuntar al
nodo creado en cada paso y p apunta al primer elemento de la secuencia. Cada nuevo
nodo se aade delante del primero.
CrearSecuencia(n : Entero) TPNodo : una funcin
LXICO
Guarda en el registro apuntado por r el valor v y en el
p, q, r : TPNodo;
campo siguiente el puntero p, este puntero contiene la
direccion del que estaba en primer lugar por lo que se
i, v : Entero;
establece como siguiente el que era primero antes.
ALGORITMO
p NULO; //Crea la estructura
Leer(n);
i PARA [1, n] HACER
Escribir(Ingrese un valor entero: );
Leer(v);
Nuevo(r); // instancia y pide memoria
r^
= < v, p >;
p r
FIN_PARA;
CrearSecuencia p
FIN
El mbito de una variable local es la accin o funcin en la que se declara.
En cambio, aun cuando todas las variables apuntador usadas en la funcin
CrearSecuencia, es decir, p y r, son parte de su lxico local y, por tanto, desaparecen
tras concluir la llamada a sta. No sucede as con las variables dinmicas creadas a
travs de ellas con las llamadas a Nuevo. La secuencia creada por la funcin sera
accesible fuera de ella a travs del valor TPNodo que retorna.
La siguiente accin recorre una secuencia y escribe los datos en ella contenidos:
EscribirSecuencia(dato p : TPNodo) : una accin
LXICO
q = TPNodo;
ALGORITMO
q = p;
MIENTRAS q NULO HACER
Escribir(q.dato);
q q.sig
FIN_MIENTRAS
FIN
DestruirSecuencia(dato-resultado p : TPNodo) : una accin
LXICO
q : TPNodo;
ALGORITMO
MIENTRAS p < > NULO HACER
q p;
p p.sig
Destruir(q)
FIN_MIENTRAS
FIN
Estructuras de datos dinmicas lineales
Dependiendo del nmero de punteros y de las relaciones entre nodos, podemos
distinguir varios tipos de estructuras dinmicas
El tipo pila
Una pila es una coleccin de elementos de un mismo tipo, posiblemente vaca, sobre la
que podemos hacer operaciones de insercin de un nuevo elemento, eliminacin de un
elemento. Una pila es una estructura de tipo LIFO (del ingls, Last-Input, FirstOutput), lo cual significa que los elementos siempre sern eliminados de ella en orden
inverso al que fueron colocados, de modo que el ltimo elemento en entrar ser el
primero en salir. A este tipo de coleccin de datos se la conoce por el nombre de pila
precisamente por esta caracterstica. A la hora de retirar elementos, nicamente
podremos tomar el que est en la cima de la pila, que ser el ltimo que fue apilado.
Para definir el tipo de pila debemos, por tanto, disear las siguientes operaciones:
PilaVacia: Pila
EsPilaVacia: Pila Booleano
ALGORITMO
q p .sig;
Destruir(p);
Desapilar q
FIN
Es importante que se sepa que cuando se definen tipos de datos basados en estructuras
de datos complejas, las operaciones usuales de igualdad o desigualdad, que se realizan
por defecto mediante los operadores booleanos = y , produciran resultados que no se
corresponden con la semntica del tipo implementado. Por ejemplo, suponga que
declaramos dos variables, p1 y p2 de tipo PilaCars, y efectuamos una comparacin
como la siguiente:
SI p1 = p2 ENTONCES
...
FIN_SI;
Lo que estamos comparando en realidad no son las pilas, es decir, si constan de los
mismos elementos y estn en idntico orden, sino los apuntadores p1 y p2, puesto que
ambas variables son de tipo PilaCars el cual, a su vez, es un tipo apuntador. La
comparacin
p1 = p2 devolver Verdadero si y slo si los apuntadores p1 y p2
apuntan a la misma direccin de memoria.
Insertar elemento en una pila:
Apilar en una pila vaca:
Partiendo que ya tiene el nodo a insertar y un puntero que apunte a l, adems el puntero
a la pila valdr NULO:
El proceso es:
1. nodo^.siguiente apunte a NULO
2. Pila apunte a nodo.
Meter en una pila no vaca:
Se puede considerar el caso anterior como un caso particular de ste, la nica diferencia
es el siguiente ser pila. Se puede utilizar este procedimiento para ambos casos.
El proceso sigue siendo muy sencillo:
1. Hacemos que nodo^.siguiente apunte a Pila.
2. Hacemos que Pila apunte a nodo.
Desapilar: leer y eliminar un elemento
Slo existe un caso posible, en las pilas slo se puede leer y sacar desde le extremo de la
pila.
1. Se utiliza un puntero auxiliar.
2. Se hace apuntar al auxiliar al primer elemento de la pila, es decir a Pila.
3. Se avanza con la pila, asignando a Pila la direccin del segundo nodo de la
pila Pila^.siguiente.
4. Se conserva el contenido del nodo para devolverlo como retorno. La operacin
sacar equivale a leer y borrar.
5. Se libera la memoria asignada al auxiliar, que es el nodo a liberar.
Si la pila slo tiene un nodo, el proceso sigue siendo vlido, ya que el valor de
Pila^.siguiente es NULO, y despus de eliminar el ltimo nodo la pila quedar vaca, y
el valor de Pila ser NULO.
Con las listas existe un repertorio ms amplio de operaciones bsicas que se pueden
realizar:
1. Aadir o insertar elementos.
2. Buscar o localizar elementos.
3. Borrar elementos.
4. Moverse a travs de una lista, anterior, siguiente, primero.
Insertar un elemento en una lista vaca:
Nuevo(Nodo)
Nodo^<Valor, NULO>
Lista Nodo
7. Que el valor almacenado en el nodo sea igual al buscado, nuevo existen dos
casos:
a. Que anterior sea NULO. Esto indicara que el nodo que se quiere borrar
es el primero, as que se modifica el valor de Lista para que apunte al
nodo siguiente al que se quiere borrar.
b. Que anterior no sea NULO, el nodo no es el primero, as que se asigna a
anterior^.siguiente la direccin de nodo^.siguiente.
Despus de 7 , se libera la memoria de nodo.
A pesar de que las listas circulares simplifiquen las operaciones sobre ellas, tambin
introducen algunas complicaciones. Por ejemplo, en un proceso de bsqueda, no es tan
sencillo dar por terminada la bsqueda cuando el elemento buscado no existe.
Por ese motivo se suele resaltar un nodo en particular, que no tiene por qu ser siempre
el mismo. Cualquier nodo puede cumplir ese propsito, y puede variar durante la
ejecucin del programa.
Otra alternativa que se usa a menudo, y que simplifica en cierto modo el uso de listas
circulares es crear un nodo especial de har la funcin de nodo cabecera. De este modo,
la lista nunca estar vaca, y se eliminan casi todos los casos especiales.
El primer paso es conseguir que lista apunte al nodo anterior al que se quiere eliminar.
1. Esto se consigue haciendo que lista valga lista^.siguiente mientras
lista^.siguiente sea distinto de nodo.
2. Se hacemos que lista^.siguiente apunte a nodo^.siguiente.
3. Se elimina el nodo.
Este mtodo tambin funciona con listas circulares de un slo elemento, salvo que el
nodo a borrar es el nico nodo que existe, y hay que hacer que lista apunte a NULO.
En una lista circular desde cualquier nodo se puede alcanzar cualquier otro. En una lista
simplemente enlazada apuntando a un nodo no es posible volver a nodos anteriores, es
necesario volver a recorrer desde el principio. En una lista circular apuntando a un nodo
se puede volver al predecesor recorriendo hacia delante.
El riesgo con esta estructura es que de no ser riguroso se puede caer en ciclos infinitos
la lista esta sin orden el puntero a lista puede apuntar, como sealamos a cualquier
nodo.
Estas lista tienen cdigo sencillo pero ineficiente. Para insertar un nodo en esta lista sin
orden:
1.
Si se aceptan repeticiones simplemente habr que insertar el nodo en el lugar
donde se encuentra el puntero.
2.
Si no se aceptan repeticiones habr que recorrer la lista, sin caer en ciclos
infinitos para ver si el elemento a insertar ya existe. Para evitar ciclos
infinitos se debe:
a. Guardar en un puntero auxiliar el nodo donde se encuentra el comienzo
del recorrido.
b. Detener el ciclo al encontrar el dato, si es que esta o al igualar el puntero
de recorrido con el auxiliar.
Listas Circulares Ordenadas
En estas estructuras, como en las listas simplemente enlazadas se seala con un puntero
el inicio de la estructura. El cdigo es un poco mas complejo que en las listas sin orden
pero mas eficientes ya que se evitan recorridos innecesarios.
La bibliografa discute donde debe apuntar el puntero al inicio de esta listas para
simplificar el cdigo.
En las listas simplemente enlazadas para insertar un nodo y tener la direccin del
anterior para hacer la insercin se poda recorrer con dos punteros, uno que seala al
nodo actual y otro que seala al nodo anterior. Tambin es posible evitarse el uso de dos
punteros preguntando el forma avanzada por el dato contenido en el prximo nodo.
En una lista circular no vaca ningn siguiente es NULO y el recorrido se hace con un
puntero preguntando en forma avanzada. Como en el recorrido se pregunta en forma
avanzada, el puntero debe apuntar al predecesor del primer nodo, esto por si la insercin
debiera hacerse delante del primer nodo.
Si hay un nico nodo, predecesor y sucesor apuntan a dicho nodo.
Lista circular con header
Es una lista especial donde hay un nodo especial llamado HEADER, que guarda
informacin genrica sobre los otros nodos.
Por ejemplo si los nodos tienen los nombres de las personas y los sueldos, el nodo
HEADER podra tener la cantidad de nodos de la lista, excluyndolo, el sueldo
promedio y el mnimo.
Para definir este tipo de registros los lenguajes de programacin permiten definir
registros variantes o uniones, estas estructuras tienen un tratamiento similar a los
registros y pueden tener una parte fija y una parte variante en la que se solapa la
informacin.
Las ventajas que pueden sealarse entre las listas circulares con header y sin header es:
1.
El Header guarda informacin genrica sobre la lista circular. No es
necesario recorrer la lista para obtener informacin global. Se debe tener en
cuenta que al insertar o eliminar un nodo de la lista se debe actualizar la
informacin de header para que sea consistente.
2.
El cdigo se simplifica porque el header esta siempre, aunque la lista este
vaca. En este caso el problema de poner el puntero a la lista esta resuelto, se
coloca siempre en el header.
Lista Circular Ordenada con HEADER
Definiciones
Aux^.sueldo dato.sueldo
Aux^.tag comn
FIN
ImprimirOrdenado(DATO lch :TipoPunterCircularConHeader)
ALGORITMO
REPETIR
Imprimir(lch^.sig^.nombre)
Imprimir(lch^.sig^.sueldo)
Lch lch^.sig
HASTA QUE lch^.sig^.tag = header
FIN
Listas doblemente enlazadas
Una lista doblemente enlazada es una lista lineal en la que cada nodo tiene dos enlaces,
uno al nodo siguiente, y otro al anterior.
Las listas doblemente enlazadas no necesitan un nodo especial para acceder a ellas,
pueden recorrerse en ambos sentidos a partir de cualquier nodo, esto es porque a partir
de cualquier nodo, siempre es posible alcanzar cualquier nodo de la lista, hasta que se
llega a uno de los extremos.
El nodo tpico es el mismo que para construir las listas que hemos visto, salvo que
tienen otro puntero al nodo anterior:
El proceso es el siguiente:
Nodo^.siguiente debe apuntar a Lista.
Nodo^.anterior apuntar a Lista^.anterior.
Lista^.anterior debe apuntar a nodo.
Lista no tiene por qu apuntar a ningn miembro concreto de una lista doblemente
enlazada, cualquier miembro es igualmente vlido como referencia.
Insertar un elemento en la ltima posicin de la lista:
Igual que en el caso anterior, se parte de una lista no vaca, y de nuevo para simplificar,
que Lista est apuntando al ltimo elemento de la lista:
El proceso es el siguiente:
1. Nodo^.siguiente debe apuntar a Lista^.siguiente (NULO).
2. Lista^.siguiente debe apuntar a nodo.
3. Nodo^.anterior apuntar a Lista.
El paso 2 separa el nodo a borrar del resto de la lista, independientemente del nodo al
que apunte Lista.
Eliminar el ltimo nodo de una lista doblemente enlazada:
De nuevo tenemos los dos casos posibles, que el nodo a borrar est apuntado por Lista o
que no. Si lo est, simplemente hacemos que Lista sea Lista^.anterior.
ALGORITMOS PUNTUALES
Objetivos de aprendizaje
Dominando los temas del presente capitulo Usted podr.
1. Evaluar algoritmos puntuales aplicables a distintas estructuras de datos.
2. Conocer las precondiciones para la utilizacin de algoritmos puntuales
Introduccin
Se describen a continuacin un conjunto de algoritmos puntuales para el manejo de
estructuras estticas y dinmicas. Con una descripcin breve de las precondiciones y
poscondiciones, utilizando definiciones genricas para todos los casos
Definiciones de tipos
Definiciones de los tipos de datos utilizados en los algoritmos que se describen
MAX_FIL
= 100;
Tinfo
= TIPO Entero;
TinfoC
= TIPO <C1 : Td1, C2 : Td2>
TVector
= TIPO Tabla [1,MAX_FIL] de Tinfo;
TPNodo
= TIPO Apuntador a Nodo;
Nodo
= TIPO <Info : Tinfo; sgte : TPNodo>
Arbol
= TIPO <Info : Tinfo; Izq, Der : TPArbol>
Acciones y funciones para vectores
BusqSecEnVector(Dato V: Tvector; Dato N: Entero; Dato Clave:Tinfo;
Dato_resultado Posic: Entero): una accion
Usar este algoritmo si alguna de las otras bsquedas en vectores mas eficientes no son
posibles, recordando que bsqueda directa tiene eficiencia 1, bsqueda binaria es
logartmica y bsqueda secuencial es de orden N
PRE: V: Vector en el que se debe buscar
Clave : Valor Buscado
N: Tamao lgico del vector
POS: Posic: Posicin donde se encuentra la clave, 0 (Cero) si no esta.
LEXICO
Controla No superar el tamao fisico del vector j<= MAX_FIL
j : Entero;
No leer mas alla del ultimo elemento logico cargado j <= N
ALGORITMO
Salir si es que encuentra la clave buscada V[j] <> clave
Posic = 0;
j = 1; //Pone el indice en la primera posicin para recorrer el vector//
MIENTRAS (j <= MAX_FIL y j <= N y V[j] <> Clave) HACER
Inc (j) //Incrementa el indice para avanzar en la estructura//
FIN_MIENTRAS;
SI (j > N)
ENTONCES
Posic =0 // No encontr la clave buscada
SI_NO
Posic = j // Encontr la clave en la posicin de ndice j
FIN_SI;
FIN. // Bsqueda secuencial En Vector
SI V[M] = Clave
ENTONCES
Posic = M;
SI_NO
SI Clave > V[M]
ENTONCES
Pri = M+1
SI_NO
U=M1
FIN_SI
FIN_SI
FIN_MIENTRAS;
FIN. // Bsqueda binaria en vector
LEXICO
I,J, : Entero;
Aux : Tinfo;
ALGORITMO
PARA i [1, N - 1] HACER
PARA j [1, N - i] HACER
SI (v[j] > v[j + 1])
ENTONCES
Para poder colocar el mayor al final es necesario
Aux = v[j];
hacer comparaciones. Se compara el primero con el
V[j] = v[j + 1];
segundo y si corresponde se intercambian. Asi hasta
V[j + 1] = Aux;
llegar al ante ultimo eleemento que se lo compara
con el ltim.
FIN_SI;
Al ir recorriendo los distintos pasos, y dado que en
FIN_PARA;
cada uno se acomoda un nuevo elemento
FIN_PARA;
corresponde hacer una comparacin menos en cada
avance, como los pasos los recorremos con i, las
FIN
comparaciones seran n i. disminuye en 1 en cada
paso
ALGORITMO
Intervalo = n / 2;
MIENTRAS Intervalo > 0 HACER
PARA I [Intervalo + 1 .. N] HACER
MIENTRAS (J > 0) HACER
K = J + Intervalo;
SI (A[J] <= A[K]
ENTONCES
J = -1
SINO
Intercambio(A[J] ,A[K]) ;
J = J Intervalo ;
FINSI ;
FIN PARA ;
FIN MIENTRAS;
FIN.
CorteDeControlEnVector(Dato V:Tvector; Dato N: Entero): una acccion
Usar este procedimiento solo si se tienen los datos agrupados por una clave comn y se
requiere procesar emitiendo informacin por cada subconjunto correspondiente a cada
clave.
PRE: V: Vector en el que se debe Recorrer con corte de control
Debe tener un elemento que se repite y estar agrupado por el.
N : Tamao lgico del vector
POS: Recorre agrupando por una clave
LEXICO
I : Entero;
ALGORITMO
I = 1;
Anterior = TipoInfo;
// Inicializar contadores generales
MIENTRAS (I<=N) Hacer
//inicializar contadores de cada sublote
Anterior = V[i]
MIENTRAS (I<=N Y Anterior = V[i] HACER
// Ejecutar acciones del ciclo
I = I+1 // avanza a la siguiente posicin
FIN_MIENTRAS
// Mostrar resultados del sublote
FIN_MIENTRAS
// Mostrar resultados generales
FIN
ApareoDeVectores(Dato V1,v2:Tvector; Dato N1,N2: Entero): una acccion
Utilizar este procedimiento si se tiene mas de una estructura con un campo clave por el
que se los debe procesar intercalado y esas estructuras estn ORDENADAS por ese
campo comn.
PRE: V1,V2: Vectores a Recorrer mezclados o intercalados
Los vectores deben estar ordenados.
N1,N2 : Tamao lgico de los vectores
POS: Muestra la totalidad de los datos con el orden de las estructuras
LEXICO
I,J : Entero;
ALGORITMO
I = 1;
J = 1;
MIENTRAS (I<=N1 o J<=N2) Hacer
SI((J > N2) o ((I<=N1) y (V1[I]<V2[J])) HACER
ENTONCES
Imprimir (V1[I]);
I = I + 1;
SINO
Imprimir(V2[J]);
J = J + 1;
FIN_SI;
FIN_MIENTRAS
FIN
CargaNMejoresEnVector(Dato_Resultado V: Tvector; Dato_Resultado N: Entero;
Dato Clave:Tinfo): una acccion
PRE: V: Vector en el que se debe buscar e insertar los mejores
Clave: Valor Buscado
N: Tamao lgico del vector
POS: Vector con los N mejores sin orden
LEXICO
j : Entero;
Maximo: Tinfo
Posic: Entero;
ALGORITMO
SI (N < MAX-FIL)
ENTONCES
Inc (N);
V[n] = Clave
SI_NO
BusqMaxEnVector(V; N; Maximo :Tinfo; Posic: Entero);
SI (Clave > Maximo)
ENTONCES
V[Posic] = Clave;
FIN_SI;
FIN_SI;
FIN. // Carga los N mejores en vector
Acciones y funciones para archivos
Se identifican dos tipos de archivos, archivos de texto y archivos biarios. Los archivos
de texto son un conjunto de lineas las cuales tienen 0, 1 o mas caracteres que finalizan
con un carcter particular que representa el fin de la linea. Los datos son interpretados
como caracteres. <los archivos binario, en cambio, son una secuencia de bytes
lmacenados segn su representacin interna y sin interpretar, en este caso es necesario
que sean leidos los datos tal como fueron guardados para poder ser reconocidos como
iguales.
Operaciones elementales de acceso a archivos:
Accion
Asignar(a,s)
Efecto
Asigna al idntificador a la cadena s que representa ub archivo
en disco
Abrir(a)
Prepara el archivo asignado a la variable a para su utilizacion
Crear(a)
Crea el archivo asignado al identificador a y lo prepra para su
acceso
Cerrar(a)
Cierra el arhivo apuntado por a, actualiza la marca de fin si
corresponde
LeerCaracter(a,c)
Lee el siguiente carcter del flujo apuntado por a y lo almacena
en c
LeerLinea(a,s)
Lee la siguente linea del flujo apuntado por a y la almacena en s
GrabarCaracter(a,c)
Escribe secuencialmente en el flujo a el caracter c
GrabarCadena(a,s)
Escribe en el flujo a la cadena s
LeerArchivo(a,r)
Lee el siguiente tipo de dato (ejemplo registro) del flujo a y lo
almacena en r
GrabarArchivo(a,r)
Graba el siguiente tipo de dato, r, en el flujo a
LeerPosicion(a,p,r)
Lee del flujo a el valor contenido en l posicin p y lo almacena
en r
GrabarPosicion(a,p,r) Graba en la posicion p del flujo a el valor contenido en r
NumeroElementos(a) Retorna el numero de elementos almacenados en el archivo
PosicionActual(a)
Retorna la posicin en la que se encuentra posicionado el
puntero actual del archivo.
ApuntarA(a,p)
Accede a la posicin indicada por p en el archivo a.
FinArchivo(a)
Retorna verdadero si se ha alcanzado la marca de fin de archivo
Definiciones de tipos
TipoArchivoEntero = TIPO Entero;
TipoRegistro = TIPO <Clave : Entero ; Nombre : Cadena>;
TipoArchivoRegistro = TIPO Archivo de TipoRegistro;
Declaracion de variables
ArchTexto : Texto //declra una varible de tipo archivo de texto
ArchEntero : TipoArchivoEntero // declara una variable de tipo archivo entero
ArchRegistro: TipoArchivoRegistro //declara una variable de tipo archivo registro
CrearArchivoEnteros(Dato_Resultado Archivo: TipoArchivoEntero): una Accion
Crea un archivo y almacena en el un conjunto de enteros, el proceso termina cuando se
ingresa un entero menor o igual a cero.
LEXICO
I : Entero;
ALGORITMO
Asignar(Archivo,Archivo.dat);
Crear(Archivo);
Imprimir(Ingrese un valor entero);
Leer(i);
MIENTRAS (i <> 0) HACER
GrabarArchivo(Archivo,i);
Imprimir(Ingrese un valor entero);
Leer(i);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.
RecorrerArchivoEnteros(Dato_Resultado Archivo: TipoArchivoEntero): una Accion
Recorre un archivo existente que contiene valores enteros y los muestra por pantalla.
LEXICO
I : Entero;
ALGORITMO
Asignar(Archivo,Archivo.dat);
Abrir(Archivo);
MIENTRAS (No Sea FinArchivo(Archivo)) HACER
LeerArchivo(Archivo,i);
Imprimir(El valor almacenado es : ,i);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.
CrearArchivodeRegistros(Dato_Resultado Archivo: TipoArchivoRegistro): una
Accion
Crea un archivo y almacena en el un conjunto deregistros, el proceso termina cuando
se ingresa un entero menor o igual a cero en el campo clave del registro.
LEXICO
La lectura de cada miembro de un registro
R : TipoRegistro;
cuando el dispositivo es el teclado debe hacerse
ALGORITMO
por seprado. Es decir la lectura de un registro por
teclado se hace camo a campo
Asignar(Archivo,ArchivoR.dat);
Crear(ArchivoR);
Imprimir(Ingrese un valor entero);
La escritura de un registro en un archivo (Grabar
Leer(R.clave);
elarchivo)puede hacersecampo a campo o por la
MIENTRAS (R.clave <> 0) HACER
etructura completa. Hay lenguajes de
Imprmir(Ingrese un nombre);
programacin omo Pascal que solo permiten esta
ultima opcion
Leer(R.nombre);
GrabarArchivo(Archivo,R);
Imprmir(Ingrese un valor entero);
Leer(R.Clave);
FIN_MIENTRAS
Cerrar(Archivo);
FIN.
RecorrerArchivoRegistros(Dato_Resultado Archivo: TipoArchivoRegistro): una
Accion
Recorre un archivo exsistente que contiene registros y los muestra por pantalla.
LEXICO
La lectura de un registro cuando el dispositivo es
R : TipoRegistro;
un archivo se hace por estructura completa
ALGORITMO
Asignar(Archivo,ArchivoR.dat);
Abrir(Archivo);
ALGORITMO
Ptr Pila;
Valor Ptr^ .info;
Pila Pila^.sgte;
Destruir(Ptr);
FIN
creado)
La estructura queda perfectamente enlazada.
Ptr : TPNodo;
ALGORITMO
Se pide memoria se guarda la informacin y el
siguiente del nuevo nodo siempre es el valor
Nuevo(Ptr);
NULO. Para enlazarlo, como vimos, hay dos
Ptr^ <Valor, NULO>;
situaciones posibles cuando es el primer nodo, en
SI (Colafte = NULO)
ese caso el puntero al inicio apunta al nuevo nodo
y cuando ya hay por lo menos un nodo, en ese
ENTONCES
caso se debe enlazar el nuevo nodo a
Colafte Ptr
continuacin del anterior ultimo. En todos los
SI_NO
casos el puntero al ultimo siempre apuntara al
nodo creado.
ColaFin^.sgte = Ptr;
FIN_SI;
ColaFin Ptr
FIN.
Suprimir(Dato_Resultado Colafte, ColaFin: TPNodo; Dato_Resultado Valor: Tinfo)
una accion
Este procedimiento libera el nodo apuntado porcolafte, se encarga de guardar la
informacin contenida en el primer nodo en valor, por lo que este es un parmetro
variable y actualizar los punteros
LEXICO
PRE ColaFte Apunta al Inicio y no esta vacia
POS Libera el nodo de la cima y retorna en valor la informacion.
Colafte apunta al nuevo primer elemento de la estructura o a NULO si queda
Vacia, en ese caso, ColaFin tambien apuntara a nulo.
Nuevo(PtrNuevo);
PtrNuevo^ <Valor, NULO>;
Ptr = Lista;
MIENTRAS (Ptr^.sgte <>NULO y Valor > Ptr^.sgte^.info)
HACER
Pregunta anticipadamente por el valor contenido en el
Ptr ptr^.sgte
nodo siguiente al apuntado por ptr. Si la informacina
FIN_MIENTRAS
ingresar es mayor a la del nodo siguiente debe avanzar
una posicion
PtrNuevo`.sgte Ptr^.sgte;
Ptr^.sgte Ptrnuevo;
FIN_SI;
FIN.
Ptr: TPNodo;
ALGORITMO
Nuevo(Ptr);
Ptr^ <Valor, NULO>;
Lista Ptr
FIN.
InsertaDelante(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion
LEXICO
PRE
POS
Ptr: TPNodo;
ALGORITMO
Nuevo(Ptr);
Ptr^ <Valor, Lista>;
Lista Ptr
FIN.
InsertaEnMedio(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion
LEXICO
PRE Lista Apunta al Inicio no esta vacia.
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion,queda perfectamente enlazada y ordenada.
Ptr, PtrNuevo : TPNodo;
ALGORITMO
Nuevo(PtrNuevo);
PtrNuevo^ <Valor, NULO>;
Ptr = Lista;
MIENTRAS (Ptr^.sgte <>NULO y Valor > Ptr^.sgte^.info)
HACER
Ptr ptr^.sgte
FIN_MIENTRAS
PtrNuevo`.sgte Ptr^.sgte;
Ptr^.sgte Ptrnuevo;
FIN.
Ptr : TPNodo;
ALGORITMO
Ptr = NULO;
MIENTRAS (Lista <>NULO Y Ptr = NULO) HACER
SI valor = Lista ^.info
ENTONCES
Ptr = Lista {lo encontro y sale}
SINO
Lista = Lista ^.sgte {avanza al proximo nodo}
FIN_SI
FIN_MIENTRAS
BuscarNodo = Ptr;
FIN.
Ptr = Lista;
MIENTRAS (Ptr^.sgte <>NULO y Valor >= Ptr^.sgte^.info)
HACER
Similar al procedimiento inserta nodo, pero como no
Ptr ptr^.sgte
debe insertar siempre se cambia el orden de las
FIN_MIENTRAS
accines cuando se debe insertar en el medio. En este
caso se busca primero y si no esta se crea el nodo y se
SI (Ptr^.Info <> Valor)
enlazan los punteros. Como ptr en este estado no
ENTONCES
puede valer NULO y el siguiente si el ciclo de
PtrNuevo^.sgte Ptr^.sgte; repeticin se hace modificando el operador de relacion
por >= en lugar de >. Al salir del ciclo si el valor
Ptr^.sgte Ptrnuevo;
contenido en el nodo actual es distinto al buscado
Ptr PtrNuevo;
significa de ese dato no esta en la lista y se debe
FIN_SI;
inserta, de lo contrario no se inserta.
FIN_SI;
FIN.
InsertaNodo2(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una accion
LEXICO
PRE
POS
Q NULO:
MIENTRAS (P <> NULO y Valor > P^.info) HACER
Q P;
P P^.sgte:
FIN_MIENTRAS;
SI (P <> NULO y Valor = P^.info
ENTONCES
SI Q <> NULO
ENTONCES
Q^.sgte P^.sgte
SI_NO
Lista P^.sgte;
FIN_SI:
Destruir(P):
FIN_SI;
FIN
InsertaNodoListaDoblementeEnlazada(Dato_Resultado Lista: TPNodo; Dato Valor:
Tinfo) una accion
// El Nodo tiene un puntero al nodo anterior y un puntero al nodo siguiente
LEXICO
PRE Lista Apunta al Inicio o a NULO si esta vacia.
<Valor,Siguiente,Anterior>
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
Se la puede recorrer en ambas direcciones
Ptr, PtrNuevo : TPNodo;
ALGORITMO
SI (lista = NULO o Valor < Lista^.info
ENTONCES
Nuevo(Ptr);
Ptr^ <Valor, Lista,NULO>;
SI lista <> NULO
ENTONCES
Lista^.anterior Ptr
Lista Ptr
SI_NO
Nuevo(PtrNuevo);
PtrNuevo^ <Valor, NULO,NULO>;
Ptr Lista;
MIENTRAS (Ptr^.sgte <>NULO y Valor > Ptr^.sgte^.info)
HACER
Ptr ptr^.sgte
FIN_MIENTRAS
PtrNuevo^.sgte Ptr^.sgte;
PtrNuevo^.ant Ptr;
Ptr^.sgte Ptrnuevo;
SI PtrNuevo^.sgte <> NULO
ENTONCES
PtrNuevo^.sgte.ant = PtrNuevo;
FIN_SI;
FIN_SI;
FIN.
ApareoDeListas(Dato_Resultado ListA,ListB,ListAB) una accion
LEXICO
PRE ListA y ListB Listas ordenadas simplemente enlazadas.
POS ListAB Lista enlazada producto del apareo de las listas dato.
Ptr : TPNodo; Puntero auxiliar para insertar como cola
VA,VB,VAB: TipoInfo el valor asociado a cada nodo de la lisra
ALGORITMO
ListAB = NULO;
Ptr = NULO;
MIENTRAS (ListA <> NULO) O (ListB <> NULO) HACER
SI ((ListB = NULO)O((ListA<>NULO)Y(ListA^.info<ListB^.info)))
ENTONCES
VAB = VA
SI_NO
VAB = VB
FIN_SI
Agregar(ListAB,Ptr,VAB);
FIN_MIENTRAS;
Ptr = NULO;
FIN.
ListaParalelaParaAgrupar(Dato_Resultado ListA, Dato ArchDatos,ArchProceso :
TipoArchivo) una accion
LEXICO
PRE ListA Lista Paralela al archivo de datos, con tantos nodos como registros tiene
ese archivo. Las restricciones del nodo no alcanzan para poner la clave de ordenamiento
y solo se puede poner un campo que agrupe datos del archivo de proceso.
ArchDatos es el archivo de datos personales, contiene todas las claves, esta ordenada
por esa por lo que es posible hacer bsqueda binaria. ArchProceso es el archivo a
procesar contiene la clave por la que se vincula con el archivo de datos con lo que esta
ordenado.
Se busca hacer una lista paralela para agrupar evitando busquedas secuenciales en
archivos.
POS ListA contendra el valor acumulado de cada clave del archivo de datos
relacionados posicionalmente.
ALGORITMO
ListA = NULO;
PARA I [1 .. CantidadRegistros(ArchDatos)] HACER
InsertaDelante(ListA, 0);
//Crea la lista con los contadores en cero//
FIN_PARA
MIENTRAS (HayaDatos(ArchProceso)) HACER
LeerRegistro(ArchProceso, Registro);
BusquedaBinaria(ArchDatos, Registro.Clave; Pos);
Ptr = Lista;
Para J [1 .. Pos] HACER
Ptr = Ptr*.sgte;
FIN_PARA
Incrementar(Ptr*.info, Registro.Agregado);
FIN_MIENTRAS;
FIN.
ListaParalelaParaBuscar(Dato_Resultado ListA, Dato ArchDatos,ArchProceso :
TipoArchivo) una accion
LEXICO
PRE ListA Lista Paralela al archivo de datos, con tantos nodos como registros tiene
ese archivo. Las restricciones del nodo no alcanzan para poner la posicin en el
archivoclave de ordenamiento y solo se puede poner un campo que agrupe datos del
archivo de proceso.
ArchDatos es el archivo de datos personales, contiene todas las claves, No esta
ordenado lo que no es posible hacer busqueda directa ni bsqueda binaria.Se lo carga
en una lista como cola para poder buscar en la lista y luego accedre al archivo segn el
numero de nodo
ArchProceso es el archivo a procesar contiene la clave por la que se vincula con el
archivo y hay que ir a buscar un valor.
Se busca hacer una lista paralela, cargada como cola para buscar evitando busquedas
secuenciales en archivos.
POS ListA contendra el la clave de busqueda y para cada clave del archivo de datos
se relacionan posicionalmente segn el numero de nodo.
ALGORITMO
ListA = NULO;
Aux = NULO
PARA I [1 .. CantidadRegistros(ArchDatos)] HACER
Leer(Registro(ArchDatos, Registro)
Agregar(ListA, Aux, Registro.clave);
//Crea la lista con la clave a buscar//
FIN_PARA
Aux = NULO // Para que el resultado sea una lista y no una cola
MIENTRAS (HayaDatos(ArchProceso)) HACER
LeerRegistro(ArchProceso, Registro);
Ptr = Lista;
NumeroNodo = 0;
MIENTRAS Ptr*.info <> Registro.clave HACER
Ptr = Ptr*.sgte;
Incrementar(NumeroNodo);
FIN_MIENTRAS
AccesoDirectoArchivo(ArchDatos, NumeroNodo);
LeerRegistro(ArchDatos, RegistroDatos);
Imprimir(Registrodatos.Otra clave);
FIN_MIENTRAS;
FIN.
InsertaNodoListaCircular(Dato_Resultado Lista: TPNodo; Dato Valor: Tinfo) una
accion
//El Puntero a una lista circular apunta al predecesor al primer elemento
LEXICO
PRE Lista Apunta al al predecesor al primer elemento.
Lista no vacia, al menos un nodo
Si hay un solo nodo apunta a si mismo
POS Lista apunta al primer elemento de la estructura.
No retorna la direccion del nodo creado, salvo si es el primero
La estructura queda perfectamente enlazada y ordenada creciente.
Ptr, Auxiliar : TPNodo; Salir Booleano;
ALGORITMO
Nuevo(Auxiliar);
Aux^ <Valor, NULO>;
Lista Ptr
SI (lista = NULO)
ENTONCES
Auxiliar^.sgte = Auxiliar;
Lista = Auxiliar;
SI_NO {La lista no esta vacia}
Ptr = Lista;
Salir = FALSO
REPETIR
SI (Ptr^.sgte^.info< Valor)
ENTONCES
Ptr ptr^.sgte
SINO
Salir = Verdadero
FIN_SI
HASTA Salir o Ptr = Lista
Auxiliar^.sgte Ptr^.sgte;
Ptr^.sgte Auxiliar;
SI (Salir = FALSO)
ENTONCES
Lista = Auxiliar
ALGORITMO
EsHoja (Arbol^.izquierdo = NULO) Y (Arbol^.derecho = NULO;
FIN /*EsHoja
ALGORITMO
SI (Arbol <> NULO)
ENTONCES SI (EsHoja(Arbol))
ENTONCES
CantidadHojas = 1;
SINO
CanidadHojas CantidadHojas(Arbol^.izquierdo) +
CantidadHojas(Arbol^.derecho);
SINO
CantidadHojas = 0;
FIN_SI;
FIN.
AlturaArbol(Dato Arbol: TPNodo): Entero una funcion;
Maximo(Dato A, B : Entero): Entero una funcion;
ALGORITMO
SI (A > B)
ENTONCES
Maximo = A;
SINO
Maximo = B;
FIN_SI
FIN /*Maximo
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
1
AlturaArbol
Maximo(AlturaArbol(Arbol^.izquierdo),AlturaArbol(Arbol^.derecho))
SINO
AlturaArbol -1
FIN_SI;
FIN.
BuscarEnArbol(Dato Arbol: TPNodo; Dato Valor: Tinfo): Booleano una funcion
LEXICO
PRE Arbol Apunta al nodo raiz o es Nulo.<izquierdo, info, derecho>
Busca el dato contenido en Valor
POS Retorna Verdadero si lo encuentra o falso en caso contrario.
ALGORITMO
SI (Arbol <> NULO)
ENTONCES
Si (Valor< Arbol^.info)
ENTONCES
BuscarEnArbol BuscarEnArbol(Arbol^.izquierda, valor)
SINO SI (Valor>Arbol^.info)
ENTONCES
FIN_SI
SINO
ERROR;
FIN_SI;
FIN.
Inserciones en arboles AVL
Insercion en el sularbol izquierdo de la rama izquierda de A
Rotacion Simple Izquierda Izquierda
N1^.izquierdo N1^.derecho (N es el nodo desbalanceado N1 su hijo izquierdo)
N1^.derecho N1
N N1
Insercion en el sularbol derecho de la rama izquierda de A
Rotacion Doble derecha Izquierda
N1^. izquierdo N2^. derecho
N2^. derecho N1
N^. derecho N2^. izquierdo
N2^.izquierdo N
N N2
Insercion en el sularbol derecho de la rama derecha de A
Rotacion Simple Derecha Derecha
N1^.derecho N1^. izquierdo (N es el nodo desbalanceado N1 su hijo derecho)
N1^.izquierdo N1
N N1
Insercion en el sularbol izquierdo de la rama derecha de A
Rotacion Doble Izquierda derecha
N1^. derecho N2^. izquierdo
N2^. izquierdo N1
N^.izquierdo N2^.derecho
N2^.derecho N
N N2
Funciones recursivas
El flujo de control de una funcin recursiva requiere tres condiciones para una
terminacin normal:
1. Un test para detener o continuar con la recursion.
2. Una llamada recursiva para continuar la recursion
3. Un caso base para terminar la recursion
Recursividad
SI (Es el caso base)
ENTONCES
Ejecutar la accion final
Terminr recursion
SINO
FIN.
Recursividad indirecta
Funcion mutuamente reursiva implementdas en C
Imprimir los carcteres del alfabeto ingles
# incluye <stdio.h>
void FuncionA(char c);
void FuncionB(char c);
int main()
{
FuncionA(Z);
Return 0;
}
void FuncionA(char c)
{
if( c > A )
FuncionB(c);
Printf(%c,c);
}
void FuncionB(char c)
{
FuncionA(--c);
}
Determinar si un numero es par
# incluye <stdio.h>
void FuncionPar(int n);
void FuncionImpar(int n);
int main()
{
if (FuncionPr(9))
printf(Es par);
else
printf(Es Impar);
return 0;
}
int FuncionPar(int n)
{
if (n == 0)
return 1;
else
return FuncionImpar(n-1);
}
int FuncionImpar(int n)
{
if (n == 0)
return 0;
else
return FuncionPar(n-1);
}
Archivos en pascal
Pascal Dispone del tipo de dato text que permite vincular a una variable interna con un
archivo de texto.
En el caso de C los nombres internos se declaran como un puntero a una struct FILE, y
la discriminacion del tipo, texto o binario se realiza en la apertura
Para trabajar con archivos de texto en Pascal se debe:
1.
Declarar el nombre lgico del archivo con un identificador de tipo text.
2.
Relacionar el nombre interno o lgico con l externo o fsico, mediante
Assign.
3.
Abrirlo con Reset o Rewrite segn corresponda.
En el ejemplo que sigue se desarrollan las acciones para lectura completa de un archivo
de texto. Se lee
1.
Carcter a carcter.
2.
Por lnea completa.
3.
Con formato
a.
En datos simples
b.
En registros
program LeerCaracteres;
{Lee un archivo de texto caracter a caracter y lo muestra por pantalla}
Arch : text;
Letra : char;
begin
Assign (Arch,'C:\....\archivo.txt');
Reset(Arch);
while not EOF(Arch) do
begin
{Lectura caracter a caracter}
read(Arch, Letra);
write(Letra);
end;
Close(Arch);
End.
program LeerPorLineas;
Arch : text;
Nombre : string;
begin
Assign (Arch,'C:\...\archivo.txt');
Reset(Arch);
while not EOF(Arch) do
begin
1.
2.
3.
7.
8.
program ConvierteTextoABinario;
Type
TipoRegistro = Record
Numero : Integer;
Cadena : string[10];
End;
TipoArchivo = FILE OF TipoRegistro;
var
Arch : text;
Registro : TipoRegistro;
Binario : TipoArchivo;
I
: Integer;
begin
clrscr;
Assign (Arch,'C:\borlandc\archivo.txt');
Reset(Arch);
Assign (Binario,'C:\...\Binario.Dat');
Rewrite(Binario);
while not EOF(Arch) do
begin
}
i++;
c=cadena[i];
}
while(pila){
Sacar(&pila,&c);
suf[j++]=c;
}
suf[j] = '\0';
}
Condicin 1
T
Accin 1
Accin 5
Accin 2
Mientras condicin 3
Condicin 2
T
Accin 6
F
Accin 3
Accin 7
Accin 8
Accin 9
Accin 4
Accin 10
Accin 11
Accin 12
Diagramas de Jackson
Diagramas de Lindsay.
PASCAL
DIAGRAMA DE DETALLE
Variable expresin
Variable = expresin
var1, var2,....
, ..... )
WRITE
liter1 liter2
var 1
liter1
IF condicin
THEN
sentencia 1
ELSE
sentencia 2
,....
liter2
Condicin
Instruccin 1
Instruccin 2
Condicin
WHILE condicin
DO
sentencia
Instruccin
REPEAT
sentencia;
:
:
sentencia n
UNTIL condicin
FOR variable: expres1
var 2
Instruccin 1
:
:
Instruccin n
Condicin
TO
expres2
DOWNTO
Instruccin
DO sentencia
CASE expresin
OF
const1....... const n : instruccin1
:
:
const1...... const p : instruccin m
END
Cualquier sentencia puede ser reemplazada por
un bloque:
BEGIN
sentencias 1;
:
:
sentencias n
END
Expresin
Const1... Const n
Const1... Const p
Instruccin1
Instruccin m
Llaves de Warniel
HacerUnaCosa)
Si
Condicin
Exclusin
No
1
Algoritmo
Case
Ordinal
Mientras
Condicin
HacerOtraCosa
Vacio
2
HacerUnaCosa;
HacerOtraCosa;
HacerAlgoMas
Notacin Algoritmica
LEXICO {Lxico Global del algoritmo}
{Declaracin de tipos, constantes, variables y acciones}
Accin 1
PRE {Precondicin de la accin 1}
POS {Poscondicin de la accin 1}
LEXICO {Lxico local, propio de la accin 1}
Declaraciones locales
ALGORITMO {Implementacin de la accin 1}
{Secuencia de instrucciones de la accin 1}
FIN {Fin implementacin algoritmo de la accin 1}
ALGORITMO
PRE {Precondicin del algoritmo principal}
POS {Poscondicin del algoritmo principal}
{Secuencia de instrucciones del algoritmo principal}
FIN {Fin del algoritmo principal}
Pascal
If expresion condicional
Then
S
Else
R;
C
If (expresion)
S;
Else
R;
Formato
SEGN expr
V1 : S1
V2 : S2
EN_OTRO_CASO : Sn
FIN_SEGN
Pascal
Case selector of
Valor1 : S1;
.........................
else Ve: Se;
end;
C
switch (selector) {
case etiqueta:S; break;
..............................
default: R;
}
ITERACION
Formato
Mientras Cond. Hacer
S
FIN_MIENTRAS
Pascal
While Expresion logica do
S;
C
while(expresion)
S;
Formato
REPETIR
S
HASTA Cond
Efecto
Repeat
S
Until expresion logica
do
S;
while(expresion)
Formto
PARA i [Vi..Vf] HACER
S
FIN_PARA
Efecto
For i:=Vi to vf do
S;
for(i=0;i<vf;i++)
S;
Estilos de Indentacin
Recomendacion de estilos de indentacion para desarrollos ms claros y legibles.(Ing. J.
M. Sola)
Estilo The One True Brace Style
while( SeaVerdad() ) {
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
BSD/Allman.
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo Whitesmiths
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo GNU
while( SeaVerdad() )
{
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
Estilo Pico
while( SeaVerdad()
{
HacerUnaCosa();
HacerOtraCosa(); }
HacerUnaUltimaCosaMas();
Estilo Banner
while( SeaVerdad() ) {
HacerUnaCosa();
HacerOtraCosa();
}
HacerUnaUltimaCosaMas();
BIBLIOGRAFIA
Behrouz Forouzan. Introduccin a la ciencia de la computacin. 2005. Ciencias e
Ingenieria.
De Giusti. Algoritmos datos y programas. 2001. Prentice Hall.
Garcia Molina. Una introduccin a la programacin. 2005. Thomson.
Kernighan - Ritchie. El lenguaje de programacion C. 1988. Pearson
Kerighan Pike. La practica de la programacion. 2000. Pearson
Perkins David. La baera de Arquimedes y otras historias del descubrimiento
cientifico. Paidos 2004
Iranzo, j. Logica simbolica para informaticos. 2006. Alfaomega.
Perez M. Matematica discreta y algoritmos. 2005. Answer.
Joyanes Aguilar, L.Algoritmos y estructura de datos, una perspectiva en C. 2004
Mc Graw Hill
El Autor
Oscar Ricardo Bruno
Formacin Academica
Doctorando en educacin UnTref
Licenciado en Sistemas (Instituto Tecnologico de Buenos Aires)
Magster en Docencia Universitaria UTN FRBA
Especialista en Ingenieria en Sistemas (Maestrando) UTN FRBA
Especialista en Docencia Universitaria UTN FRBA
Profesor en Docencia Universitaria en Sistema INSPT UTN FRBA
Espeialista en Investigacin Operativa ESIO DIGID.
Miembro de la Sociedad Argentina de Estudios Comparados en Educacion
Actividad Docente
Director IAFIP. Instituto Argentino de Formacin e Investigacin en Programacion
Profesor Adjunto Algoritmos y Estructura de Datos y Sintaxis y Semntica de Lengujes
UTN FRBA .
Profesor Adjunto Estructura de Datos Univeridad del Salvador
Profesor Titular Laboratorio II y III Escuela Tecnica Nro 1 Otto Krause
Coordinador Area Computacin EIOK
Director y jurado de tesis UTN FRBA
Ex Consejero Departamental docente UTN FRBA departamento Sistemas.
Menciones
Finalista premios Sadosky 2006 - 2007 a la inteligencia argentina categora calidad
docente