Professional Documents
Culture Documents
AyE Vectores
VECTORES
1 Introduccin
Hasta ahora hemos utilizado en nuestros ejercicios variables simples, es decir objetos que representan valores que
sern conocidos o calculados durante la ejecucin del programa. Una variable solo puede contener un valor cada vez y
se la asocia con una casilla de la memoria, de tal modo que si necesitamos representar varios valores usamos varias
variables.
Sin embargo, hay problemas en los cuales las variables simples no son de gran utilidad, esto sucede cuando tenemos
que guardar muchos valores del mismo tipo al mismo tiempo, por ejemplo, los legajos de todos los alumnos de un curso
o los sueldos de todos los empleados de una empresa. La solucin en estos casos est en utilizar una variable de tipo
estructurado donde se pueda almacenar una considerable cantidad de valores de igual tipo y adems cada uno de los
valores pueda ser accedido fcilmente.
La estructura adecuada en estos casos es el arreglo de una dimensin, tambin conocido con el nombre de vector. Un
vector es una estructura de datos, est compuesto por muchos elementos todos del mismo tipo, es as que nos referimos
a un vector de enteros o un vector de caracteres o a un vector de reales, los elementos de un vector son variables que
ocupan posiciones contiguas de memoria.
El vector debe tener un nombre (por ejemplo vec) que representa al conjunto de todos los elementos, los elementos se
diferencian entre s por la posicin que ocupan en el vector, el primero por lo general es vec [1], el segundo vec[2], el
tercero vec[3], etc.
El nmero encerrado entre corchetes y que sirve para identificar un elemento, se llama ndice o subndice, para
referirnos a un elemento concreto de un vector debemos utilizar el nombre del vector y la posicin (subndice) que ocupa
dentro de la estructura.
Para trabajar con vectores es necesario conocer de antemano cuntos elementos va a contener, es decir cuntos
valores vamos a guardar en l, porque esa cantidad se usa para reservar el lugar que ocupar el vector en la memoria
(recuerde que cada elemento ocupa una casilla de memoria y que stas estarn una al lado de otra).
El procesamiento de todos los componentes del vector requiere el uso de un ciclo en el que una variable toma
sucesivamente valores en el rango del vector.
El vector es una estructura de datos esttica, su tamao (cantidad de elementos) debe ser fijado por el programador y no
vara durante la ejecucin del programa.
2 Uso de vectores
1
En todos los problemas el ingreso de datos se har por teclado, queda a cargo del alumno la modificacin para el caso que los datos
se ingresen desde un archivo.
AyE Vectores
ESTRATEGIA
C
Inicializar sumador y contador
Hallar promedio
Comparar cada uno de los valores con el promedio para contar los mayores
Informar el resultado
F
ALGORITMO
C
sum
cont
1..100
vec [ j ]
sum
sum + vec [ j ]
prom
sum / 100
j 1 .. 100
vec[ j ] > prom
cont
cont + 1
cont
AyE Vectores
ESTRATEGIA
C
Ingresar los valores en un vector
Mostrar el contenido del vector en orden inverso
F
ALGORITMO
C
j
1 .. 50
vec [ j ]
50 .. 1
vec [ j ]
2.3 Ingresar un nmero N que indica la cantidad de empleados de una empresa. Ingresar a continuacin el nmero de
legajo y el sueldo de cada uno de los N empleados. Informar cul es el importe del mayor sueldo y luego listar los
nmeros de legajo de los empleados que cobran ese importe.
Nota: en la empresa no hay ms de 200 empleados.
En este problema se necesitan dos vectores para guardar los datos: uno para los legajos y otro para los sueldos. Estos
vectores se denominan vectores paralelos porque el legajo y el sueldo de un mismo empleado estn en la misma
posicin (igual subndice) en cada uno de ellos. Aqu tambin la informacin debe ser procesada dos veces, primero hay
que conocer todos los sueldos para determinar el mximo y luego hay que revisar todos los sueldos para listar los que
coinciden con el valor hallado.
Para hallar el sueldo mximo se utiliza una funcin.
AyE Vectores
ESTRATEGIA
C
Ingresar la cantidad de empleados
F
ALGORITMO
C
n
j
1 .. n
leg [ j ] , suel [ j ]
max
mayor_sueldo ( suel , n )
max
1 .. n
suel [ k ] = max
leg [ k ]
AyE Vectores
3 - Bsqueda
Un problema que se presenta a menudo es el de buscar un elemento concreto en un vector.
Existen diferentes formas de bsqueda, su eleccin depende del tamao del vector y de la forma en que estn
guardados los datos en l. Analizaremos cada una por separado.
ALGORITMO
function
busqueda_lineal
pos
-1 ;
( pos = -1 ) y ( k < = n )
vec [ k ] = busco
pos
busqueda_lineal
k +1
pos
V
Ejercicio con bsqueda lineal
Ingresar el nmero de legajo y el sueldo de cada uno de los 150 empleados de una fbrica. Ingresar luego nmeros de
legajo y mostrar sus sueldos. Finalizar cuando se ingrese un legajo 0.
AyE Vectores
ESTRATEGIA
C
Ingresar los legajos en un vector y los sueldos en otro vector
Ingresar un legajo
legajo no es 0
Buscar el legajo en el vector de legajos y
traer la posicin
Mostrar el sueldo que est en el vector de sueldos
en la misma posicin
Ingresar un legajo
F
ALGORITMO
C
j
1 .. 150
leg [ j ] , suel [ j ]
unlegajo
unlegajo < > 0
ubi
suel [ ubi ]
unlegajo
AyE Vectores
2
1
7
2
10
3
12
4
15
5
20
6
70
7
Se compara primero el nmero 20 con el nmero que est en la posicin 4 (aproximadamente en la mitad del vector).
Como 20 es mayor que 10, entonces si est en el vector debe encontrase en la segunda mitad del mismo, o sea entre
las posiciones 5 y 8.
Se compara el 20 con el nmero que est en la posicin 6 (aproximadamente en la mitad del sub-vector elegido).Como
20 es mayor que 15, la bsqueda se repite en el sub-vector que va de la posicin 7 a la posicin 8.
Se compara el 20 con el contenido de la posicin 7 (aproximadamente en la mitad del sub-vector elegido), esta vez
ambos valores coinciden y se termina la bsqueda.
Supongamos ahora que buscamos el nmero 5. Comparamos primero con el nmero que est en la posicin 4, como 5
es menor que 10, lo buscamos entre las posiciones 1 y 3. Comparamos con el contenido de la posicin 2, como 5 es
mayor que 4 lo buscamos entre las posiciones 3 y 3.
Comparamos el 5 con el contenido de la posicin 3, como 5 es menor que 7, lo buscamos entre las posiciones 3 y 2 (3
como lmite inferior del intervalo y 2 como lmite superior), como esos valores no determinan un intervalo se interpreta
que el valor buscado no est en el vector.
La bsqueda binaria tambin la vamos a implementar en una funcin que retorne la posicin que ocupa en el vector el
elemento buscado o 1 si no lo encontramos.
AyE Vectores
ALGORITMO
function busqueda_binaria
vec : tvec ; n : byte ; busco : tdato
pri
1 ; ult
pos
-1
busco
pos
= vec [ med ]
med
busco > vec [ med ]
pri
med + 1
busqueda_binaria
ult
med 1
pos
Bbusco >
V
Ejercicio con bsqueda binaria
Ingresar, por orden ascendente de legajo, el nmero de legajo y el sueldo de cada uno de los 150 empleados de una
fbrica.
Ingresar luego nmeros de legajo y mostrar sus sueldos. Finalizar cuando se ingrese un legajo 0.
Resolucin a cargo del lector!
4 - Utilizacin de vectores
4.1 Para guardar ordenadamente datos que vienen desordenados
Recordemos el ejercicio resuelto utilizando bsqueda lineal, haba que ingresar 150 nmeros de legajos y sueldos de
empleados y luego mostrar los sueldos de algunos empleados cuyos legajos se iban ingresando por teclado. Como nada
se deca sobre los legajos (si eran nmeros arbitrarios o consecutivos, en qu rango estaban, si ingresaban ordenados
o desordenados), entonces fueron guardados en el mismo orden en que ingresaban y se us bsqueda lineal (que
puede aplicarse a cualquier vector) cuando se tuvo que buscar alguno en particular.
Pero, si los legajos fueran nmeros entre 1 y 150 y la informacin sobre legajos y sueldos viniera desordenada, por
ejemplo, primero el legajo 20 con su sueldo, luego el 100 con su sueldo, luego el 1 con su sueldo, etc, lo que se puede
AyE Vectores
hacer es guardar los sueldos de acuerdo al nmero de legajo: el sueldo del legajo 20 en la posicin 20 del vector, el
sueldo del legajo 100 en la posicin 100 y as sucesivamente.
Almacenando los sueldos de esta forma nos ahorramos un vector (el de los legajos) y lo que es ms importante: no
necesitamos hacer bsqueda, porque como sabemos en qu lugar est cada sueldo, podemos acceder directamente a
l cada vez que lo queramos.
Esta forma de leer y guardar ordenadamente se conoce como lectura subindicada, para poder utilizarla, los datos que
sern usados como subndice (por ejemplo los legajos en el caso citado) deben estar numerados en forma correlativa.
La informacin ingresada de esta forma puede ser accedida en forma directa. Veamos lo expuesto sobre un ejercicio.
ESTRATEGIA
C
Ingresar los sueldos en un vector usando los legajos como subndice
Ingresar un legajo
legajo no es 0
Ingresar un legajo
10
AyE Vectores
ALGORITMO
C
j
1 .. 150
unlegajo
unlegajo <> 0
suel [ unlegajo ]
unlegajo
F
4.2 Para usar cada elemento como un contador o acumulador
Los vectores son particularmente tiles cuando se debe usar gran cantidad de contadores o acumuladores del mismo
tipo, por ejemplo, total de ventas (en $) de un comercio en cada da del mes de enero o total de espectadores en cada
uno de los 20 recitales de un cantante, o total de autos patentados en cada mes del ao.
En el primer ejemplo se necesitar un vector de treinta y un elementos de tipo real, en el segundo, el vector deber ser
de veinte elementos de tipo entero y en el tercero ser necesario un vector entero de doce posiciones.
Una vez que se ha decidido qu usar hay que plantearse cmo acceder a cada elemento(o sea a cada contador o
acumulador), si la ubicacin del contador en el vector guarda relacin con alguno de los datos que se ingresan, se podr
usar a dicho dato como subndice y hacer un acceso directo; en cualquier otro caso habr que hacer una bsqueda
previa en algn otro vector que contenga informacin que permita determinar la ubicacin del contador.
Veamos dos ejemplos.
11
AyE Vectores
ESTRATEGIA
C
12
AyE Vectores
ALGORITMO
C
k
1 .. 31
tot_dia [k ]
dia <> 0
tot_dia [ dia ]
1 .. 31
tot_dia [ k ] > 0
Tot_ssuel [ k ] = max
k , tot_dia[ k ]
F
PREGUNTA
Qu agregara al ALGORITMO anterior si tambin se pidiera informar cuntas ventas hizo cada empleado?
13
AyE Vectores
Los nmeros que identifican a los vendedores tienen 3 dgitos, o sea que un vendedor puede ser el 540, otro el 014, el
001, etc. Esta situacin exige asociar cada lugar del vector con un vendedor para poder despus utilizarlo como
contador del vendedor.
Para ello es necesario copiar los nmeros de vendedor que tenemos en la planilla en un vector y preparar otro todo en
cero, paralelo al anterior, de modo que cuando tengamos que actualizar el total de un vendedor, primero buscamos (con
bsqueda lineal porque en el enunciado del problema no dice que estn ordenados) el nmero en el vector de
vendedores y luego contamos la venta en la misma posicin del otro vector.
ESTRATEGIA
C
F
ALGORITMO
C
1 .. 25
tot_vend [ k ]
numero [ k ] , nombre
archiv
dia , mes, anio , imp , vend
(continua)
1
14
AyE Vectores
dia <> 0
pos
tot_vend [ pos ]
tot_vend [ pos ] + 1
1 .. 25
numero [ k ] , tot_vend [ k ]
En este problema tambin necesitamos 25 contadores, uno para cada vendedor, pero ahora no hay ninguna informacin
acerca de cules son sus nmeros, no se puede armar un vector paralelo como en el ejemplo 2, ni usar el nmero como
subndice porque esto nos obligara a declarar un vector de 999 posiciones (porque el n de vendedor es un valor en el
rango 1 - 999) para usar solamente 25.
La solucin es crear un lugar en el vector de vendedores y poner una venta en el vector de totales nicamente cuando
el nmero de vendedor aparece por primera vez.
En cambio si el nmero de vendedor ya haba aparecido antes (eso se determina mediante una bsqueda entre los que
hay guardados) slo se incrementa el vector de totales, de esta forma cada vendedor tiene un contador bien identificado
y no se desperdicia espacio.
15
AyE Vectores
ESTRATEGIA
C
Incrementar en 1 el subndice
Agregar una
venta al total de
ventas
Mostrar los vectores con los nmeros de los vendedores y sus totales
ALGORITMO
C
z
1
(continua)
16
AyE Vectores
1
dia < > 0
pos
pos = -1
z+1
numero [ z ]
vend
tot_vend [ z ]
tot_vend [ pos ]
tot_vend [pos ] + 1
1 .. z
numero [ k ] , tot_vend [ k ]
Observacin: cada vez que se llama a la funcin busqueda_lineal, uno de los argumentos
que se enva es el vector en el cual se van guardando, a medida que aparecen y sin repeticin, los nmeros de los
vendedores que hicieron ventas y el otro argumento es el tamao que dicho vector tiene hasta ese momento (z).
La primera vez que se invoca a la funcin el vector est vaco porque todava no se almacen en l ningn nmero de
vendedor y el valor de la variable z es 0.
Siguiendo atentamente la definicin de la funcin bsqueda_lineal se ver que el valor inicial de la variable ndice que
se usa en la funcin para recorrer el vector supera de entrada al tamao del vector, lo que provoca que no se entre al
ciclo y en consecuencia la variable pos vuelva con el valor de inicializacin (es el 1 que nos indicar que no se
encontr el vendedor).
5 - Ordenacin de vectores
Una operacin muy importante en programacin es la ordenacin de un conjunto de datos en algn orden determinado,
utilizando la estructura de seleccin hemos podido ordenar en forma ascendente o descendente unos pocos valores;
cuando los valores a ordenar estn en un vector se aplica alguno de los muchos algoritmos de ordenacin que existen.
Si bien todos ordenan, hay algunos que son ms eficientes que otro (menor tiempo de ejecucin en computadora y/o
17
AyE Vectores
menor nmero de instrucciones), en general se considera como ms eficiente al que realiza menor nmero de
comparaciones.
En esta seccin presentaremos dos de ellos y los usaremos para ordenar en forma ascendente un vector entero de n
posiciones al que llamaremos a.
4
8
PASADA
COMPARA
CAMBIA
90
VECTOR
RESULTANTE
1
a [ 1 ] con a [ 2 ]
a [ 1 ] con a [ 3 ]
a [ 1 ] con a [ 4 ]
a2
a [ 2 ] con a [ 1 ]
2 - 8
- 90 - 5
a [ 2 ] con a [ 3 ]
a [ 2 ] con a [ 4 ]
a [ 4 ] con a [ 2 ]
2 - 5 - 90 - 8
a [ 3 ] con a [ 4 ]
a [ 3] con a [4]
2 - 5 -
8 - 90
Observemos en cada pasada qu posicin ocupa el mnimo y cules son las posiciones de los
elementos que se comparan con l
MINIMO
COMPARA CON
1
2 - 3 - 4
18
AyE Vectores
2
3
3 - 4
4
En la construccin del algoritmo de este mtodo se necesitarn 2 ciclos anidados: la variable ndice del ms externo
marcar la posicin del mnimo (debe ir desde la primer posicin hasta la penltima) y la variable ndice del ms interno
ir sealando los que se comparan con l (va desde la posicin siguiente a la que ocupa el mnimo y llega hasta la
ltima posicin).
Para intercambiar los contenidos de 2 posiciones de un vector, por ejemplo a[4] con a[2], es necesario usar una variable
auxiliar para copiar uno de los dos valores que de otro modo se perdera. Vemoslo en un esquema:
2
2
8
a [1]
90
a[2]
1
5
a [3]
a[4]
3
aux
ALGORITMO
procedure ordenar
var vec : tvec ; n : byte
1 .. n-1
k + 1 .. n
aux
vec [ k ]
vec [ j ]
vec [ k ]
vec [ j ]
aux
Consiste en hacer sucesivas pasadas sobre el vector, en cada pasada se comparan los contenidos de las casillas
adyacentes (la primera con la segunda, la segunda con la tercera, la tercera con la cuarta, etc) y se intercambian los
contenidos si no estn en orden.
Finaliza cuando en una pasada no fue necesario hacer ningn intercambio porque todos los valores estn en orden.
19
AyE Vectores
La ordenacin por burbujeo recibe este nombre porque los nmeros ms pequeos (cuando se ordena de menor a
mayor) ascienden como burbujas hacia la parte superior del vector (primeras posiciones del vector) mientras que los
nmeros ms grandes se van hacia el fondo (ltimas posiciones del vector).
4
8
PASADA
COMPARA
CAMBIA
a [ 1 ] con a [ 2 ]
a [ 2 ] con a [ 3 ]
a [ 3 ] con a [ 4 ]
90
VECTOR
RESULTANTE
1
a [ 1 ] con a [ 2 ]
a [ 2 ] con a [ 3 ]
a [ 3 ] con a [ 4 ]
a2
a [ 1 ] con a [ 2 ]
2 - 8
- 90 - 5
a [ 3 ] con a [ 4 ]
2 - 8
- 5 - 90
a [ 2 ] con a [ 3 ]
2 - 5 - 8 - 90
a [ 1 ] con a [ 2 ]
a [ 2 ] con a [ 3 ]
a [ 3 ] con a [ 4 ]
Observando el cuadro anterior, vemos que el vector qued ordenado despus de la segunda pasada, sin embargo se
necesit hacer una pasada ms porque se finaliza cuando no se ha hecho ningn intercambio dentro del ciclo.
20
AyE Vectores
ESTRATEGIA
C
seal es falso
F
ALGORITMO
procedure burbujeo
var vec : tvec ; n : byte
cambios
false
1 .. n-1
aux
vec [ k ]
vec [ k + 1 ]
cambios
vec [ k ]
vec [ k + 1 ]
aux
true
cambios
false
21
AyE Vectores
ESTRATEGIA
C
Ingresar los legajos en un vector y los sueldos en otro vector
Ordenar el vector de legajos en forma ascendente con arrastre del vector de sueldos
F
ALGORITMO
C
1 .. 30
leg [k ] , suel [k ]
1 .. 30
leg [ k ] , suel [ k ]