Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clase Vectores
Clase Vectores
Material de Estudio
Normalmente, utilizamos VARIABLES para almacenar (en memoria RAM) la informacin que un programa
procesa. Por ejemplo: El CODIGO de un alumno, el NOMBRE, etc. y de acuerdo con esto podemos escribir un
algoritmo que LEA y muestre el cdigo y nombre de un alumno, as:
ALUMNOS
ESCRIBA ( ***** Captura de datos del Estudiante ***** )
ESCRIBA ( Digite Cdigo del Alumno );Lea(CODIGO)
ESCRIBA ( Digite Nombre del alumno ); Lea(NOMBRE)
ESCRIBA ( ****** Ahora Mostrar un INFORME de datos ledos ***** )
ESCRIBA ( Cdigo : , CODIGO)
ESCRIBA ( Nombre : , NOMBRE)
FIN ALGORITMO ALUMNOS
Observe bien el anterior algoritmo, fjese que UNICAMENTE podemos introducir y mostrar la informacin de UN alumno a la vez.
Pero la realidad es otra, es decir, se requiere procesar la informacin de VARIOS alumnos, por ejemplo, en el
curso de estructuras de datos hay matriculados aproximadamente 15 estudiantes en cada grupo. Que pasara si
quisiramos introducir los CODIGOS y NOMBRES de TODOS los alumnos?. Podramos pensar en re-escribir el
anterior algoritmo utilizando entonces un CICLO REPETITIVO (Remtase a la leccin: FUNDAMENTOS DE
ALGORITMOS Y PROGRAMACIN ESTRUCTURADA ), por ejemplo, un ciclo PARA (Hacer Hasta) as:
ALUMNOS_VERSION2.0
ESCRIBA ( **** Captura de datos del Estudiante ***** )
PARA I 1 Hasta 15 Haga
ESCRIBA ( Digite Cdigo del Alumno ); Lea(CODIGO)
ESCRIBA ( Digite Nombre del alumno ); Lea(NOMBRE)
ESCRIBA ( **** Ahora Mostrar un INFORME de datos ledos **** )
ESCRIBA ( Cdigo : , CODIGO)
ESCRIBA ( Nombre : , NOMBRE)
FPARA
FIN ALGORITMO ALUMNOS
Este algoritmo evidentemente procesa la informacin de los 15 alumnos pero tiene una falla, y es que al final del
proceso ( por fuera del ciclo PARA) no podramos hacer un informe que incluya los CODIGOS y NOMBRES de
TODOS los alumnos cuya informacin se proces, ya que cuando digitemos el CODIGO y el NOMBRE del segundo
alumno entonces esta nueva informacin SOBREESCRIBE a la primera, y al escribir la del tercer alumno se
SOBREESCRIBE la del segundo y as sucesivamente, es decir, se BORRA el CODIGO y el NOMBRE del anterior
estudiante; La razn: Dos datos NO pueden convivir simultneamente en la misma posicin de memoria, es decir,
NO podemos resolver el problema con el enfoque que hemos planteado. Entonces, la solucin es: NO UTILIZAR
VARIABLES SIMPLES, sino una ESTRUCTURA DE DATOS para cada dato del alumno, esa ESTRUCTURA DE DATOS es un
VECTOR
Una estructura de datos es una organizacin de informacin dispuestos de manera lgica y coherente, de tal
manera que se facilite el acceso a los datos que contiene.
Segn el dispositivo de almacenamiento, las Estructuras de Datos se clasifican en: ESTRUCTURAS EN MEMORIA
PRINCIPAL y ESTRUCTURAS EN DISCO DURO. Por su parte, las Estructuras en Memoria RAM pueden clasificarse
en dos grupos: ESTATICAS y DINAMICAS.
El trmino ESTATICA hace referencia a que una vez se halla definido el tamao de la estructura de datos este NO
puede ser cambiado mientras se est ejecutando el programa (No se puede Ampliar Ni tampoco Reducir ).
VECTOR DE DATOS: Es una estructura esttica que consiste en un conjunto de elementos que satisfacen lo
siguiente:
QUE ES DIMENSIONAR UN VECTOR ? es una accin que consiste en RESERVAR el tamao que el vector ocupar
en memoria, es decir, cual es la cantidad MAXIMA de elementos que tendr el vector. Esta cantidad MAXIMA de
elementos la deducimos segn el problema que estemos resolviendo; por ejemplo: Si deseo almacenar los
CODIGOS de todos los alumnos de la clase y son aproximadamente 15 alumnos entonces lo aconsejable
es reservar en memoria (Dimensionar) espacio para un poco mas de esos elementos, digamos 20, es
decir, un poco por encima de la cantidad de alumnos que hay pero sin exceso. Para ello, simplemente
escribiremos en los algoritmos la siguiente sentencia:
Dimensionar CODIGOS[20] de Enteros Largos
Dimensionar NOMBRES[20] de Cadenas de caracteres [50] cada una
TODOS LOS ELEMENTOS SON DE IGUAL TIPO: Es algo obvio, puesto que cada TIPO de datos ocupa, como
hemos dicho en clase, cierto numero de bytes, entonces, NO ES POSIBLE mezclar distintos tipos de datos en un
vector: O todos son enteros cortos todos son caracteres, todos son enteros largos, todos son decimales, etc.
LOS ELEMENTOS SE ALMACENAN EN POSICIONES CONSECUTIVAS DE RAM: Puesto que el sistema hace la
reserva de memoria para el vector o la matriz como un solo bloque de bytes, entonces los elementos se guardan
en el vector o matriz uno a continuacin de otro.
Var
Vector : Array [1 .. Max] OF Tipo_dato ;
Donde Tipo_dato corresponde a uno de los definidos en PASCAL ( integer, char, string, double),
MAX es la cantidad mxima de datos que se almacenaran en el vector (Obligatoriamente debe ser EL
NOMBRE DE UNA CONSTANTE o en su defecto un VALOR).
Observe que el vector NOMBRES se est declarando de tamao 20 (mximo almacenar 20 nombres)
y va acompaado de un corchete y un tamao de 80; esto significa que, a su vez, cada nombre tendr
Mximo 80 caracteres.
Grficamente podemos representar estos dos vectores como sigue:
CODIGOS
1
2000015
NOMBRES
1
MATEO BARRIOS
2000
2
2000020
2000032
20
20
FIN LLENAR_DATOS
Podemos tambin utilizar otra estructura repetitiva y otro estilo de captura de informacin que NO
implique conocer de antemano cuantos elementos se introducirn al vector sino que vamos validando
uno a uno la cantidad de datos que se van introduciendo, con lo cual tendremos otra VERSION del
mismo algoritmo, como se ilustra a continuacin.
LLENAR_DATOS(2.0)
NEL 0 ; Mas S
MQ (Mas = S ) and (NEL <= 20)
ESCRIBA ( **** Captura de datos del Estudiante **** )
NEL NEL + 1
ESCRIBA ( Digite Cdigo del Alumno ); Lea ( CODIGO [NEL] )
ESCRIBA ( Digite Nombre del alumno ); Lea( NOMBRE [NEL] )
ESCRIBA ( Desea seguir Introduciendo Informacin de Alumnos ? ); Lea(MAS)
FIN MQ
SI (NEL > 20) Ent
ESCRIBA ( ERROR, Ya los vectores estn llenos, no caben mas elementos )
SINO
ESCRIBA ( OK. Se capturaron los datos de los alumnos correctamente . )
FIN SI
FIN LLENAR_DATOS2.0
Por supuesto, puedo utilizar la TERCERA estructura de control repetitiva de la Programacin
Estructurada y obtener una versin 3.0 del mismo algoritmo, tal y como se ilustra a continuacin
LLENAR_DATOS(3.0)
NEL 1 ;
REPITA (Mas = S ) and (NEL <= 20)
ESCRIBA ( **** Captura de datos del Estudiante ***** )
ESCRIBA ( Digite Cdigo del Alumno ); Lea( CODIGO [NEL] )
ESCRIBA ( Digite Nombre del alumno ); Lea( NOMBRE [NEL] )
NEL NEL + 1
ESCRIBA ( Desea seguir Introduciendo Informacin de Alumnos ? ); Lea(MAS)
FIN LLENAR_DATOS3.0
Ahora bien, como hemos notado, por lo general las tareas sobre un vector requieren de un ciclo
repetitivo que vaya desde 1 hasta NEL para ir procesando los datos del vector. As, por ejemplo, si nos
piden un INFORME de alumnos que incluya CODIGO y NOMBRE de estos, podemos recorrer los dos
vectores e ir escribiendo en pantalla los datos de cada posicin de cada vector, as:
INFORME_DE_ALUMNOS
ESCRIBA(****** DATOS DE LOS ESTUDIANTES * ***** )
PARA I 1 HASTA NEL Haga
ESCRIBA ( CODIGO [I] , NOMBRE [I] )
FIN PARA
FIN LLENAR_DATOS
AGREGAR_DATOS
Mas S
MQ (Mas = S ) AND (NEL < 20)
ESCRIBA ( **** Agrega datos del Estudiante **** )
SI NEL < 20 ENT
ESCRIBA ( Digite Cdigo del Alumno ); Lea ( CODIGO [NEL+1] )
ESCRIBA ( Digite Nombre del alumno ); Lea( NOMBRE [NEL+1] )
NEL NEL + 1
SINO
ESCRIBA ( Los vectores estn llenos, No se admiten mas alumnos . );
FSI
ESCRIBA ( Desea seguir Introduciendo Informacin de Alumnos ? ); Lea(MAS)
FIN MQ
FIN AGREGAR_DATOS
CONSULTAR_DATOS
REPITA
ESCRIBA ( **** CONSULTA INFORMACION DE ESTUDIANTES **** )
ESCRIBA ( CODIGO A CONSULTAR ?? ); LEA (CC)
Encontro N
PARA I 1 Hasta NEL haga
SI CC = CODIGOS [ I ]
ENT
HASTA (MAS = N )
FIN CONSULTAR_DATOS
Ahora, si NO deseamos recorrer completamente el vector sino que estamos interesados en que una vez
que lo encuentre lo muestre y termine la bsqueda (Por ejemplo, si estamos seguros de que el dato NO
se repite en el vector), entonces podemos escribir otra versin de este algoritmo que INTERRUMPA el
ciclo repetitivo en cuanto encuentre el elemento que se busca en el vector.
Este algoritmo se muestra en la siguiente pgina ..
CONSULTAR_DATOS
Ver 2.0
REPITA
ESCRIBA ( **** CONSULTA INFORMACION DE ESTUDIANTES **** )
ESCRIBA ( CODIGO A CONSULTAR ?? ); LEA (CC)
Encontro N ; I 1
MQ ( I <= NEL) AND ( Encontro = N ) haga
SI CC = CODIGOS [ I ]
ENT
HASTA (MAS = N )
FIN CONSULTAR_DATOS Ver 2.0
FMQ
FIN BORRAR_DATOS (Versin 1.0)
FMQ
FIN BORRAR_DATOS (Versin 2.0)
POR SUPUESTO QUE HAY MUCHAS MAS TAREAS QUE PODEMOS DESARROLLAR SOBRE
ESTE PAR DE VECTORES, pero vamos a dejarlo hasta aqu.
9
Ahora REPASEMOS como es que se puede integrar e un solo programa varias
subrutinas y enlazarlas mediante un programa principal.
Si quisiramos elaborar UN SOLO PROGRAMA para esta aplicacin pensaramos en una
solucin como la siguiente:
SUBRUTINA LLENAR_DATOS
FIN LLENAR_DATOS
SUBRUTINA INFORME
FIN INFORME
SUBRUTINA CONSULTA_ALUMNO
FIN CONSULTA
SUBRUTINA AGREGAR_ALUMNO
FIN AGREGAR_ALUMNO
SUBRUTINA ACTUALIZAR_DATOS
FIN ACTUALIZAR
SUBRUTINA BORRAR_DATOS
FIN BORRAR_DATOS
PROGRAMA PRINCIPAL
REPITA
ESCRIBA( #### GESTION INFORMACION DE ALUMNOS #### )
ESCRIBA(
MENU PRINCIPAL )
ESCRIBA( 1.- CAPTURA DATOS DE ALUMNOS
)
ESCRIBA( 2.- INFORME DE ALUMNOS
)
ESCRIBA( 3.- AGREGAR DATOS DE ALUMNOS
)
ESCRIBA( 4.- CONSULTAR INFO. DE ALUMNOS )
ESCRIBA( 5.- ACTUALIZAR DATOS DE ALUMNOS )
ESCRIBA( 6.- BORRAR DATOS DE ALUMNOS
)
ESCRIBA( 7.- TERMINAR )
ESCRIBA( DIGITE OPCIN >>>>>> ); LEA(OP)
DD OP Haga
1 : LLENAR_DATOS;
2 : INFORME;
3 : AGREGAR_ALUMNO;
4 : CONSULTAR_ALUMNO;
5 : ACTUALIZAR_DATOS;
6: BORRAR_DATOS;
FIN DD
HASTA (OP = 7)
FIN PROGRAMA_PRINCIPAL
10
Ahora bien, lo anterior es la parte ALGORITMICA de la solucin. En cuanto a la forma de
INTEGRAR varias subrutinas en un solo programa PASCAL lo explico a continuacin:
PROGRAM xxxxx;
USES
Wincrt;
CONST
VAR
BEGIN (* Inicio del Programa Principal *)
Aqu van las sentencias del programa .;
END
PROCEDIMIENTOS : Son mdulos del programa que pueden tener su propio conjunto
de variables (e denominan variables LOCALES) y que tienen la particularidad de NO devolver
ningn resultado a quien los invoca. Para escribir esta clase de subrutinas utilizamos la
siguiente sintaxis:
PROCEDURE Nombre_de_procedimiento;
Var
Xxx;
Xxx;
Begin
Sentencia;
Sentencia;
.
.
End; (* fin del procedimiento *)
FUNCIONES :
Pues bien, segn lo anterior, utilizando PROCEDURES, la codificacin del programa fuente en
PASCAL para implementar la solucin algortmica de la pgina 9 de este documento sera la
siguiente:
11
PROGRAM xxxxx;
USES
Wincrt;
CONST
VAR
CODIGOS : ARRAY [1..20] OF Longint;
NOMBRES : ARRAY [1..20] OF String[60];
NEL
: INTEGER;
(* y todas la dems variables que usted requiera declarar GLOBALMENTE *)
PROCEDURE INFORME;
BEGIN
Sentencias;
Sentencias;
END; (* Fin del INFORME *)
PROCEDURE AGREGAR_ALUMNO;
BEGIN
Sentencias;
Sentencias;
END; (* Fin del procedure AGREGAR_ALUMNO *)
PROCEDURE CONSULTAR_ALUMNO;
BEGIN
Sentencias;
Sentencias;
END; (* Fin del procedure CONSULTAR_ALUMNO *)
PROCEDURE ACTUALIZAR_DATOS;
BEGIN
Sentencias;
Sentencias;
END; (* Fin del procedure ACTUALIZAR_DATOS *)
PROCEDURE BORRAR_DATOS;
BEGIN
Sentencias;
Sentencias;
END; (* Fin del procedure BORRAR_DATOS *)
12
La sentencia PASCAL para codificar la Estructura DD (Dependiendo de ..) que se detall en el
documento: Fundamentos de Programacin, es la instruccin CASE.