Escolar Documentos
Profissional Documentos
Cultura Documentos
CONCEPTOS BÁSICOS
Informática: es la ciencia que estudia el análisis y la resolución de problemas utilizando computadoras.
Computadora: máquina digital y sincrónica, con cierta capacidad de cálculo numérico y lógico, controlado por
un programa almacenado y con probabilidad de comunicación con el mundo exterior. La finalidad de la
computadora es ayudar al hombre a realizar tareas repetitivas en menor tiempo y con mayor exactitud.
Digital: maneja señales y procesa información representada con valores binarios (0 ó 1).
Dato: es una representación de un objeto del mundo real mediante la cual podemos modelizar aspectos del
problema que se quiere resolver con un programa sobre una computadora.
Programa: conjunto de instrucciones u órdenes ejecutables sobre una computadora, que permite cumplir con
una función o requerimiento específico (dichas órdenes se expresan en un lenguaje de programación concreto).
Lenguaje de programación: es el conjunto de instrucciones permitidas y definidas por sus reglas sintácticas y su
valor semántico, para la expresión de soluciones a problemas.
Problema del
Análisis Diseño Implementación Solución
mundo real
Abstracción Descomposición
En la etapa de análisis se trata de encontrar los aspectos principales del problema del mundo real y determinar
en forma clara y concreta el objetivo que se desea, esto se denomina especificación. De allí se establece un
modelo o abstracción del problema real que permitiría su resolución en una computadora.
1
Algoritmos, Datos y Programas - 2010
A partir del modelo es necesario avanzar en la etapa del diseño de una solución. El primer paso en esta etapa es
la modularización, es decir, la descomposición funcional de todas las acciones que propone el modelo. Esto
ayuda a reducir la complejidad, a distribuir el trabajo y en el futuro a re-utilizar los módulos.
Una vez que se tiene la descomposición en módulos, se debe comenzar con su implementación: esto requiere
escribir algoritmos en un lenguaje de programación y elegir la representación de los datos.
Finalmente, cuando se tiene un programa escrito en un lenguaje real y depurado de errores, se procede a la
verificación, es decir, que la ejecución del programa conduzca al resultado deseado, con datos representativos
del problema real.
Las instrucciones (o acciones) representan las operaciones que ejecutará la computadora al interpretar el
programa.
Los datos representan objetos del mundo real, son los valores de información de los que se necesita disponer y
en ocasiones transformar para ejecutar la función del programa
Es decir, a partir de un contexto determinado por las precondiciones el programa transforma la información y
debiera llegar al resultado esperado produciendo un nuevo contexto, caracterizado por las postcondiciones.
Pre-condición es la información que se conoce como verdadera antes de iniciar el programa (ó módulo).
Post-condición es la información que debería ser verdadera al concluir el programa (ó módulo), si se cumplen
adecuadamente los pasos especificados.
ESTRUCTURÁS DE CONTROL
Existen en todos los lenguajes de programación un conjunto mínimo de instrucciones que permiten especificar
el control del algoritmo que se quiere implementar, se lo conoce como estructura de control.
SECUENCIA: es la estructura de control más simple, está representada por una sucesión de operaciones (por
ej. asignaciones), en la que el orden de ejecución coincide con el orden físico de aparición de las
instrucciones.
DECISIÓN: en un algoritmo representativo de un problema real es prácticamente imposible que todo sea
secuencial. Es necesario tomar decisiones en función de los datos del problema.
2
Algoritmos, Datos y Programas - 2010
SELECCIÓN: en una extensión de la estructura básica de decisión, para el caso que las alternativas sean más
de dos. Simbólicamente:
Case (Variable_Decisión) of
Posibilidad1: Acciones_para_posibilidad_1;
Posibilidad2: Acciones_para_posibilidad_2;
...
Else Acciones_para_posibilidades_no_contempladas_antes;
End;
3
Algoritmos, Datos y Programas - 2010
REPETICIÓN: es una extensión natural de la secuencia. Consiste en repetir N veces un bloque de acciones.
Este número de veces que se deben ejecutar las acciones es fijo y conocido de antemano. Simbólicamente:
4
Algoritmos, Datos y Programas - 2010
ITERACIÓN: puede ocurrir que se desee ejecutar un bloque de instrucciones desconociendo el número exacto
de veces que se ejecutan. Para estos casos existen las estructuras de control iterativas condicionales.
Como su nombre lo indica, las acciones se ejecutan dependiendo de la evaluación de la condición.
Estas estructuras se clasifican en pre-condicionales y post-condicionales.
En cambio, en las estructuras iterativas post-condicionales primero se ejecuta el bloque de acciones y luego se
evalúa la condición. A diferencia de la iteración pre-condicional, el bloque de acciones se ejecuta 1 ó más veces.
Repeat
Acciones
Until (Condición);
5
Algoritmos, Datos y Programas - 2010
ESTRUCTURÁ DE UN PROGRÁMÁ
Sintaxis de un programa en lenguaje Pascal:
Program identificador;
Const
{Definición de constantes}
Type
{Definición de Tipos de datos definidos por el usuario}
Var
{Declaración de variables}
Procedure
{Definición de procedimientos}
Function
{Definición de funciones}
CÁLIDÁD DE UN PROGRÁMÁ
Los factores que determinan la calidad del software se clasifican en tres grupos:
6
Algoritmos, Datos y Programas - 2010
LEGIBILIDÁD Y DOCUMENTÁCION
Legibilidad: el código fuente de un programa debe ser fácil de leer y entender. Esto obliga a acompañar a las
instrucciones con comentarios adecuados. Relacionado con la presentación de documentación.
Documentación: todo el proceso de análisis y diseño del problema y su solución debe estar documentado
mediante texto y/o gráficos para favorecer la comprensión, la modificación y la adaptación a nuevas funciones.
Un programa bien documentado será fácil de leer y mantener. Es común que la mayoría de los lenguajes de
programación provean algún mecanismo de documentación, por ejemplo, a través de la inserción de
comentarios en el programa.
Un programa sin comentarios revela un estilo pobre de programación y peligroso para el mantenimiento
adecuado del mismo.
7
Algoritmos, Datos y Programas - 2010
Es recomendable realizar un comentario general del objetivo del programa o del módulo de programa en
cuestión, que refleje una especificación del problema a resolver, lo más completa posible.
Su lectura debería ser suficiente para poder entender las acciones que se llevan a cabo en el mismo.
Los comentarios intercalados en el programa (documentación online), deben realizarse con criterio para
contribuir a la claridad del programa.
Cuando se realiza el mantenimiento de un programa no sólo se actualiza el código, sino también los comentarios
del programa. Debe quedar claro que los comentarios no son un agregado al programa sino parte del mismo.
CORRECCION Y EFICIENCIÁ
Corrección: Un programa es correcto cuando cumple con la función especificada; esto significa que cumple con
los requerimientos propuestos.
Para determinar cuáles son esos requerimientos se debe tener una especificación completa, precisa y no
ambigua del problema a resolver antes de escribir el programa.
Para medir si un programa es correcto se debe probar con datos reales que permitan verificar su función.
La verificación de programas es una labor muy importante, y la búsqueda de técnicas de verificación eficientes
es actualmente campo de investigación en la Ciencia de la Computación.
Eficiencia: es una métrica de calidad de los algoritmos, asociada con una utilización óptima de los recursos del
sistema de cómputo donde se ejecutará el programa.
MODULÁRIZÁCION
Modularizar significa dividir un problema en partes funcionalmente independientes, que encapsulen
operaciones y datos. Cada módulo puede pensarse como una caja negra con una función lógica bien definida
(QUÉ) que puede ser implementada internamente de muchos modos (CÓMO). La descomposición es una técnica
que se basa en el paradigma “divide y vencerás” y tiene siempre un objetivo: dividir cada problema en
subproblemas, y estos a su vez en subproblemas más pequeños, deben ser de forma tal que:
8
Algoritmos, Datos y Programas - 2010
El método de diseño descendente (Top Down) es conocido también como modularización. Esquemáticamente:
Un buen diseño de programa va de lo general a lo particular, esto es que un problema sea descompuesto en un
número de subproblemas (módulos). Cada módulo tendrá una tarea específica bien definida y se comunicarán
entre sí adecuadamente para conseguir un objetivo común.
IMPORTANCIA DE LA MODULARIZACIÓN
Reusabilidad del código, es decir la posibilidad de utilizar repetidamente el producto de software desarrollado.
Escalabilidad, la modularización otorga facilidades para el crecimiento del sistema. Los sistemas de software
reales crecen (es decir aparecen con el tiempo nuevos requerimientos del usuario). La modularización permite
disminuir los riesgos y costos de incorporar nuevas prestaciones a un sistema en funcionamiento
Legibilidad, un efecto de la modularización es una mayor claridad para leer y comprender el código fuente. El
ser humano maneja y comprende con mayor facilidad un número limitado de instrucciones directamente
relacionadas.
PROCEDIMIENTOS Y FUNCIONES
Los procedimientos y las funciones son algunos de los recursos con los que cuentan los lenguajes de
programación para especificar la modularización.
9
Algoritmos, Datos y Programas - 2010
Las funciones pueden pensarse como operadores definidos por el usuario, que reciben variables (parámetros
por valor) y producen un resultado único.
Los procedimientos son verdaderos subprogramas que interactúan en el espacio de datos del módulo que los
invoca a través de parámetros por referencia.
Procedimiento: es un conjunto de instrucciones que realizan una tarea específica y como resultado puede
retornar 0, 1 o más valores. Para devolver el resultado necesita. Permite operaciones de lectura y escritura. Se
invocan escribiendo su nombre seguido de los datos de comunicación. Sintaxis en Pascal:
Funciones: es un módulo que realiza una única tarea y devuelve siempre un sólo valor de tipo simple. Para
devolver el resultado se asigna al nombre de la función como última instrucción. Respecto de las operaciones de
lectura y escritura, no es aconsejable introducirlas como parte del módulo. Se pueden invocar: dentro de un if, o
de un while, o asignarla a una variable o dentro de un write. Pueden recibir sólo parámetros de entrada. Sintaxis:
Tipo: es el tipo del dato que devolverá la función. Debe ser de tipo simple.
Al final del cuerpo de la función es obligatorio asignarle un valor del tipo devuelto al nombre de la función.
El número y tipo de los argumentos utilizados en la invocación a una Función o un Procedimiento deben
coincidir con el número y tipo de parámetros del encabezamiento del módulo.
10
Algoritmos, Datos y Programas - 2010
La comunicación de los datos entre el programa y los módulos puede hacerse mediante parámetros y variables
globales. Pero utilizar variables globales tiene varias desventajas:
La solución a estos problemas ocasionados por el uso de variables globales es una combinación de ocultamiento
de datos (Data Hidding) y uso de parámetros:
El ocultamiento de datos significa que los datos exclusivos de un módulo NO deben ser "visibles" o utilizables
por los demás módulos.
El uso de parámetros significa que los datos compartidos se deben especificar como parámetros que se
trasmiten entre módulos.
Es decir, se analiza para cada módulo y los datos propios se declaran locales al módulo, mientras que los datos
compartidos se declararán como parámetros.
Parámetro por valor (IN): significa que el módulo pasa una copia de los datos a otros módulos, el módulo que la
recibe (sobre una variable local) puede realizar operaciones y/o cálculos, pero no podrá efectuar ningún cambio
sobre el dato original. Al producir una copia de los datos, esto puede significar una utilización importante de
memoria y tiempo de cómputo. Un parámetro por valor debiera ser tratado como una variable de la cual el
Procedimiento o Función hace una copia y la utiliza localmente.
Parámetro por referencia (OUT, INOUT): significa que no se envía una copia del valor del dato, sino que envían
la dirección donde se encuentra el dato, con lo cual se puede operar con ella y su valor original dentro del
módulo, y las modificaciones que se produzcan se reflejan en los demás módulos que conocen la variable. Como
opera directamente sobre la dirección de la variable original, no se requiere memoria local. La sintaxis que
utiliza Pascal para identificar un parámetro por referencia consiste en poner previo a este la palabra clave var.
11
Algoritmos, Datos y Programas - 2010
TIPOS DE DÁTOS
Un tipo de dato es una clase de objetos ligados a un conjunto de operaciones para crearlos y manipularlos. Se
caracterizan por:
Al definir un tipo de dato lo que se está indicando es la clase de valores que pueden tomar sus elementos y las
operaciones que pueden realizarse sobre ellos.
TIPOS SIMPLES
Los tipos de datos simples existen en todos los lenguajes de programación (también llamados estándar o
definidos por el lenguaje) y permiten manipular las representaciones más sencillas de información. Son:
Tipo Numérico: el tipo de dato numérico es el conjunto de los valores numéricos que pueden representarse
de dos formas:
Entero: es el tipo de dato numérico más simple de todos (elementos del tipo: ..., -2, -1, 0, 1, 2,...). Dado
que una computadora tiene memoria finita, la cantidad de valores enteros que se pueden representar
sobre ella son finitos (existe un número entero máximo y otro mínimo, generalmente denominado
maxint). Si se utilizan 16 dígitos binarios (bits) para almacenar en memoria cada número entero, esto
permite un rango de valores enteros entre -215 y +215.
Real: es una clase de dato numérico que permite representar números decimales. La representación
para números reales se denomina coma flotante y es una generalización de la notación exponencial o
científica, que consiste en definir cada número como una mantisa (parte decimal) y un exponente
(posición de la coma).
Suma (+), resta (-), multiplicación (*): aceptan operandos enteros o reales, su resultado podrá ser
entero (si ambos son enteros) o real (si alguno de los operandos es real).
división (/): su resultado será un real independientemente del operando real o entero.
división entera (div) y módulo (mod): sólo para enteros y su resultado es el cociente de una división
entera (div) o el resto de la misma (mod).
1. operadores *, /
2. operadores +, -
3. operadores div y mod.
12
Algoritmos, Datos y Programas - 2010
Además de los operadores matemáticos, el tipo de dato numérico posee operadores relacionales que
permiten comparar valores. Dichas relaciones son: igualdad (=), desigualdad (<>) y orden (<, <=, >, >=). El
resultado es del tipo de dato lógico (Verdadero o Falso).
Tipo Lógico: el tipo de dato lógico, también llamado boolean permite representar datos que pueden tomar
solamente uno de dos valores: verdadero (true) y falso (false). Se utiliza en situaciones donde representan
dos alternativas a una condición. Los operadores lógicos básicos son (por orden de precedencia):
1. negación (not),
2. conjunción (and),
3. disyunción (or).
Tipo Carácter: el tipo carácter representa un conjunto finito y ordenado de caracteres que la computadora
reconoce. El estándar ASCII establece cuáles son los elementos de dicho conjunto y el orden de precedencia
entre los mismos. Ejemplos de caracteres son:
Un valor del tipo de dato carácter es sólo uno de los símbolos mencionados.
Dos caracteres se pueden comparar con los operadores relacionales =, <>, >, <, >=, <=, y el resultado de
cualquiera de ellos es un valor de tipo de dato lógico.
Salvo el tipo real, los otros tres tipos de datos tienen sus elementos ordenados discretamente, es decir existe un
elemente anterior y otro posterior. Por eso, a los tipos enteros, carácter y lógico se los denomina tipos de datos
ordinales.
CONSTANTES Y VARIABLES
Dado que hay diferentes tipos de datos, estos deben especificarse. Y a esta especificación dentro de un
programa se la conoce como declaración. Una vez declarado un tipo podemos asociar al mismo variables,es
decir nombres simbólicos que pueden tomar los valores característicos del tipo.
Conceptualmente, se tienen datos constantes que no cambian durante la ejecución del programa o datos
variables que durante la ejecución del programa pueden cambiar. Tantos las constantes como las variables
deben guardarse en la memoria de datos de una computadora y en ambos casos estarán representadas por un
nombre (identificador) asociado con una dirección única de memoria. El contenido (valor) de dicha dirección
será asignado una única vez para las constantes y, posiblemente, muchas veces para variables.
13
Algoritmos, Datos y Programas - 2010
DECLARACIONES
donde “nombre” es el identificador que representa el nombre de la constante. El tipo de dato de la constante
queda definido implícitamente por el tipo de dato de valor.
Por su parte, las variables en Pascal se declaran utilizando la palabra clave var, de la forma:
Algunos lenguajes, como Pascal, exigen que se especifique a qué tipo pertenece cada una de las variables y
verifican que el tipo de los datos asignados a esa variable se correspondan con su definición. Esta clase de
lenguajes se denomina fuertemente tipados (strongly typed). Otra clase de lenguajes, que verifica el tipo de las
variables según su nombre, se denomina auto tipados (self typed). Existe una tercera clase de lenguajes que
permiten que una variable tome valores de distinto tipo durante la ejecución de un programa. Esta se denomina
dinámicamente tipados (dinamically typed).
ASIGNACIONES
Una de las sentencias básicas que poseen los lenguajes de programación es la asignación. Y es de la forma:
Nombre_de_variable:= expresión
Se evalúa la expresión de la derecha y se almacena el resultado en la variable de la izquierda, por lo que para
que la asignación sea válida (en Pascal) deben ser del mismo tipo o compatibles.
14
Algoritmos, Datos y Programas - 2010
Un tipo de dato definido por el usuario es aquel que no existe en la definición del lenguaje (no estándar), donde
el usuario (programador) es el encargado de determinar su denominación, y el conjunto de valores y
operaciones que dispondrá el mismo. En Pascal, los tipos deben ser declarados antes de ser usados. La
declaración de tipos se hace a través de la palabra clave TYPE de la siguiente forma:
Donde identificador es el nombre con que se conocerá al tipo de dato en el programa y tipo_base puede ser un
tipo estándar o alguno de los tipos de datos definidos por el usuario.
Flexibilidad: en el caso de ser necesario modificar la forma en que se representa el dato, sólo se debe
modificar una declaración en lugar de un conjunto de declaraciones de variables.
Documentación: se pueden usar como identificador de los tipos, nombres autoexplicativos, facilitando
de esta manera el entendimiento y lectura del programa.
Seguridad: se reducen los errores por uso de operaciones inadecuadas del dato a manejar, y se pueden
obtener programas más confiables.
Tipo Enumerativo: un dato enumerativo puede verse como una lista ordenada de valores posibles para las
variables del tipo. Es un tipo de dato simple.
DECLARACIÓN
Un tipo enumerativo en Pascal se declara sólo enumerando sus valores encerrándolos entre paréntesis:
Type
Identificador = (valor_1, valor_2,…, valor_n);
Los valores que se definen en la lista no pueden ser de los tipos estándar, tampoco pueden repetirse
valores entre identificadores distintos.
Las operaciones válidas sobre las variables asociadas a este tipo son la asignación y la comparación.
NO es posible realizar operaciones de entrada y salida, debido a esto estas variables son de uso interno,
que colaboran en la claridad del programa.
Como es una lista ordenada, el tipo enumerativo permite aplicar tres funciones relacionadas con el orden:
15
Algoritmos, Datos y Programas - 2010
Tipo Subrango: un tipo de dato subrango es un tipo ordinal que consiste de una sucesión de valores de un
tipo ordinal tomado como base. Es un tipo simple.
DECLARACIÓN
Se especifica indicando los valores inicial y final de la sucesión, separados por dos puntos seguidos:
Type
Identificador = valor_inicial .. valor_final;
Ventajas de los tipos subrangoFacilita el chequeo de posibles errores, pues permite que el lenguaje verifique si
los valores asignados se encuentran dentro del rango establecido.
Tipo Conjunto: un tipo de dato conjunto representará una colección de datos simples ordinales, sin
elementos repetidos y sin ningún orden interno. No es un tipo de dato simple. De la definición, se tiene que
se puede tener conjunto de enteros, caracteres, subrango ó enumerativos. La cantidad de elementos que
contiene el conjunto puede estar limitada por la implementación en cada lenguaje o sistema operativo. En
Pascal el número máximo de elementos de un conjunto es 255. El ordinal de cada elemento debe ser un
valor comprendido entre 0 y 255.
DECLARACIÓN
Type
Identificador = set of tipo_ordinal;
ASIGNACIONES
A una variable de tipo conjunto se le puede asignar valores escribiendo sus elementos consecutivamente,
encerrados entre corchetes y separados por comas, en la sección de instrucciones ejecutables.
Begin
.....
conjLetras := [„a‟, ‟b‟]; {el conj. tendrá las letras “a” y “b”}
conjLetras2 := [„a‟ .. ‟z‟]; {el conj. tendrá letras de “a” a “z”}
conjLetras3 := [ ]; {conjunto vacío}
16
Algoritmos, Datos y Programas - 2010
Intersección: se representa con el signo * y da como resultado otro conjunto. En el conjunto resultado
aparecen solamente los elementos comunes a los dos conjuntos. Ej.:
Begin
.....
conjLetras:= [„a‟ , ‟b‟] + [„j‟ , ‟k‟];
conjLetras2:= [„a‟] + [„l‟ , ‟m‟];
conjLetras3 := conjLetras * conjLetras2;
....
End;
Unión: se representa con el signo + y da como resultado otro conjunto. En este conjunto resultado
aparecen los elementos de los dos conjuntos y aquellos elementos repetidos aparecen una vez. Ej.:
Begin
.....
conjMinus:= [„a‟..‟z‟];
conjLetras:= conjMinus + [„A‟..‟Z‟];
....
End;
Diferencia: se representa con el signo - y da como resultado otro conjunto. Este conjunto resultado
contiene los elementos que están en el primer conjunto y no están en el segundo. Ej.:
Begin
....
conjLetras := [„a‟ , ‟b‟ , ‟c‟];
conjLetras2 := [„b‟ , ‟d‟ , ‟e‟];
conjLetras3 := conjLetras - conjLetras2;
....
End;
Pertenencia: se representa con el operador IN y da como resultado un valor lógico. Esta operación
devuelve verdadero si el elemento está en el conjunto y falso en caso contrario. Ej.:
Begin
....
conjLetras := [„a‟, ‟ b‟ , ‟c‟];
res = „a‟ IN conjLetras;
....
End;
17
Algoritmos, Datos y Programas - 2010
Se pueden usar los operadores relacionales para determinar si un conjunto está incluido en otro (<=), si
son distintos (<>) ó iguales (=).
Tipo String: un tipo de dato string es una sucesión (cadena) de caracteres de un largo determinado, que se
almacenan en un área contigua de la memoria. Un carácter es una letra, número ó símbolo. Cuando se
trabaja con el tipo de dato string, se tienen k caracteres tratados como una sola variable (donde k es la
longitud del string). No es un tipo de dato simple.
DECLARACIÓN
Type
Identificador = string [longitud];
En Pascal, si no se especifica la longitud ese identificador podrá contener como máximo 255 caracteres.
ASIGNACIONES
Para asignar valor a una variable de tipo de dato string se hace igual que si fuera una variable de tipo
carácter. Si se le asigna mayor cantidad de caracteres que lo declarado como longitud máxima, los últimos a
partir de esa longitud se pierden y se dice que la hilera de caracteres “se trunca”.
Program uno;
Var
cad1: string[20];
cad2: string[5];
Begin
cad1:= „buenos días!‟;
cad2:= cad1;
End.
Los strings pueden compararse con los operadores relacionales carácter por carácter: =, <>, <=, =>. Si
las cadenas que se comparan son de igual longitud y contienen los mismos símbolos, en el mismo
orden, el resultado de la operación igual (=) es verdadero. Si tienen distinta longitud el resultado de la
comparación es falso.
18
Algoritmos, Datos y Programas - 2010
TIPOS ESTRUCTURADOS
Una estructura de datos es un conjunto de variables (no necesariamente del mismo tipo) relacionadas entre sí
de diversas formas y que se puede operar como un todo, bajo un nombre único. Esto resulta útil porque permite
al programador representar los elementos del mundo real, que generalmente son más complejos. Es decir, los
tipos de datos simples tienen la “debilidad” de representar valores de datos únicos.
De acuerdo a la cantidad de valores que contienen, las estructuras de datos pueden ser:
De acuerdo a los tipos de datos que almacenan, las estructuras de datos pueden clasificarse en:
Homogénea: si los datos que la componen son todos del mismo tipo.
Heterogénea: si los datos que la componen son de distinto tipo.
De acuerdo a la cantidad de espacio de memoria utilizado por la estructura durante la ejecución del programa:
Estática: si la cantidad de elementos que contiene es fija, es decir, la cantidad de memoria que se utiliza
no varía durante la ejecución de un programa.
Dinámica: si el número de componentes y, por lo tanto, la cantidad de memoria, puede variar durante la
ejecución de un programa.
1. Los valores pueden ser de distinto tipo; esto convierte a un registro en una estructura heterogénea.
2. Los valores almacenados en un registro son llamados campos, y cada uno de ellos tiene un
identificador; los campos son nombrados individualmente, como variables ordinarias. El acceso a un
campo de un registro es directo, y se hace referenciando a su nombre.
3. El almacenamiento ocupado por un registro es fijo, así que se trata de una estructura estática.
DECLARACIÓN DE UN REGISTRO
En Pascal, los tipos registro se construyen identificando al tipo como registro y luego especificando, entre las
palabras claves record y end, el nombre y tipo de los campos individuales (pueden ser tipos estándar o
definidos por el usuario, simples, o estructurados).
Type
Nombre_registro = record
Campo_1: tipo_campo_1;
Campo_2: tipo_campo_2;
…
End;
19
Algoritmos, Datos y Programas - 2010
En Pascal, para acceder a los campos de un registro, se necesita especificar tanto el nombre del registro
como el del campo que interesa. Esto se denomina calificar al campo:
Nombre_variable_registro.nombre_campo
ANIDAMIENTO DE REGISTROS
Las variables estructuradas, como los registros, pueden estar anidadas (una dentro de otra). Es decir, un
campo de un registro puede, a su vez, ser otro registro. Para acceder, se debe hacer una doble calificación:
Nombre_variable_registro.nombre_campo.nombre_campo
Dado que los campos de un registro son variables de algún tipo de dato, las operaciones posibles sobre
un campo son las permitidas para el tipo de dato correspondiente. Es decir, las operaciones deberán
aplicarse a cada uno de los campos que lo componen. Sólo la asignación podrá realizarse sobre todo un
registro y esto será posible siempre y cuando las variables utilizadas sean del mismo tipo registro.
No pueden realizarse comparaciones entre registros completos (con ninguno de los operadores
relacionales), para saber si dos registros son iguales se debe evaluar la igualdad campo a campo
No se pueden aplicar operaciones de lectura/escritura sobre las variables de tipo registro. Pero sí es
posible leer o escribir cada uno de los campos que corresponden a tipo que soportan L/E.
SENTENCIA WITH
Cuando se trabaja con registros, hay ocasiones en que el acceso a los campos a través de la calificación suele
ser tediosa. Para solucionar este inconveniente, Pascal provee una sentencia WITH que permite que un
registro sea nombrado una vez, y luego sea accedido directamente. Ejemplo:
20
Algoritmos, Datos y Programas - 2010
Tipo Arreglo: es una colección ordenada e indexada de elementos, con las siguientes características:
1. Todos los elementos son del mismo tipo; es decir, es un tipo de dato homogéneo.
2. Los elementos pueden recuperarse en cualquier orden, simplemente indicando la posición que
ocupan dentro de la estructura, por este motivo se dice que es una estructura indexada.
3. La memoria ocupada a lo largo de la ejecución del programa es fija, es una estructura estática.
El nombre de la variable tipo arreglo está asociada a un área de memoria fija y consecutiva (del
tamaño especificado en la declaración), que es el lugar donde se almacenarán los valores.
El índice de un arreglo debe ser un tipo de dato ordinal, el cual permitirá acceder a cada elemento
del arreglo. El valor de dicho índice puede verse como el desplazamiento respecto de la posición
inicial del arreglo.
Los arreglos pueden ser de distintas dimensiones. Esta dimensión indica la cantidad de índices
necesarios para acceder a un elemento del arreglo.
El mayor inconveniente en el uso de arreglos se relaciona con que sus características estáticas
obligan, en ocasiones, a sobredimensionar la memoria requerida.
VECTORES
Un vector o arreglo lineal es un tipo de dato arreglo con un índice, es decir, con una dimensión.
En un vector, la manera de hacer referencia a alguno de sus elementos es a través del nombre del arreglo y
la posición del elemento dentro del mismo, de la forma:
Vector [posición]
Dentro de la memoria, cada celda del vector ocupa lugar en forma consecutiva a partir de la dirección inicial
de memoria asignada. La cantidad de espacio asignado al vector depende del número de celdas que el
mismo contiene y del tipo de dato que se asigna a cada una de ellas. Ej. Un vector de 5 celdas de enteros (2
bytes) ocupará 5 x 2 = 10 bytes.
21
Algoritmos, Datos y Programas - 2010
DECLARACIÓN DE UN VECTOR
La declaración debe contener tanto el tipo de elemento que contendrá el arreglo como el rango de valores
que puede tomar el índice, lo que define además la cantidad de elementos que componen la estructura:
Type
nombre_tipo_vector = array [indice] of tipo_de_dato;
La dimensión lógica es la dimensión efectiva del vector, esto es la cantidad de celdas que realmente se
utilizan, la cantidad de elementos que existen en el vector. Siempre debe ser menor o igual a la dimensión
física del vector.
Esto resulta útil a la hora de agregar o insertar elementos en el vector, ya que debe verificarse que exista
espacio suficiente en el mismo, es decir, debe verificarse que dim.Log < dim.Fis
22
Algoritmos, Datos y Programas - 2010
INSERTAR (INSERT )
BORRAR
23
Algoritmos, Datos y Programas - 2010
BÚSQUEDA
El proceso de ubicar información particular en una colección de datos es conocido como método de
búsqueda. En todos los casos los métodos de búsqueda consisten en buscar un dato que tiene una
propiedad particular, y en caso de encontrarlo retornar alguna información relacionada con el ítem.
Considerando la siguiente declaración genérica:
Const
Maxlen = … {máxima longitud del vector, es decir, Dim. Física }
Type
TipoElem = … { tipo de dato de los elementos del vector }
Indice = 0..maxlen;
Tvector = array [1..maxlen] of TipoElem;
Búsqueda Lineal (o secuencial): se aplica cuando se debe buscar un elemento dentro de un vector sin tener
información sobre la manera en que este se encuentra organizado. Se procede linealmente (en forma
secuencial) comenzando desde el principio de la estructura, analizando los elementos uno a uno hasta
encontrarlo o hasta llegar al final.
El siguiente algoritmo busca el elemento x en el vector (pasado por referencia) y retorna la posición tan
pronto como sea posible, es decir, no sigue recorriendo el vector una vez que ya encontró el elemento. Si x
no es ningún elemento del vector, se retorna 0.
En el siguiente algoritmo se comienza agregando el elemento buscado (x) al final del vector (previamente
hay que verificar que dimLog < dim. Física), de forma tal que se reduzca la cantidad de preguntas de cada
iteración a la mitad (la condición si el elemento existe no se hace porque el dato ahora seguro existe). Este
ítem agregado al final del vector se conoce como “centinela” y es quien evita que el bucle sea infinito.
24
Algoritmos, Datos y Programas - 2010
Búsqueda Binaria: se aplica sobre vectores ordenados basándose en la estrategia “divide y vencerás”.
i. Se compara el ítem buscado con el que se halla en el medio del vector.
iii. Si el elemento buscado es menor que el que se halla en el punto medio del vector, se continúa la
búsqueda en la primera mitad del vector ignorando el otro 50% de los datos, caso contrario sobre la
segunda mitad. Se continúa así, restringiendo el análisis a porciones más pequeñas del vector.
iv. El proceso termina cuando se encuentra el elemento buscado (cuando coincida con un punto medio)
o cuando la porción del vector sea tan pequeña que ya no contenga elementos, en cuyo caso se
puede concluir que el elemento buscado no pertenece al vector.
Se aplica cuando los elementos tienen orden. Caso contrario debería ordenarse el vector previamente.
El número medio de comparaciones es (1+log2 (dimLog+1) ) /2.
Cuando dimLog crece el número medio de comparaciones es log2 (dimLog+1)/2.
25
Algoritmos, Datos y Programas - 2010
ORDENACIÓN
Al proceso por el cual un grupo de elementos puede ser ordenado se lo conoce como algoritmo de
ordenación. Son útiles porque la organización de la información en un vector permite realizar búsquedas
más eficientes. Los algoritmos de ordenación buscan intercambiar los elementos o llevarlos al lugar
adecuado de manera de dejar la estructura ordenada. Considerando la siguiente declaración genérica:
Const
Maxlen = … {máxima longitud del vector, es decir, Dim. Física }
Type
TipoElem = … { tipo de dato de los elementos del vector }
Indice = 0..maxlen;
Tvector = array [1..maxlen] of TipoElem;
Método de Selección: es el más sencillo, busca el elemento menor según el criterio adoptado y lo ubica al
comienzo, intercambiándolo con el primero (v[1]), a continuación se busca el segundo elemento menor del
vector y se intercambia con v[2] y así sucesivamente. Para ordenar un vector completo es necesario realizar
dimLog-1 pasadas por el vector, luego de eso el elemento más grande queda acomodado automáticamente.
Funcionamiento:
3 5 2 1
Paso 1: se intercambia v[1] con v[4]
1 5 2 3
Paso 2: se intercambia v[2] con v[3]
1 2 5 3
Paso 3: se intercambia v[3] con v[4]
1 2 3 5
26
Algoritmos, Datos y Programas - 2010
Método de Intercambio (o Burbujeo): similar al de selección, realiza dimLog -1 pasadas, pero no mueve
ítems grandes distancias sino que a lo sumo 1 distancia, esto es porque se comparan ítems adyacentes y se
los intercambia si están desordenados. Al fin de cada pasada el mayor viaja en forma de “burbuja” y queda
al fondo del vector (no es necesario re - compararlo).
Funcionamiento:
Pasada 1
3 5 2 1
3 5 2 1
3 2 5 1
Pasada 2
3 2 1 5
2 3 1 5
Pasada 3
2 1 3 5
1 2 3 5
27
Algoritmos, Datos y Programas - 2010
Método de Intercambio con centinela: utiliza una variable lógica o centinela para corregir el problema del
algoritmo anterior que, a pesar de no haber cambios, los elementos del vector se siguen comparando hasta
terminar realizando un trabajo innecesario. De esta manera, en caso de no producirse ningun cambio, se
termina el proceso. Pese a esto no es de lo más eficiente.
Método de Inserción: este método ordena el vector de entrada insertando cada elemento v[i] entre los i-1
anteriores que ya están ordenados. Para esto comienza a partir del segundo elemento, suponiendo que el
primero ya está ordenado. Si los dos primeros elementos están desordenados los intercambia. Luego toma
el tercer elemento y busca su posición correcta con respecto a los dos primeros. En general para el elemento
i, busca su posición con respecto a los i-1 elementos anteriores y de ser necesario lo inserta adecuadamente.
28
Algoritmos, Datos y Programas - 2010
Funcionamiento:
Pasada 1
3 5 2 1
v[1] ordenado
Pasada 2
2 3 5 1
v[1]…v[3] ordenado
Pasada 3
1 2 3 5
v[1]…v[4] ordenado
29
Algoritmos, Datos y Programas - 2010
MATRICES
Una matriz es un tipo de dato arreglo con dos dimensiones o índices. También puede pensarse en ella como
un vector de vectores. Es un grupo de elementos homogéneo, con un orden interno y en el que se necesitan
dos índices para referenciar un único elemento de la estructura
En una matriz, la manera de referenciar a alguno de sus elementos es a través del nombre del arreglo y dos
valores de índice que indiquen la posición en fila y columna del elemento dentro del mismo, de la forma:
Cada celda de la matriz ocupa posiciones consecutivas de memoria, a partir de la dirección inicial asignada.
Por Ej., una matriz de 3x6 donde cada elemento ocupa 4 bytes, ocupará en total 3 x 6 x 4 = 72 bytes.
La declaración debe contener tanto el tipo de elemento que contendrá el arreglo como el rango de valores
que puede tomar el índice, lo que define además la cantidad de elementos que componen la estructura:
Type
nombre_tipo_matriz = array [índice_fila, índice_columna] of tipo_dato;
donde fila y columna deben ser un valor literal o una variable (en ambos casos debe corresponderse
con el tipo de índice definido para la matriz) y valor debe ser un valor literal o una variable del tipo de
dato que almacena la matriz.
30
Algoritmos, Datos y Programas - 2010
ARREGLOS N-DIMENSIONALES
La cantidad de dimensiones permitidas para un arreglo está acotada por el lenguaje de programaciñon y ,
básicamente por el espacio que la estructura ocupa en la memoria. Los arreglos siempre se definen
utilizando la misma metodolodia, sólo hay diferencia en la definición de las dimensiones. Un arreglo de tres
dimensiones recibe el nombre de tensor. Los índices de cada dimensión están determinados por sub-rangos
de tipo de dato entero.Una matriz es un tipo de dato arreglo con dos dimensiones o índices. También puede
pensarse en ella como un vector de vectores. Es un grupo de elementos homogéneo, con un orden interno y
en el que se necesitan dos índices para referenciar un único elemento de la estructura
DECLARACIÓN
Type
nombre_tipo_arreglo_ndim = array [índice1, índice2, …, indiceN] of
tipo_dato;
donde cada índice es un subrango de algún tipo ordinal y tipo_dato es el tipo de dato de los elementos
del arreglo, y una vez definido se pueden declarar variables del mismo.
Un arreglo puede ser enviado como parámetro a un módulo o puede recibirse como respuesta de un
determinado proceso. Un módulo que necesita información contenida en un arreglo solo como dato de
entrada, recibirá el parámetro por valor, mientras que necesitará recibirlo por referencia si debe retornar el
arreglo modificado. Pero, desde el punto de vista de la eficiencia en la utilización de recursos no siempre es
aconsejable que las estructuras de datos arreglo sean enviadas como parámetros por valor, porque el
contenido de la variable que se envía es copiado sobre la variable del módulo que recibe el dato y de esta
forma la memoria de la computadora está simultáneamente ocupada por dos variables distintas con los
mismos valores. De acuerdo a esto, no siempre es conveniente enviar a un módulo un tipo de dato arreglo
como parámetro por valor. En los casos en que la duplicación de memoria sea importante (no despreciable)
conviene utilizar un parámetro por referencia, obviamente tomando los recaudos para no modificar el
arreglo dentro del módulo invocado, ya que esto tendría un efecto lateral (side effect) sobre los datos.
31
Algoritmos, Datos y Programas - 2010
ALOCACIÓN DE MEMORIA
Existen dos tipos de alocación de memoria:
Las estructuras estáticas se caracterizan porque el espacio de memoria se reserva con anticipación en la
memoria física de la computadora y no cambia durante la ejecución del programa (ó módulo, en caso de ser
variables locales al mismo).
Char = 1byte
Integer = 2 bytes
Real = 6 bytes
Boolean = 1 byte
String = cantidad de caracteres + 1
Registro = la suma de lo que ocupa c/ campo
Puntero = 4 bytes
Esto permite una comprobación de tipos en tiempo de compilación pero tiene como inconveniente la
rigidez, ya que las estructuras estáticas no pueden crecer o decrecer durante la ejecución del programa. Es
decir, se presentan problemas:
Las estructuras dinámicas se caracterizan por permitir que la reserva de memoria se realice en tiempo de
ejecución. De esta forma se puede reservar y liberar posiciones de memoria según sea necesario durante la
ejecución del programa.
32
Algoritmos, Datos y Programas - 2010
Tipo Puntero: es un tipo de variable usada para almacenar la dirección en memoria de otra variable, en
lugar de un dato convencional. Mediante la variable de tipo puntero se accede a esa otra variable,
almacenada en la dirección de memoria que señala el puntero. Es decir, el valor de la variable de tipo
puntero es una dirección de memoria. Se dice que el puntero apunta o señala a la variable almacenada en la
dirección de memoria que contiene el puntero. Lo que interesa es el dato contenido en esa variable
apuntada. No hay que confundir la variable apuntada con el puntero.
Los punteros pueden apuntar solamente a variables dinámicas, es decir, a datos que están almacenados en
memoria dinámica (heap). Cada variable de tipo puntero puede apuntar a un único tipo de dato.
Una variable de tipo puntero se indica con ^ y ocupa 4 byte de memoria (stack) para su representación
interna en Pascal.
DECLARACIÓN DE UN PUNTERO
Una variable de tipo puntero ocupa una cantidad de memoria fija (4 bytes), independiente del tipo de dato
al que apunta. Un dato referenciado o apuntado, no tienen memoria asignada, o lo que es lo mismo no
existe inicialmente espacio reservado en memoria para este dato. Para poder emplear variables dinámicas
es necesario emplear un tipo de dato que permita referenciar nuevas posiciones de memoria que no han
sido declaradas a priori y que se van a crear y destruir en tiempo de ejecución.
En Pascal la creación y destrucción de variables dinámicas se realiza mediante los siguientes procedimientos:
new(var_tipo_puntero)
Adquiere la memoria necesaria para una variable dinámica.
Retorna la dirección de memoria en donde se guarda el dato del tipo apuntado. Es decir, el valor de la
variable de tipo puntero será una dirección de memoria.
dispose(var_tipo_puntero)
Libera la memoria adquirida mediante el new().
Luego de liberar la memoria apuntada por el puntero, deja dicho puntero indefinido.
p:= q
(p y q deben ser del mismo tipo. Luego de la asignación p y p apuntan al mismo dato).
p:=nil
33
Algoritmos, Datos y Programas - 2010
p^:= 30;
(a lo que apunta el puntero p, se le asigna el valor 30)
p^:= q^
(punteros distintos apuntarán a objetos iguales, es decir, lo que apunta p tendrá el mismo valor de lo que
apunta q)
COMPARACIÓN
(p = q), (p <> q)
(se comparan, mediante relacionales, las direcciones de memoria)
ENTRADA/SALIDA
No se pueden leer y escribir punteros, pero sí es posible leer y escribir los objetos que ellos referencian
(dependiendo del tipo apuntado): writeln (p^);
Tipo Lista: una lista enlazada es una colección de elementos homogéneos, con una relación lineal que los
vincula, es decir, que cada elemento tiene un predecesor (salvo el primero) y un sucesor (excepto el último).
Los elementos que componen una lista son los nodos (donde cada nodo está representado por un registro) y
tales elementos no ocupan posiciones secuenciales o contiguas de memoria. Es decir pueden aparecer
dispersos en la memoria, pero mantienen un orden lógico interno. Los nodos se conectan por medio de
enlaces o punteros. Cuando se necesita espacio adicional, nuevos nodos pueden ser alocados y agregados a
la estructura (con un New) y cuando existen nodos que ya no se necesitan, pueden ser borrados, liberando
memoria (con Dispose).
Es decir, una lista enlazada es una estructura dinámica, que permiten definir una estructura sin conocer a
priori la cantidad de datos a almacenar; liberando o reservando memoria según sea conveniente.
Type
lista= ^nodo; {notar la naturaleza recursiva de
nodo= record la definición de una lista }
dato: tipo_dato;
sig: lista;
End;
Var
pri: lista; {memoria estática reservada}
34
Algoritmos, Datos y Programas - 2010
Para saber dónde está el primer elemento de una lista, se guarda en una celda de memoria la dirección del
primer nodo. Esta celda apunta al principio de la lista y suele llamarse puntero inicial. Si se quiere leer la
lista, se comienza en la posición indicada por ese puntero y se halla el primer dato junto con un puntero al
siguiente nodo. Si se sigue ese puntero, se halla el segundo dato y así sucesivamente hasta el final de la lista.
Para detectar el final de la lista, se utiliza un puntero nulo (nil) que indica que no hay más nodos en la lista.
35
Algoritmos, Datos y Programas - 2010
INSERTAR ORDENADO
BORRAR UN ELEMENTO
36
Algoritmos, Datos y Programas - 2010
37
Algoritmos, Datos y Programas - 2010
38
Algoritmos, Datos y Programas - 2010
Espacio: se refiere a la cantidad de memoria consumida por una estructura de datos dada.
En las Listas el acceso es secuencial, el tiempo para acceder a un ítem es proporcional a su posición en la
lista (porque cada nodo contiene la dirección del próximo). Es decir, el tiempo para localizar un ítem no es
constante en una lista.
En los arreglos, en cambio, el acceso es directo gracias a la variable índice. El tiempo para localizar un ítem
es siempre el mismo ya que:
39
Algoritmos, Datos y Programas - 2010
LISTAS CIRCULARES
Las listas circulares presentan la particularidad de que el último elemento de la lista en lugar de almacenar
un puntero nulo (nil), apunta al principio de la lista.
Luego, las listas circulares presenta la ventaja, respecto de las listas simples, que cada nodo de la lista es
accesible desde cualquier otro nodo de ella. Sin embargo, esto puede producir bucles o lazos infinitos
(porque ahora no habrá nodo que apunte a nil).
40
Algoritmos, Datos y Programas - 2010
VENTAJAS: pueden recorrerse de dos formas, ya sea para efectuar una operación con cada elemento o para
insertar/actualizar y borrar. No se utiliza espacio extra...
INCONVENIENTE: ocupan más memoria por nodo que una lista simple…
DECLARACIÓN
type
lista = ^nodo;
nodo = record
sig1: lista;
dato: ...;
sig2: lista;
end;
listadoble= record
orden1: lista;
orden2: lista;
end;
var
ld: listadoble;
41
Algoritmos, Datos y Programas - 2010
type
alumno = record
apellido: string[30];
numero: integer;
dni: string[12];
end;
lista = ^nodo;
nodo = record
dato: alumno;
sig_ape: lista;
sig_num: lista;
end;
lista_doble = record
pri_ape: lista;
pri_num: lista;
end;
42
Algoritmos, Datos y Programas - 2010
43
Algoritmos, Datos y Programas - 2010
VENTAJAS: pueden recorrerse de dos formas, ya sea para efectuar una operación con cada elemento o para
insertar/actualizar y borrar.
INCONVENIENTE: ocupan más memoria por nodo que una lista simple.
DECLARACIÓN
type
puntero = ^nodo;
nodo = record
ant: puntero;
info: .....;
sig: puntero;
end;
listaDoble = record
pri: puntero;
ult: puntero;
end;
var
l : listaDoble;
44
Algoritmos, Datos y Programas - 2010
VENTAJAS: pueden recorrerse siguiendo diferentes enlaces, lo que permite vistas diferentes de la misma
información.
45
Algoritmos, Datos y Programas - 2010
MERGE DE LISTAS
EJEMPLO 1: Se tienen dos listas creadas de manera ordenada. Se implementa un algoritmo que combina
ambas listas y genera una tercera lista ordenada. Ambas listas están ordenadas por el mismo criterio. La lista
nueva también es generada ordenada por el mismo criterio.
…
begin
crearListaOrdenada (l1);
crearListaordenada (l2);
l3:= nil;
merge (l1, l2, l3);
end.
46
Algoritmos, Datos y Programas - 2010
EJEMPLO 2: Se disponen de dos listas que contienen información de las ventas realizadas por c/u de las 2
sucursales de un supermercado. De cada venta se conoce: el código de producto y la cantidad vendida.
Se realiza un módulo que procesa los datos (recorriendo solo una vez las listas) y genera una nueva lista
ordenada por cod. de producto que contiene cada producto vendido y la cantidad total vendida.
type
venta = record
cod_pro: integer;
cant_vend: integer;
end;
lis_ventas = ^nodo_ven;
nodo_ven = record
ven: venta;
sig: lis_ventas;
end;
lis_totales = ^nodo_tot;
nodo_tot = record
cod_prod: integer;
cant_tot: real;
sig: lis_totales;
end;
47
Algoritmos, Datos y Programas - 2010
48