Академический Документы
Профессиональный Документы
Культура Документы
2, 0.0, ,
3
5, 0.9)
de R
9
se tiene que sus componentes son:
v
1
= 1.
v
4
=
1
5
.
v
7
= .
v
2
=
3
4
.
v
5
=
2.
v
8
=
3
5.
v
3
= 0.25.
v
6
= 0.0.
v
9
= 0.9.
10.1.1. El conjunto de los vectores
A partir de la notacion de producto generalizado de un conjunto V
V
n
= V V V V
-- -
n-veces
se puede obtener el conjunto de los vectores V
=
nN
V
n
10.2. Los arreglos o vectores en computaci on
Si se tiene un conjunto T que representa un tipo de datos y un n umero n N, se puede
construir un vector de tama no n, a los vectores que se construyen sobre tipos de datos en
computaci on se les llama arreglos o vectores unidimensionales.
A partir del producto generalizado de un conjunto T se puede obtener el conjunto de
los arreglos T
=
nN
T
n
y se llama el conjunto de todos los arreglos de tipo T.
as, el conjunto de los arreglos del tipo de datos T es una coleccion de variables del tipo
de datos T.
Para denir arreglos se utilizar a la notaci on de memoria din amica, es decir, si x T
ON 159
T* x = new T[n]
Con esta instrucci on se reserva una porcion de la memoria M que es utilizada para
almacenar el arreglo y que es bloqueada para que s olo se pueda utilizar para guardar
valores en el arreglo, a menos que el espacio se libere y se pueda utilizar para almacenar
otro tipo de informaci on. A la porcion de espacio de memoria que ocupa un arreglo x lo
notaremos como M
x
. Gracamente esto se puede ver as:
M
new T[n]
M
T T
T T
T* x = new T[n]
M
x
M
T T
T T
x M
x
160 CAP
x[n-2] x[n-1]
] , , , , ,
(x
1
x
2
x
3
x
n1
x
n
}
, , , , ,
n
con lo cual, la representaci on en la memoria resultara ser
M
x[0] x[1] x[n-2] x[n-1]
x
En lenguajes como SciLab y MatLab, la primera componente del arreglo est a ubicada
en la posicion 1, y para un arreglo de tama no n se tiene que la ultima componente del
arreglo estar a ubicada en la posicion n, por lo que las posiciones se manejan como en
notaci on matem atica de vectores, es decir, para acceder en SciLab o MatLab a la variable
almacenada en la componente i se utiliza la equivalencia
10.2. LOS ARREGLOS O VECTORES EN COMPUTACI
ON 161
x
i
x[i]
En caso de que se quiera acceder a una componente mayor o igual a la n-esima en C++
entonces el valor almacenado ser a lo que en ese momento tenga la memoria en el siguiente
campo de la memoria, pero este sera un valor inesperado, por que simplemente no se ha
protegido ese espacio de memoria y la informacion all es desconocida a priori. Si se quiere
acceder a una componente menor a 0, ocurre algo similar a lo descrito anteriormente.
10.2.1. Funciones para utilizar arreglos
Para crear y eliminar arreglos se dise naran las respectivas funciones de creacion y de
eliminaci on.
10.2.1.1. Creaci on de arreglos
Matem aticamente se denir a una rutina de creacion de un arreglo como aquella rutina
que dado un n N, correspondiente al tama no, retornar a un elemento de T
que es de
tama no n.
crear arreglo T N T
(n} x, donde x T
n
T
En C++ se traduce
T* crear_arreglo_T(int n){
return new T[n];
};
Ejemplo. Para crear un arreglo de tipo entero se tiene la siguiente funci on
int* crear_arreglo_int(int n){
return new int[n];
};
10.2.1.2. Eliminacion de arreglos
Para eliminar un arreglo, se debe entender que lo que ocurre es que la porci on del
espacio de la memoria que se utiliza para almacenar las componentes del arreglo se liberan
o se regresan al sistema operativo para que este disponga de esa memoria para almacenar
nueva informaci on.
162 CAP
(M}
(x, n} M
x
Hay que recordar aqu que
(M}.
Para traducir esta funci on a C++ se debe tener en cuenta que la funcion no retorna un
valor de un tipo de datos, si no que se regresa memoria al sistema operativo, por lo que la
funci on regresa un espacio que esta vaci o y queda disponible para utilizarse de nuevo.
El desbloqueo de la memoria y la liberaci on del espacio utilizado por el arreglo x se
escribe en C++ mediante la instruccion
delete[] x;
M
T T
T T
x M
x
delete[] x;
M
Para decir que se retorna memoria vaca al sistema operativo se utiliza como tipo de
dato el vaco que en C++ se escribe como void y en el cuerpo de la funcion se utiliza la
10.3. ARREGLOS Y FLUJOS DE DATOS 163
instrucci on return; para indicar que se retorno una porci on de espacio que esta vaci o y
que queda disponible para usarse de nuevo.
Una funci on que solo manipula la memoria y que retorna un tipo de dato vaco, en
programaci on se conoce como un procedimiento.
De esta manera, la traduccion de la funcion en C++ se escribe de la siguiente manera
void liberar_arreglo_T(T* x, int n){
delete[] x;
return;
};
Ejemplo. Para liberar la memoria usada por un arreglo de tipo caracter se tiene la si-
guiente funci on
void liberar_arreglo_char(char* x, int n){
delete[] x;
return;
};
10.3. Arreglos y ujos de datos
Dado un arreglo de tipo T, es posible realizar operaciones de lectura y escritura sobre
ujos de datos, y dichas operaciones se denen as
Lectura de arreglos: para la entrada o lectura de un arreglo desde un ujo de datos se
dene la siguiente funci on
leer arreglo T IS T
N T
(is, x, n} x, donde x
i
= leer T(is},
i = 1, 2, 3, . . . , n.
La traduccion de esta funcion en C++ se escribe de la siguiente manera (es necesario
tener en cuenta que como se menciono previamente, los arreglos en C++ comienzan en la
posicion 0):
T* leer_arreglo_T(istream& is, T* x, int n){
for(int i = 0; i < n; i++){
x[i] = leer_T(is);
};
return x;
};
164 CAP
N OS
(os, x, n} os, donde escribir T(x
i
, os},
i = 1, 2, 3, . . . , n.
La traduccion de esta funcion en C++ se escribe de la siguiente manera. En primera
instancia se inicia una nueva lnea y para que los datos se puedan diferenciar al leerlos de
nuevo, se escribe un smbolo de tabulacion o un espacio en blanco cada vez que se escribe
un nuevo dato en el ujo de datos
ostream& escribir_arreglo_T(ostream& os, T* x, int n){
os << endl;
for(int i = 0; i < n; i++){
escribir_T(x[i], os);
};
return os;
};
Ejemplo. En C++ para escribir un arreglo de tipo caracter se utiliza la siguiente funci on
ostream& escribir_arreglo_char(ostream& os, char* x, int n){
os << endl;
for(int i = 0; i < n; i++){
escribir_char(x[i], os);
};
return os;
};
1
a e
i
o u
n = 5
2
a e
i
o u
a
n = 5, i = 0
3
a e
i
o u
a
n = 5, i = 0
4
a e
i
o u
e a
n = 5, i = 1
166 CAP
n = 5, i = 1
6
a e
i
o u
i
e
a
n = 5, i = 2
7
a e
i
o u
i
e
a
n = 5, i = 2
8
a e
i
o u
o
i
e
a
n = 5, i = 3
9
a e
i
o u
o
i
e a
n = 5, i = 3
10
a e
i
o u
u o
i
e a
n = 5, i = 4
11
a e
i
o u
u o
i
e
a
n = 5, i = 4
12
a e
i
o u
u o
i
e
a
n = 5, i = 5
13
a e i o u a e i o u
10.3.1. Ejemplos de funciones con arreglos
Es posible utilizar lo visto en funciones para realizar diversidad de calculos que involu-
cren arreglos.
Ejemplo. El cubo de las componentes de arreglos numericos enteros
10.3. ARREGLOS Y FLUJOS DE DATOS 167
Suponga que un archivo contiene unos datos numericos enteros tales que consta de 5
datos que se encuentran separados por una tabulacion as como se muestra a continuaci on
1 2 3 4 5
Una funcion general que permite construir un nuevo arreglo que contiene el cubo de
cada componente de un arreglo dado es
cubo arreglo Z
N Z
(x, n} y, donde y
i
= x
3
i
,
i = 1, 2, . . . , n.
Un programa completo en C++ que permite calcular el cubo de las componentes de un
arreglo obtenido a partir del archivo presentado anteriormente es
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
int* crear_arreglo_int(int n){
return new int[n];
};
void liberar_arreglo_int(int* x, int n){
delete[] x;
return;
};
int* leer_arreglo_int(istream& is, int* x, int n){
for(int i = 0; i < n; i++){
x[i] = leer_int(is);
};
return x;
};
ostream& escribir_arreglo_int(ostream& os, int* x, int n){
os << endl;
for(int i = 0; i < n; i++){
escribir_int(x[i], os);
};
return os;
};
168 CAP
N R
(x, n}
x
1
, si n = 1;
suma arreglo(x, n 1} + x
n
, en otro caso.
La codicaci on en C++ de una funci on que permite sumar las componentes de un
arreglo de n umeros reales de longitud n se presenta a continuaci on. Al codicar la funcion
en C++ es necesario tener en cuenta que las componentes sufren un corrimiento de una
posicion, pero la llamada recursiva de la funci on se hace igual que como fue denida en el
modelo matematico.
double suma_arreglo(double* x, int n){
if(n == 1){
return x[0];
};
return suma_arreglo(x, n - 1) + x[n-1];
};
Una funcion en C++ que calcula la suma de las componentes de un arreglo, que esta es-
crita usando estructuras cclicas y que resulta ser equivalente a la anterior es la siguiente
170 CAP
N R
(x, n} suma arreglo(x, n}]n;
Una funci on en C++ que permite calcular el promedio de los datos numericos almace-
nados en un arreglo de longitud n es
double promedio(double* x, int n){
return suma_arreglo(x, n) / n;
};
Ejemplo. La conjetura de los arreglos de n umeros reales ordenados ascendentemente
Un arreglo est a ordenado ascendentemente si x
i
x
i+1
, i = 1, 2, . . . , n 1. Una funci on
recursiva que permite determinar si un arreglo se encuentra ordenado ascendentemente se
puede modelar matem aticamente teniendo en cuenta que:
Si el arreglo tiene una unica componente, entonces el arreglo se encuentra ordenado
ascendentemente.
Si el arreglo tiene m as de una componente, entonces, si el subarreglo que no contiene
la ultima componente del arreglo original est a ordenado ascendentemente, basta con
establecer que la ultima componente del arreglo original es mayor o igual a la ultima
componente del subarreglo.
esta ordenado R
N B
(x, n}
V, si n = 1;
F, si x
n1
> x
n
;
esta ordenado(x, n 1}, en otro caso.
10.3. ARREGLOS Y FLUJOS DE DATOS 171
La codicacion en C++ de una funcion que permite determinar si un arreglo de longi-
tud n se encuentra ordenado ascendentemente se presenta a continuacion. Al codicar la
funci on en C++ es necesario tener en cuenta que las componentes sufren un corrimiento de
una posicion, pero la llamada recursiva de la funcion se hace igual que como fue denida
en el modelo matem atico.
bool esta_ordenado(double* x, int n){
if(n == 1){
return true;
};
if(x[n - 2] > x[n - 1]){
return false;
};
return esta_ordenado(x, n - 1);
};
Una funci on en C++ que permite determinar si un arreglo se encuentra ordenado
ascendentemente, que est a escrita usando estructuras cclicas y que resulta ser equivalente
a la anterior es la siguiente
bool esta_ordenado(double* x, int n){
for(int i = n - 2; i >= 0; i--){
if(x[i] > x[i + 1]){
return false;
};
};
return true;
};
Ejemplo. El maximo de un subarreglo de tipo real
El m aximo de un arreglo es un valor M que pertenece al arreglo tal que M x
i
,
i = 1, 2, . . . , n. Una funci on recursiva que permite calcular el maximo de un arreglo se
puede modelar matem aticamente teniendo en cuenta que:
Si el arreglo tiene una unica componente, entonces el m aximo del arreglo es igual al
valor de esa componente.
Si el arreglo tiene mas de una componente, entonces, si el m aximo del subarreglo
que no contiene la ultima componente del arreglo original se compara con ultima
componente del arreglo original, entonces el mayor de los dos resulta ser el mayor
de arreglo original.
172 CAP
N R
(x, n}
x
1
, si n = 1;
M, donde {M = max arreglo(x, n 1})
(M > x
n
};
x
n
, en otro caso.
La codicaci on en C++ de una funci on que permite calcular el m aximo de un arreglo
de longitud n se presenta a continuacion. Al codicar la funci on en C++ es necesario tener
en cuenta que las componentes x
n
sufren un corrimiento de una posici on desde el intervalo
original n a 1 al intervalo trasladado desde n 1 hasta 0, pero la llamada recursiva de la
funci on se hace igual que como fue denida en el modelo matem atico.
double max_arreglo(double* x, int n){
if(n == 1){
return x[0];
};
double M = max_arreglo(x, n - 1);
if(M > x[n - 1]){
return M;
};
return x[n - 1];
};
Una funci on en C++ que permite calcular el maximo de un arreglo, que est a escrita
usando estructuras cclicas y que resulta ser equivalente a la anterior es la siguiente
double max_arreglo(double* x, int n){
double M = x[0];
for(int i = 1; i < n; i++){
if(M < x[i]){
M = x[i];
};
};
return M;
};
Ejemplo. La posicion del maximo de un subarreglo de n umeros reales
La posicion del maximo de un arreglo es un valor k tal que 1 k n y x
k
x
i
,
i = 1, 2, . . . , n. Una funci on recursiva que permite calcular la posicion del maximo de un
arreglo se puede modelar matematicamente teniendo en cuenta que:
Si el arreglo tiene una unica componente, entonces la componente del m aximo se
encuentra ubicada en esta primera posici on.
10.3. ARREGLOS Y FLUJOS DE DATOS 173
Si el arreglo tiene m as de una componente, entonces, la posici on del maximo se ob-
tiene calculando la posici on del m aximo del subarreglo que no contiene la ultima
componente del arreglo original y si al comparar esa componente con ultima compo-
nente del arreglo original, entonces la posici on del mayor ser a la posici on del maximo
del arreglo original.
La codicaci on en C++ de una funci on que permite obtener la posici on del m aximo de
un arreglo de longitud n se presenta a continuacion
pos max R
N N
(x, n}
1, si n = 1;
k, donde {k = pos max(x, n 1})
{x
k
> x
n
);
n, en otro caso.
La codicaci on en C++ de una funci on que permite obtener la posici on del m aximo de
un arreglo de longitud n se presenta a continuacion.
int pos_max(double* x, int n){
if(n == 1){
return 0;
};
int k = pos_max(x, n - 1);
if(x[k] > x[n - 1]){
return k;
};
return n - 1;
};
Una funci on en C++ permite obtener la posicion del m aximo de un arreglo, que est a es-
crita usando estructuras cclicas y que resulta ser equivalente a la anterior es la siguiente
int pos_max(double* x, int n){
int k = 0;
for(int i = 1; i < n; i++){
if(x[k] < x[i]){
k = i;
};
};
return k;
};
174 CAP
= |x
1
, x
2
, . . . , x
n1
, x
n
| tal que {x
1
, x
2
, . . . , x
n1
, x
n
} = {x
1
, x
2
, . . . , x
n1
, x
n
} y el arreglo
x
1
x
2
x
n1
x
n
. Una funci on
recursiva que permite calcular la posici on del maximo de un arreglo se puede modelar
matem aticamente teniendo en cuenta que:
Si el arreglo tiene una unica componente, entonces el arreglo ya se encuentra orde-
nado ascendentemente.
Si el arreglo tiene m as de una componente, entonces, para ordenar un arreglo se
puede utilizar el metodo de seleccion, en este caso se intercambia el valor maximo
del arreglo con la componente que se encuentra en el ultimo elemento del arreglo, y
esto se realiza con cada subarreglo que no contiene la ultima componente del arreglo
original.
La codicacion en C++ de una funcion que permite obtener un arreglo ordenado as-
cendentemente a partir de un arreglo dado de longitud n se presenta a continuacion.
Esta funcion hace un llamado a la funcion que permite obtener la posici on del m aximo
de un arreglo dado y este se utiliza para intercambiar el elemento mayor a la ultima
posicion, para realizar esto es necesario utilizar una variable adicional o auxiliar t que
se utiliza para almacenar moment aneamente el valor de una de las componentes mientras
esta cambia su valor por el de la otra componente, y el valor de la otra componente cambia
al valor almacenado en la variable t. Este procedimiento muy com un al ordenar arreglos
se conoce en programaci on como un swap de variables.
ordenar R
N R
(x, n}
x, si n = 1;
ordenar(x, n 1}, donde {k = pos max(x, n})
(t = x
k
} (x
k
= x
n
} (x
n
= t}.
La codicacion en C++ de una funcion que permite obtener un arreglo ordenado as-
cendentemente a partir de un arreglo dado de longitud n se presenta a continuacion.
10.3. ARREGLOS Y FLUJOS DE DATOS 175
double* ordenar(double* x, int n){
if(n == 1){
return x;
}else{
int k = pos_max(x, n);
double t = x[k]; //swap 1
x[k] = x[n-1]; //swap 2
x[n-1] = t; //swap 3
return ordenar(x, n-1);
};
};
Una funci on en C++ que permite obtener un arreglo ordenado ascendentemente a
partir de un arreglo dado, que esta escrita usando estructuras cclicas y que resulta ser
equivalente a la anterior es la siguiente
double* ordenar(double* x, int n){
for(int i = n; i >= 1; i--){
int k = pos_max(x, i);
double t = x[k];
x[k] = x[i - 1];
x[i - 1] = t;
};
return x;
};
176 CAP
i=1
(x
i
x}
2
6. Modele mediante una funci on matem atica y desarrolle un algoritmo en C++ que
permita hallar la desviacion est andar S de los datos almacenados en un vector de
n umeros reales. La desviacion est andar S est a dada por la expresi on
S =
_
1
n 1
n
i=1
(x
i
x}
2
7. Implementar la criba de Erat ostenes para calcular los n umeros primos en el rango 1
a n, donde n es un n umero natural dado por el usuario.
8. Modele mediante una funci on matem atica y desarrolle un algoritmo en C++ que
calcule el producto por escalar de una constante con un vector de n umeros reales.
Sea R y v = (v
1
, v
2
, . . . , v
n
}, el producto por escalar de con v (notado v) es el
vector dado por la expresion
v = (v
1
, v
2
, . . . , v
n
}
9. Modele mediante una funci on matem atica y desarrolle un algoritmo en C++ que cal-
cule la suma de dos vectores de n umeros reales de igual tama no. Sean
v = (v
1
, v
2
, . . . , v
n
} y w = (w
1
, w
2
, . . . , w
n
} dos vectores, la suma de v y w (nota-
do v + w) es el vector dado por la expresion
v + w = (v
1
+ w
1
, v
2
+ w
2
, . . . , v
n
+ w
n
}
10.3. ARREGLOS Y FLUJOS DE DATOS 177
10. Modele mediante una funcion matem atica y desarrolle un algoritmo en C++ que cal-
cule la resta de dos vectores de n umeros reales de igual tama no. Sean
v = (v
1
, v
2
, . . . , v
n
} y w = (w
1
, w
2
, . . . , w
n
} dos vectores, la resta de v y w (notado
v w) es el vector dado por la expresion
v w = (v
1
w
1
, v
2
w
2
, . . . , v
n
w
n
}
11. Modele mediante una funci on matem atica y desarrolle un algoritmo en C++ que
calcule el producto punto de dos vectores de n umeros reales de igual tama no. Sean
v = (v
1
, v
2
, . . . , v
n
} y w = (w
1
, w
2
, . . . , w
n
} dos vectores, el producto punto de v y w
(notado v w) es el n umero dado por la expresi on
v w =
n
i=1
v
i
w
i
= v
1
w
1
+ v
2
w
2
+ + v
n
w
n
12. Modele mediante una funci on matem atica y desarrolle un algoritmo en C++ que cal-
cule el producto directo de dos vectores de reales de igual tama no. Sean
v = (v
1
, v
2
, . . . , v
n
} y w = (w
1
, w
2
, . . . , w
n
} dos vectores, el producto directo de v
y w (notado v w) es el vector dado por la expresion
v w = (v
1
w
1
, v
2
w
2
, . . . , v
n
w
n
}
13. Desarrollar un algoritmo que determine la mediana de un arreglo de reales. Para
calcular la mediana del arreglo primero se debe ordenar el arreglo y luego de ser
ordenado el arreglo, la mediana es el n umero que queda en la mitad del arreglo
resultante si la longitud del arreglo es impar, y si la longitud del arreglo es par
entonces la mediana es igual a la semisuma de los dos datos ubicados en la mitad
del arreglo.
14. Hacer un algoritmo que deje al nal de un arreglo de n umeros enteros todos los ceros
que aparezcan en dicho arreglo.
Ejemplo.
arreglo original: [1, 6, 0, 7, -3, 8, 0, -2, 11]
arreglo salida: [1, 6, 7, -3, 8, -2, 11, 0, 0]
Ejemplo.
arreglo original: [0, 11, 36, 10, 0, 17, -23, 81, 0, 0, 12, 11, 0]
arreglo salida: [11, 36, 10, 17, -23, 81, 12, 11, 0, 0, 0, 0, 0]
15. Suponga que un arreglo de enteros esta lleno de unos y ceros y que el arreglo re-
presenta un n umero binario al reves. Hacer un algoritmo que calcule los n umeros en
base decimal que representa dicho arreglo de unos y ceros.
Ejemplo.
178 CAP