Vectores y Matrices
Vectores y Matrices
Vectores y Matrices
de datos
Asignatura anual, código 082021
Los algoritmos operan sobre datos de distinta naturaleza, por lo tanto los programas que
implementan dichos algoritmos necesitan una forma de representarlos.
Tipo de dato es una clase de objeto ligado a un conjunto de operaciones para crearlos y
manipularlos, un tipo de dato se caracteriza por
1. Un rango de valores posibles.
2. Un conjunto de operaciones realizadas sobre ese tipo.
3. Su representación interna.
Al definir un tipo de dato se esta indicando los valores que pueden tomar sus elementos y las
operaciones que pueden hacerse sobre ellos.
Al definir un identificador de un determinado tipo el nombre del identificador indica la localización
en memoria, el tipo los valores y operaciones permitidas, y como cada tipo se representa de forma
distinta en la computadora los lenguajes de alto nivel hacen abstracción de la representación
interna e ignoran los detalles pero interpretan la representación según el tipo.
Declaracion Genérica
En C, su declaración es:
struct NombreTipo {
Tipo Identificador;
Tipo Identificador;
}
struct TipoRegistro {
int N;
double Y;
}; // declara un tipo
TipoRegistro Registro; // define una variable
struct TipoAlumno {
int Legajo;
string Nombre;
TipoFecha Fecha
}; // declara un tipo Alumno con un campo de tipo Fecha
Declaración
Genérica
Nombre del Tipo = TABLA [Tamaño] de Tipo de dato;
ListaEnteros = TABLA[10] de Enteros; // una tabla de 10 enteros
ListaRegistros = TABLA[10] de TipoRegistro; // una tabla de 10 registros
En C:
TipoDeDato Identificador[Tamaño];
int VectorEnteros[10]// declara un vector de 10 enteros
TipoAlumno VectorAlum[10] // declara un vector de 10 registros.
TipoAlumno MatrizAlumno[10][5] //declara matriz o tabla de 10 filas y y columnas
Capacidad
size Return tamaño
std::array<int,5> miarray;
std::cout << miarray.size() << std::endl;
// retorna 5
Elementos de acceso
operator[] Acceso a un elemento
at Acceso a un elemento
front Acceso al primero de los elementos
back Acceso al ultimo de los elementos
BusqMaxEnVector
(Dato V: Tvector; Dato N: Entero; Dato_resultado Maximo :Tinfo; Dato_resultado Posic: Entero):
una acccion
PRE: V: Vector en el que se debe buscar (sin orden)
N : Tamaño lógico del vector
U = N-1 Posicion del ultimo elemento
POS: Posic: Posición donde se encuentra el máximo
Maximo : Valor máximo del vector.
LEXICO
j : Entero; Supone que el maximo es el primer valor del vector por lo que le asigna ese
ALGORITMO valor a maximo y la posición 0 a la posición del maximo. Al haber leido solo un
Posic = 0; elemento supone ese como maximo
Maximo = V[1];
PARA j [1, U] HACER Recorre ahora las restantes posiciones del vector, a partir de la
SI (v[j] > Maximo) segunda y lcada vez que el valor leido supera al maximo
ENTONCES contiene ese valor como maximo y el indice actual como posición
Posic = j; del maximo
Maximo = v[j];
FIN_SI;
FIN_PARA;
BusqMinDistCeroEnVector
(Dato V: Tvector; Dato N: Entero; Dato_resultado Minimo :Tinfo; Dato_resultado Posic: Entero):
una acccion
PRE: V: Vector en el que se debe buscar (sin orden)
N : Tamaño lógico del vector, existe al menos un valor <> de cero
U = N-1 Posicion del ultimo elemento
POS: Posic: Posición donde se encuentra el minimo distinto de cero
BusqMaxySiguienteEnVector
(Dato V: Tvector; Dato N: Entero; Dato_resultado Maximo :Tinfo; Dato_resultado Posic: Entero,
Dato_resultado Segundo :Tinfo; Dato_resultado PosicSegundo: Entero): una accion
PRE: V: Vector en el que se debe buscar
N : Tamaño lógico del vector mayor o gual a 2
U=N-1
POS: Posic: Posición donde se encuentra el máximo, PosicSegundo: Posición donde se
encuentra el siguiente al máximo
Maximo : Valor máximo del vector. Segundo : Valor del siguiente al máximo del vector
LEXICO
j : Entero;
Se tiene como precondicion que al menos hay dos valores. Se
ALGORITMO
verifica el valor que esta en la primera posición y se lo
SI V[0] > V[1]
compara con el que esta en la segunda posición, en el caso de
ENTONCES ser mayor, el maximo es ese valor, posición del máximo es
Posic = 0; cero, el segundo el valor que esta en segundo lugar y posición
Maximo = V[0]; del segundo es 1. En caso contrario se establece como maximo
PosicSegund = 1; el valor de la segunda posición y segundo el de la primera.
Segundo = V[1];
SINO
Posic = 1;
Maximo = V[1];
PosicSegund =0;
Segundo = V[0];
FIN_SI
CargaSinRepetirEnVectorV1
(Dato_Resultado V: Tvector; Dato_Resultado N: Entero; Dato Clave:Tinfo; Dato_resultado Posic:
Entero; Dato_resultado Enc : Booleano): una accion
Utilizar este algoritmo si la cantidad de claves diferentes es fija, se dispone de memoria suficiente
como para almacenar el vector y la clave no es posicional(es decir clave e índice no se
corresponden directamente con posición única y predecible.Si la posición fuera unica y predecible
la busqueda debe ser directa
PRE: V: Vector en el que se debe buscar
Clave : Valor Buscado
N : Tamaño lógico del vector
U = N-1 posicion del ultimo elemento
POS: Posic: Posición donde se encuentra la clave, o donde lo inserta si no esta. Retorna
-1 (menos 1) en caso que el vector esta completo y no lo encuentra
Enc : Retorna True si estaba y False si lo inserto con esta invocación
Carga vector sin orden
LEXICO
j : Entero;
Controla No superar el tamaño fisico del vector j<= MAX_FIL
ALGORITMO/
Posic = -1; No leer mas alla del ultimo elemento logico cargado j <= N
J = 0;
MIENTRAS (j <= MAX_FILSalir si esyque encuentra
j <= U y V[j]la clave buscada
<> Clave) V[j] <> clave
HACER
Inc (j)
FIN_MIENTRAS; Si debio superar el tamaño fisico maximo del vector no pudo
SI j > MAX_FIL cargarlo y retorna cero como señal de error
ENTONCES
Posic = -1 Si encontro un dato o lo debe cargar esto es en el indice j por lo que a pos
SI_NO se se asigna ese valor. En el caso que j sea mayor que n significa que
Posic = j: recorrio los n elemntos cargados del vector, tiene etpacio por lo que debe
SI (j > N) cargar el nuevo en la posición j. En este caso, y al haber un elemento nuevo
ENTONCES debe incrementar n que es el identificador que controla el tamaño logico
del vector
Enc =FALSE; // No encontró la clave buscada
Inc(N);
BusquedaBinariaEnVectorV2
(Dato V: Tvector; Dato N: Entero; Dato Clave:Tinfo; Dato_resultado Posic: Entero; Dato_resultado
Pri : Entero): una acccion
PRE: V: Vector en el que se debe buscar clave puede estar repetida
LEXICO
j : Entero; La busqueda es bastante parecida a lo
u,m : Entero; desarrollado anteriormente, pero en pos debe
ALGORITMO tener la primera aparicion de la clave buscada
Posic = -1; que puede repetirse.
Pri = 1;
En la busqueda anterior utilizabamos esta pos
U = N-1; como bandera, para saber cuando Sali si lo
MIENTRAS (Pri < U ) HACER encontro. En este caso si lo utilizamos con el
M = (Pri + U ) / 2 mismo proposito saldria cuando encuentra un
SI V[M] = Clave valor oincidente con la clave que no
ENTONCES necesariamente es el primero, por lo que esa
Posic = M; condicion se elimina. Al encontrarlo en m se le
Pri = M; asigna ese valoe a pos, alli seguro esta. No
SI_NO sabemos si mas arriba vuelve a estar por lo que
SI Clave > V[M] se asigna tambien esa posición al ultimo para
ENTONCES seguir iterando y ver si lo vuelve a encontrar.
Pri = M+1 Debe modificarse el operador de relacion que
SI_NO compara primero con ultimo para evitar un
ciclo infinito, esto se hace eliminando la
U=M–1
relacion por igual. Insisto en el concepto de los
FIN_SI
valores de retorno de la busqueda binaria. Una
FIN_SI
particularidad de los datos es que si lo que se
FIN_MIENTRAS; busca no esta puede retornal en el primero la
posición donde esa clave deberia estar
FIN. // Búsqueda binaria en vector
CargaSinRepetirEnVectorV2
(Dato_Resultado V: Tvector; Dato_Resultado N: Entero; Dato Clave:Tinfo; Dato_resultado Posic:
Entero; Dato_resultado Enc : Booleano): una acccion
PRE: V: Vector en el que se debe buscar ordenado por clave
Clave : Valor Buscado
N : Tamaño lógico del vector
La busqueda es bastante parecida a lo desarrollado anteriormente, pero en pos debe tener la primera
aparicion de la clave buscada que puede repetirse.
En la busqueda anterior utilizabamos esta pos como bandera, para saber cuando Sali si lo encontro. En
este caso si lo utilizamos con el mismo proposito saldria cuando encuentra un valor oincidente con la
clave que no necesariamente es el primero, por lo que esa condicion se elimina. Al encontrarlo en m se le
asigna ese valoe a pos, alli seguro esta. No sabemos si mas arriba vuelve a estar por lo que se asigna
tambien esa posición al ultimo para seguir iterando y ver si lo vuelve a encontrar. Debe modificarse el
operador de relacion que compara primero con ultimo para evitar un ciclo infinito, esto se hace
eliminando la relacion por igual. Insisto en el concepto de los valores de retorno de la busqueda binaria.
Una particularidad de los datos es que si lo que se busca no esta puede retornal en el primero la posición
donde esa clave deberiaestar
POS: Posic: Posición donde se encuentra la clave, o donde lo inserta si no esta. Retorna
OrdenarVectorBurbuja
(Dato_Resultado V: Tvector; Dato N: Entero): una acccion
Pre: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
U = N-1 // posición del ultimo elemento del vector.
POS: Vector ordenado por clave creciente
Usar este algoritmo cuando los datos contenidos en un vector deben ser ordenados. Se podría por
ejemplo cargar los datos de un archivo al vector, ordenar el vector recorrerlo y generar la
estructura ordenada. Para esto la cantidad de elementos del archivo debe ser conocida y se debe
disponer de memoria suficiente como para almacenar los datos. Una alternativa, si la memoria no
alcanza para almacenar todos los datos podría ser guardar la clave de ordenamiento y la
referencia donde encontrar los datos, por ejemplo, la posición en el archivo.
La idea general es ir desarrollando pasos sucesivos en cada uno de los cuales ir dejando el mayor de
los elementos en el último lugar. En el primer paso se coloca el mayor en la ultima posición, en el
paso siguiente se coloca el que le sigue sobre ese y asi hasta que queden dos elemntos. En ese caso
LEXICO al acomodar el segundo el otro queda acomodado el primer ciclo cuenta los pasos, son uno menos
I,J, : Entero; que la cantidad de elementos porque el ultimo paso permite acomodar 2 elementos, por eso el ciclo
Aux : Tinfo; se hace entre 1 y N – 1 siendo n la cantidad de elementos
ALGORITMO
PARA i [1, U - 1] HACER
Para poder colocar el mayor al final es necesario
PARA j [1, U - i] HACER
hacer comparaciones. Se compara el primero con el
SI (v[j] > v[j + 1]) segundo y si corresponde se intercambian. Asi hasta
ENTONCES llegar al ante ultimo eleemento que se lo compara
Aux = v[j]; con el últim.
V[j] = v[j + 1];
V[j + 1] = Aux; Al ir recorriendo los distintos pasos, y dado que en
FIN_SI; cada uno se acomoda un nuevo elemento
corresponde hacer una comparación menos en cada
avance, como los pasos los recorremos con i, las
Algoritmos y Estructura de Datos DISI UTN.BA Página 16
comparaciones seran U – i. disminuye en 1 en cada
paso
FIN_PARA;
FIN_PARA;
FIN
OrdenarVectorBurbujaMejorado
(Dato_Resultado V: Tvector; Dato N: Entero): una acccion
PRE: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
U=N-1
POS: Vector ordenado por clave creciente
LEXICO
I,J, : Entero;
Aux : Tinfo;
Ord : Boolean;
ALGORITMO
El algoritmo es similar al anterior, solo que el
I = 0; ciclo de repetición externo no lo hace si es
REPETIR que tiene la certeza, en el paso anterior que
Inc(i); los datos ya estan ordenados. Es por eso que
Ord = TRUE; agrega una bandera para verificar si ya esta
PARA j [1, U - i] HACER ordenado y cambia el cilo exactp por un ciclo
SI (v[j] > v[j + 1]) pos condicional. Es decir reemplaza la
ENTONCES composición para por la composición repetir
Ord = False; hasta
Aux = v[j];
V[j] = v[j + 1];
V[j + 1] = Aux;
FIN_SI;
FIN_PARA;
HASTA ( Ord o I = U – 1); //si esta ordenado o llego al final
FIN
OrdenarVectorInserion
(Dato_Resultado V: Tvector; Dato N: Entero): una accion
PRE: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
POS: Vector ordenado por clave creciente
Este algoritmo consta de los siguientes pasos
El primer elemento A[0] se lo considera ordenado; es decir se considera el array con un solo
elemento.
Se inserta A[1] en la posicion correcta, delante o detras de A[0] segun sea mayor o menor.
Por cada iteracion, d i desde i=1 hasta n-1, se explora la sublista desde A[i-1] hasta A[0],buscando
la posicion correcta de la insercion ; a la vez se mueve hacia abajouna posicion todos los elementos
mayores que el elemento a insertar A[i] para dejar vacia la posicion.
Insertar el elemento en l posicion correcta.
LEXICO
ALGORITMO
PARA I[1..N-1]
J = I;
Aux = A[i] ;
MIENTRAS (J >0 Y AUX < A[J - 1])HACER
A[J] = A[J - 1] ;
Dec(J) ;
FIN MIENTRAS ;
A[J] = Aux ;
FIN PARA;
FIN
OrdenarVectorShell
(Dato_Resultado V: Tvector; Dato N: Entero): una acccion
PRE: V: Vector en el que se debe ordenar, se supone dato simple
N : Tamaño lógico del vector
POS: Vector ordenado por clave creciente
Este algoritmo consta de los siguientes pasos
Dividir la lista original en n/2 grupos de dos, considerando un incremento o salto entre los
elementos en n/2.
Analizar cada grupo por separado comparandolas parejas de elementos, y si no estan ordenados,
se intercambian .
Se divide ahora la lista en la mitad n/4, con un incremento tambien en n/4 y nuevamente se
clasifica cada grupo por separado.
Se sigue dividiendo la lista en la mitad de grupos que en el paso anterior y se clasifica cada grupo
por separado.
El algoritmo termina cuando el tamaño del salto es 1.
ALGORITMO
Intervalo = n / 2;
CorteDeControlEnVector
(Dato V:Tvector; Dato N: Entero): una acccion
Usar este procedimiento solo si se tienen los datos agrupados por una clave común y se requiere
procesar emitiendo información 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 : Tamaño lógico del vector
U = N-1
POS: Recorre agrupando por una clave
LEXICO
I : Entero;
ALGORITMO
I = 0;
Anterior = TipoInfo;
// Inicializar contadores generales
MIENTRAS (I<=U) Hacer
//inicializar contadores de cada sublote
Anterior = V[i]
MIENTRAS (I<=U Y Anterior = V[i] HACER
// Ejecutar acciones del ciclo
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 están ORDENADAS por ese campo común.
PRE: V1,V2: Vectores a Recorrer mezclados o intercalados
Los vectores deben estar ordenados.
N1,N2 : Tamaño lógico de los vectores
| U1 = N1-1; U2 = N2 – 1 //posición de los últimos elementos de V1 y V2
POS: Muestra la totalidad de los datos con el orden de las estructuras
LEXICO
I,J : Entero;
ALGORITMO
I = 0;
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: Tamaño lógico del vector
U = N-1 //p0sicion del ultimo elemento en el vector
POS: Vector con los N mejores sin orden
LEXICO
j : Entero;
Maximo: Tinfo
Posic: Entero;
ALGORITMO
SI (U < MAX-FIL)
ENTONCES
Inc (U);
V[U] = 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
Implementaciones C C++
Operaciones sobre arrays
Antes de comenzar
Se presentan las principales operaciones que son generalmente utilizadas para el manejo de
arrays. Además se incorpora la utilización de tipos de datos genéricos, implementados con templates, y
también la importancia de poder desacoplar las porciones de código que son propias de un problema, la
generalidad de la algoritmia a través de la invocación de funciones que se reciben cómo parámetros
(punteros a funciones).
Agregar un elemento al final de un array
La siguiente función agrega el valor v al final del array arr e incrementa su longitud len.
void agregar(int arr[], int& len, int v)
{
arr[len]=v;
len++;
return;
}
Recorrer y mostrar el contenido de un array
La siguiente función recorre el array arr mostrando por consola el valor de cada uno de sus
elementos.
void mostrar(int arr[], int len)
{
for(int i=0; i<len; i++){
cout << arr[i] << endl;
}
return;
}
Determinar si un array contiene o no un determinado valor
La siguiente función permite determinar si el array arr contiene o no al elemento v; retorna la posición
que v ocupa dentro de arr o un valor negativo si arr no contiene a v.
int buscar(int arr[], int len, int v)
{
int i=0;
while( i<len && arr[i]!=v ){
i++;
}
return i<len?i:-1; }
Eliminar el valor que se ubica en una determinada posición del array
La siguiente función elimina el valor que se encuentra en la posición pos del array arr, desplazando al
i-ésimo elemento hacia la posición i-1, para todo valor de i>pos y i<len.
void eliminar(int arr[], int& len, int pos)
{
for(int i=pos; i<len-1; i++ ){
arr[i]=arr[i+1];
Más adelante veremos como independizar el criterio de precedencia para lograr que la misma función
sea capaz de insertar un valor respetando un criterio de precedencia diferente entre una y otra
invocación.
Templates
Ordenamiento
La siguiente función ordena el array arr de tipo T siempre y cuando dicho tipo especifique el criterio
de precedencia de sus elementos mediante los operadores relacionales > y <. Algunos tipos (y/o
clases) válidos son: int, long, short, float, double, char y string.
template <typename T> void ordenar(T arr[], int len)
{
bool ordenado=false;
while(!ordenado){
ordenado = true;
for(int i=0; i<len-1; i++){
if( arr[i]>arr[i+1] ){
T aux = arr[i];
arr[i] = arr[i+1];
arr[i+1] = aux;
ordenado = false;
Punteros a funciones
Las funciones pueden ser pasadas cómo parámetros a otras funciones para que éstas las invoquen. Se
pueden crear apuntadores a funciones, en lugar de direccionar datos los punteros a funciones apuntan
a código ejecutable. Un puntero a una función es un apuntador cuyo valor es el nombre de la función.
Sintaxis
TipoRetorno (*PunteroFuncion)(ListaParametros)
int f(int); //declara la funcion f
int (*pf)(int); // define pf a funcion int con argumento int
pf = f; // asigna la direccon de f a pf
Los apuntadores permiten pasar una función como argumento a otra función. Utilizaremos esta
carácteristica de los lenguajes de programación para parametrizar el criterio de precedencia que
queremos que la función ordenar aplique al momento de comparar cada par de elementos del array arr.
Observemos con atención el tercer parámetro que recibe la función ordenar desarrollada mas abajo.
Corresponde a una función que retorna un valor de tipo int y recibe dos parámetros de tipo T, siendo T
un tipo de datos genérico parametrizado por el template.
La función criterio, que debemos desarrollar por separado, debe comparar dos elementos e1 y e2,
ambos de tipo T, y retornar un valor: negativo, positivo o cero según se sea: e1<e2, e1>e2 o e1=e2
respectivamente.
Las funciones pueden ser pasadas cómo parámetros a otras funciones para que éstas las invoquen.
Utilizaremos esta carácteristica de los lenguajes de programación para parametrizar el criterio de
precedencia que queremos que la función ordenar aplique al momento de comparar cada par de
elementos del array arr.
template <typename T>void ordenar(T arr[], int len, int (*criterio)(T,T))
{
bool ordenado=false;
while(!ordenado){
ordenado=true;
for(int i=0; i<len-1; i++){
// invocamos a la funcion para determinar si corresponde o no permutar
if( criterio(arr[i],arr[i+1])>0 ){
T aux = arr[i];
arr[i] = arr[i+1];
arr[i+1] = aux;
ordenado = false;
} // cierra bloque if
} // cierra bloque for
}// cierra bloque while
return; }
Ordenar arrays de diferentes tipos de datos con diferentes criterios de ordenamiento
A continuación analizaremos algunas funciones que comparan pares de valores (ambos del mismo tipo)
y determinan cual de esos valores debe preceder al otro.
Probamos lo anterior:
int main()
{
int len = 4;
// un array con 6 cadenas
string x[] = {"Pablo", "Pedro", "Andres", "Juan"};
// ordeno ascendentemente pasando como parametro la funcion criterioAZ
ordenar<string>(x,len,criterioAZ);
mostrar<string>(x,len);
// ordeno descendentemente pasando como parametro la funcion criterioZA
ordenar<string>(x,len,criterioZA);
mostrar<string>(x,len);
// un array con 6 enteros
int y[] = {4, 1, 7, 2};
// ordeno ascendentemente pasando como parametro la funcion criterio09
ordenar<int>(y,len,criterio09);
mostrar<int>(y,len);
// ordeno ascendentemente pasando como parametro la funcion criterio90
ordenar<int>(y,len,criterio90);
mostrar<int>(y,len);
return 0;
}
Arrays de estructuras
Trabajaremos con la siguiente estructura:
struct Alumno
{
int legajo;
string nombre;
int nota;
};
// esta funcion nos permitira "crear alumnos" facilmente
Alumno crearAlumno(int le, string nom, int nota)
{
Alumno a;
a.legajo = le;
a.nombre = nom;
a.nota = nota;
return a; }
int main()
{
Alumno arr[6];
arr[0] = crearAlumno(30,"Juan",5);
arr[1] = crearAlumno(10,"Pedro",8);
arr[2] = crearAlumno(20,"Carlos",7);
arr[3] = crearAlumno(60,"Pedro",10);
arr[4] = crearAlumno(40,"Alberto",2);
arr[5] = crearAlumno(50,"Carlos",4);
int len = 6;
// invoco a la funcion que muestra el array
mostrar<Alumno>(arr,len,mostrarAlumno);
return 0;
}
Función eliminar:.
Descripción: Elimina el valor ubicado en la posición pos del array arr, decrementando su longitud.
template <typename T>
void eliminar(T arr[], int& len, int pos)
{
int i=0;
for(int i=pos; i<len-1; i++ )
{
arr[i]=arr[i+1];
}
len--;
return;}
Función insertar.
Descripción: Inserta el valor v en la posición pos del array arr, incrementando su longitud.
template <typename T>
void insertar(T arr[], int& len, T v, int pos)
{
for(int i=len-1; i>=pos; i--)
{
arr[i+1]=arr[i];
}
arr[pos]=v;
len++;
return;
}
Función insertarOrdenado.
Descripción: Inserta el valor v en el array arr en la posición que corresponda según el criterio
criterio.
template <typename T>
int insertarOrdenado(T arr[], int& len, T v, int (*criterio)(T,T))
{
int i=0;
while( i<len && criterio(arr[i],v)<=0 ){
i++;
}
insertar<T>(arr,len,v,i);
return i; }
Función buscaEInserta.
Función ordenar
Descripción: Ordena el array arr según el criterio de precedencia que indica la función criterio.
Función busquedaBinaria.
Descripción: Busca el elemento v en el array arr que debe estar ordenado según el criterio
criterio. Retorna la posición en donde se encuentra el elemento o donde este debería ser insertado.
template<typename T, typename K>
int busquedaBinaria(T a[], int len, K v, int (*criterio)(T, K), bool&
enc)
{
int i=0;
int j=len-1;
int k=(i+j)/2;
enc=false;
while( !enc && i<=j ){
if( criterio(a[k],v)>0 ){
j=k-1;
Algoritmos STL
La ventaja de la utilización de las clases STL es la existencia de algoritmos que resuelven
una gran mayoría de las funcionalidades requeridas para las estructuras de datos
mayormente utilizadas, los vectores no son la excepción.
#include <algorithm>
Esta inclusión, permite utilizar las siguientes funciones entre otras:
Prototipo Devuelve Acción
sort (identificador.begin(), - Ordena el vector de
identificador.end()); menor a mayor
reverse (identificador.begin(), - Invierte el vector
identificador.end());
count (identificador.begin(), Entero ocurrencias de
identificador.end(), valor_buscado); valor_buscado
14. Dado un archivo PRECIOS (desordenado) con los precios de cada articulo, donde cada
registro contiene:
a) Nro. de artículo (5 dígitos)
b) Descripción del artículo (19 caracteres)
c) Precio por unidad (real)
d) Cantidad en stock (5 dígitos) e) Nro. de proveedor (4 dígitos)
Desarrollar el programa que imprima el contenido del archivo ordenado por:
1) Nro. de articulo creciente
2) Descripción del articulo (alfabético creciente)
3) Nro. de proveedor creciente y dentro del mismo por Nro. de articulo
creciente
4) Nro. de proveedor creciente y dentro del mismo por Nro. de articulo
decreciente
15. Una empresa de aviación realiza 500 vuelos semanales a distintos puntos del país y
requiere un programa para el otorgamiento de pasajes. Para ello dispone de un
archivo de registros, en el que cada registro contiene información de los vuelos que
realiza y la cantidad de pasajes disponibles en cada uno de ellos según se indica:
a) Código del vuelo (6 dígitos)
b) Cantidad de pasajes disponibles (3 dígitos)
Se dispone además de otro archivo con los datos de los potenciales compradores, en el
que cada registro tiene:
c) Código de vuelo solicitado
d) Cantidad de pasajes solicitados (3 dígitos)
e) DNI del solicitante (8 dígitos)
f) Apellido y nombres del solicitante (30 caracteres)
Desarrollar estrategia, algoritmo y codificación del programa que determine e
imprima:
1) Para los solicitantes a los cuales se les venden pasajes,
DNI APELLIDO Y NOMBRES CANTIDAD DE PASAJES CÓDIGO VUELO
99999999 XXXXXXXXXXXXXXXXXXX 999 999
Al final del proceso el siguiente listado:
CÓDIGO DE VUELO PASAJES LIBRES PASAJES NO VENDIDOS
999999 999 999
Se le vende al solicitante si la cantidad de pasajes que solicita está disponible, en caso
contrario se computa como pasajes no vendidos.
16. Se desarrolla una carrera automovilística de regularidad constituida por 50 trayectos
numerados de 1 a 50. Por cada trayecto se generó un registro con el número de
trayecto y el tiempo asignado en segundos y se encuentran en el archivo ASIGNADO
(sin ningún orden) con: a) Nro. del trayecto b) Tiempo asignado en segundos
Para llevar el control de los corredores, de posición y de abandonos se dispone de un
archivo TIEMPO donde cada registro contiene: a) Nro. del corredor (3 dígitos) b) Nro.
del trayecto, c) Tiempo en segundos.
Los registros de este archivo están ordenados por trayecto pero no por corredor. A
partir del abandono de un corredor en un trayecto no habrá más registros para el en
el archivo.
Desarrollar estrategia, algoritmo y codificación del programa que determine e
imprima:
1) Por cada etapa, su número y el del corredor ganador de la misma.
2) Por cada etapa, su número y los de los corredores que abandonan en la
misma.
19. Ingresar dos valores, M (< 30) y N (< 25) y a continuación por filas todos los
componentes de una matriz MATRIZA de M filas y N columnas. Desarrollar un
programa que:
a) Imprima la matriz MATRIZA por columnas.
b) Calcule e imprima el valor promedio de los componentes de la matriz.
c) Genere e imprima un vector VECSUMCOL donde cada componente sea la
suma de la columna homóloga.
d) Genere e imprima un vector VECMAXFIL donde cada componente sea el valor
máximo de cada fila.
21. Ingresar un valor N (< 25) y luego por filas una matriz cuadrada CUADRA de N filas y
columnas. Desarrollar un programa que determine e imprima:
a) Todos los elementos de la diagonal principal o secundaria según de cual
resulte mayor la sumatoria de elementos.
b) Los elementos del cuarto (N/2 filas y N/2 columnas) cuya sumatoria resulte
mayor (considerando que N fuera par).
c) Los elementos de la triangular superior o inferior dependiendo de cual tenga
mayor sumatoria de elementos.
22. Ingresar dos valores, M (< 20) y N (< 25) y a continuación por columnas todos los
componentes de una matriz DESORDE de M filas y N columnas. Desarrollar un
programa que:
a) Ordene (creciente) cada columna de la matriz sobre si misma y la imprima a
razón de una columna por renglón.
b) Ordene (creciente) la matriz sobre si misma por fila desde el elemento 1,1 al
M,N y la imprima a razón de una fila por renglón.
23. Ingresar por plano, fila y columna todos los elementos de una matriz MATRIDIM de M
planos, filas y columnas. Desarrollar un programa que:
a) Imprima la matriz MATRIDIM por columnas, fila, plano.
b) Calcule e imprima el valor promedio de la matriz.
c) Determine e imprima el mayor valor y en que lugar del la matriz se encuentra.
d) Genere e imprima una matriz MATCSUMCOL donde cada elemento sea la
suma de la columna homóloga.
e) Genere e imprima una matriz MATMAXFIL donde cada elemento sea el valor
máximo de cada fila.