You are on page 1of 9

Universidad Nacional de Trujillo Informtica

Ingeniera de Sistemas Arreglos

ARREGLOS

1. Introduccin.

Con frecuencia podemos encontrar problemas cuya solucin es prcticamente imposible, o si la


encontramos es muy difcil de implementar si utilizamos tipos simples de datos. Por otra parte, podemos
encontrar una buena solucin al problema utilizando tipos estructurados de datos.

Cuando se tienen problemas que emplean un nmero muy grande de variables del mismo tipo,
dicho manejo puede volverse incontrolable, ocasionar ms trabajo y ser causa de errores; por ello es
necesario un nuevo tipo de datos que permita tratar estos problemas de una manera ms adecuada.
Los tipos de datos estructurados que ayudan a resolver problemas como ste son los arreglos.

2. Definicin de arreglo.

Un arreglo (tambin conocido como vector) se define una estructura de datos que almacena
una coleccin de variables del mismo tipo.

Tambin se define un arreglo como una coleccin finita, homognea y ordenada de elementos.
Finita.- todo arreglo tiene un lmite, es decir, se debe determinar cul ser el nmero
mximo de elementos que podrn formar parte del arreglo.
Homognea.- todos los elementos de un arreglo son del mismo tipo: todos enteros, todos
caracteres, etc., pero nunca una combinacin de distintos tipos.
Ordenada.- se puede determinar cul es el primer elemento, el segundo, el tercero, y el
nsimo elemento.

Un arreglo tiene la caracterstica de que puede almacenar a n elementos del mismo tipo y adems
permite el acceso a cada uno de estos elementos.

Los elementos de un arreglo se almacenan en direcciones contiguas de memoria. Para identificar


cada elemento del arreglo se utiliza el nombre del arreglo y un ndice que indica su posicin. El
primer elemento tiene como ndice el cero ( 0 ).

Nombre Valor Direccin


A[0] 3 1000
A[1] 8 1004
A[2] 1 1008
A[3] 15 1012
A[4] 10 1016

Para el ejemplo mostrado, el nombre del arreglo es A, los ndices se indican entre corchetes y es
un arreglo de tamao 5, es decir, puede almacenar 5 valores numricos.

3. Declaracin de un arreglo.

Para declarar un arreglo se especifica el tipo de dato de sus elementos, seguido por el nombre
del arreglo y, finalmente, por el tamao del arreglo que se indica entre corchetes. El tamao del
arreglo es la cantidad mxima de elementos que se puede guardar.

La estructura de la definicin de un arreglo es la siguiente:

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -1-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

TipoDatoElemento NombreDeArreglo[TamaoArreglo];

La declaracin del arreglo con el lenguaje de programacin C++ ser:

int notas[5];
char letras[10];

La primera lnea declara un arreglo de nombre notas, de tamao 5, que almacenar 5


elementos cuyos calores sern nmeros enteros (el tipo de dato es int) desde la posicin 0 hasta la
posicin 4. Mientras que la segunda lnea declara un arreglo de nombre letras, de tamao 10, que
almacenar 10 elementos cuyos valores sern caracteres (el tipo de dato es char) desde la posicin 0
hasta la posicin 9.

4. Inicializacin de un arreglo.

Se puede inicializar un arreglo al momento de declararlo escribiendo sus valores entre llaves y
separados por comas. En este caso no es necesario especificar el tamao del arreglo.

La estructura de la inicializacin de un arreglo es la siguiente:

TipoDatoElemento NombreDeArreglo[]={valor1, valor2, };

La inicializacin del arreglo con el lenguaje de programacin C++ ser:

double precios[] = {10.5, 17.9, 9.2, 10.8};


char letras[] = {a, e, i, o, u};

La primera lnea inicializa al arreglo de nombre precios, asignndole 4 valores decimales (el
tipo de dato es double), lo que determina que su tamao sea 4. La segunda lnea inicializa al arreglo
de nombre letras, con la asignacin de 5 caracteres (el tipo de dato es char), definiendo su
tamao a 5. Si el arreglo ya ha sido declarado, no pueden asignarse posteriormente valores usando las
llaves.

En el caso de arreglos de valores numricos, cuando se inicializan slo algunos de sus


elementos, los restantes se inicializan a 0. Debe entonces indicarse el tamao del arreglo.

int numeros[10] = {13};

En este caso, en la primera posicin del arreglo (la posicin 0) se asigna el valor 13, las
restantes 9 posiciones se inicializan todas a 0.

5. Ingreso de datos en un arreglo.

Si el arreglo ha sido declarado, pero no inicializado, los valores se asignan en cada posicin del
arreglo generalmente a travs de una estructura repetitiva.

Ejemplo 1. Declarar un arreglo de nmeros enteros, de tamao 5, e ingresar valores en l.

#define TAM 5
int edad[TAM];

void ingresarElemento(int n) {
for(int i=0; i<n; i++){
cout<<Ingrese una edad: ;
cin>>edad[i];
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -2-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

La estructura repetitiva for, establece la cantidad de valores que se ingresarn.

6. Listar los datos de un arreglo.

Si el arreglo ya contiene datos, podemos hacer un listado de sus elementos.

Ejemplo 2. Mostrar los datos ingresados en el arreglo edad del ejemplo previo.

void listarElementos(int n)
{
for(int i=0; i<n; i++){
cout<<Edad[<<i<<] = <<edad[i]<<endl;
}
}

La estructura repetitiva for, establece la cantidad de valores que se recuperarn.

7. Insertar un elemento en un arreglo.

Para insertar un elemento en un arreglo en el cual se han ingresado datos debe conocerse la
posicin en la cual se desea insertar el nuevo elemento. Este procedimiento implica que el nmero de
elementos del arreglo se incremente en uno o que el valor de la ltima posicin del arreglo se pierda.

Conocida la posicin, los elementos que se encuentran a continuacin de esta son desplazados
una posicin hacia abajo. Finalmente el nuevo elemento se inserta en la posicin indicada.

int insertarElemento(int n, int pos, int nuevaEdad) {


for(int i=n-1; i>=pos; i--){
edad[i+1] = edad[i];
}
edad[pos] = nuevaEdad;
n= n+1;
return n;
}

La estructura repetitiva for, realiza el desplazamiento de los elementos una posicin abajo,
empezando desde el ltimo elemento hasta el elemento que se encuentra en la posicin en la cual se
insertar el nuevo valor. Una vez terminado el desplazamiento, se asigna el nuevo elemento en la
posicin indicada y el tamao del arreglo se incrementa en uno.

Debe verificarse que exista el espacio disponible para la insercin a fin de no perder ningn
elemento.

8. Eliminar un elemento en un arreglo.

Para eliminar un elemento de un arreglo el cual contiene datos debe conocerse la posicin
que dicho elemento ocupa dentro del arreglo. Este procedimiento implica que el nmero de
elementos del arreglo disminuya en uno. Conocida la posicin, los elementos que se encuentran a
continuacin de esta son desplazados una posicin hacia arriba.

int eliminarElemento(int n, int pos) {


for(int i=pos; i<n; i++){
edad[i] = edad[i+1];
}
n = n-1-;
return n;
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -3-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

9. Ordenar los elementos de un arreglo.

Para realizar el ordenamiento de los elementos de un arreglo podemos utilizar diferentes


mtodos: Burbuja, Insercin, Mezcla, Ordenamiento Rpido, etc.

En este caso aplicaremos el mtodo de la Burbuja que es uno de los mtodos ms utilizados por
su facilidad y porque funciona bastante bien cuando se tienen pocos datos que ordenar.

void ordenarElemento(int n, int pos)


{
int aux;
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(edad[i] > edad[j]) {
aux = edad[i];
edad[i] = edad[j];
edad[j] = aux;
}
}
}
}

10. Ejercicios desarrollados.

10.1. Hacer un programa que permita ingresar N caracteres en un arreglo, que los ordene y los liste.
Haga uso de subprogramas.

#include iostream
#define TAM 30 // Variable global y constante
char c[TAM]; // Variable global

// Declaracin de Funciones y Procedimientos


int Validar();
void Ingreso(int);
void Listado(int);
void Ordenar(int);
void main();

// Implementacin de Funciones y Procedimientos


int Validar() {
int num;
do {
cout<<endl<<"Cantidad de caracteres: ";
cin>>num;
} while(num<1 || num>TAM);
return num;
}

void Ingreso(int n) {
int cont=0;
while (cont < n) {
cout<<"Ingrese un caracter: ";
cin>>c[cont];
cont = cont+1;
}
}

void Listado(int n) {
int cont;
for (cont=0; cont<=n-1; cont++) {
cout<<"C["<<cont<<"] = "<<c[cont]<<endl;
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -4-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

void Ordenar(int n) {
int cont, i;
char aux;
for (cont=0; cont<=n-2; cont++) {
for (i=cont+1; i<=n-1; i++) {
if (c[cont] > c[i]) {
aux = c[cont];
c[cont] = c[i];
c[i] = aux;
}
}
}
}

void main() {
int n;
n = Validar();
cout<<endl<<"Ingreso de datos"<<endl;
Ingreso(n);
cout<<endl<<"Listado de datos"<<endl;
Listado(n);
cout<<endl<<"Listado de datos ordenados"<<endl;
Ordenar(n);
Listado(n);
}

10.2. Hacer un programa que permita ingresar N nmeros enteros en un arreglo, que los liste y que
permita que se eliminen elementos mientras el usuario as lo indique y mientras hayan
elementos en el arreglo. La eliminacin se realiza indicando la posicin que ocupa el elemento
dentro del arreglo.
#include iostream
#define TAM 20
int a[TAM];

int Validar();
void Ingreso(int);
void Listado(int);
int Eliminar(int);

int Validar() {
int num;
do {
cout<<endl<<"Cantidad de numeros: ";
cin>>num;
}while (num<1 || num>TAM);
return num;
}

void Ingreso(int n) {
int cont;
for (cont=0; cont<=n-1; cont++) {
cout<<"Ingrese un numero: ";
cin>>a[cont];
}
}

void Listado(int n) {
int cont;
for (cont=0; cont<=n-1; cont++) {
cout<<"A["<<cont<<"] = "<<a[cont]<<endl;
}
}

int Eliminar(int n) {
int cont, pos;
do {

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -5-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

cout<<endl<<"Posicion del numero a eliminar (0-"<<(n-1)<<") : ";


cin>>pos;
}while(pos<0 || pos>n-1);
for (cont=pos; cont<=n-2; cont++) {
a[cont] = a[cont+1];
}
n = n-1;
if (n>0) {
cout<<endl<<"Listado de datos"<<endl<<endl;
Listado(n);
}
return n;
}

void main() {
int n;
char rpta;
n = Validar();
cout<<endl<<"Ingreso de datos"<<endl<<endl;
Ingreso(n);
cout<<endl<<"Listado de datos"<<endl<<endl;
Listado(n);
cout<<endl<<"Eliminacion de datos"<<endl<<endl;
do {
n = Eliminar(n);
if (n>0) {
cout<<endl<<"Desea eliminar otro numero (S/N)? ";
cin>>rpta;
} else {
cout<<endl<<"Ya no hay datos para eliminar";
}
}while (n>0 && (rpta=='s' || rpta=='S'));
cout<<endl<<endl;
}

10.3. Hacer un programa que permita ingresar N nmeros reales en un arreglo, que los liste y que
permita que se inserten elementos mientras el usuario as lo indique y mientras haya espacio en
el arreglo. La insercin se realiza indicando la posicin que ocupar el elemento que se
insertar as como tambin debe indicarse el nuevo valor a insertar.

#include iostream
#define TAM 6
double r[TAM];

int Validar();
void Ingreso(int);
void Listado(int);
int Insertar(int);
void main();

int Validar() {
int num;
do {
cout<<endl<<"Cantidad de numeros (1-"<<TAM<<") : ";
cin>>num;
}while (num<1 || num>TAM);
return num;
}

void Ingreso(int n) {
int cont;
for (cont=0; cont<=n-1; cont++) {
cout<<"Ingrese un numero real: ";
cin>>r[cont];
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -6-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

void Listado(int n) {
int cont;
for (cont=0; cont<=n-1; cont++) {
cout<<"R["<<cont<<"] = "<<r[cont]<<endl;
}
}

int Insertar(int n) {
int cont, pos;
double valor;
do {
cout<<endl<<"Posicion del numero a insertar (0-"<<(n-1)<<") : ";
cin>>pos;
}while (pos<0 || pos>n-1);
cout<<"Valor del numero a insertar: ";
cin>>valor;
for (cont=n-1; cont>=pos; cont--) {
r[cont+1] = r[cont];
}
r[pos] = valor;
n = n+1;
if (n <= TAM) {
cout<<endl<<"Listado de datos"<<endl<<endl;
Listado(n);
}
return n;
}

void main() {
int n;
char rpta;
n = Validar();
cout<<endl<<"Ingreso de datos"<<endl<<endl;
Ingreso(n);
cout<<endl<<"Listado de datos"<<endl<<endl;
Listado(n);
cout<<endl<<"Insercion de datos"<<endl<<endl;
do {
n = Insertar(n);
if (n < TAM) {
cout<<endl<<"Desea insertar otro numero (S/N)? ";
cin>>rpta;
} else {
cout<<endl<<"Ya no hay espacio en el arreglo";
}
}while (n<TAM && (rpta=='s' || rpta=='S'));
cout<<endl<<endl;
}

10.4. Hacer un programa que permita ingresar N caracteres en un arreglo, que los liste y que permita:
a. Que se eliminen elementos ingresando el carcter que se desea eliminar.
b. Que se inserten elementos ingresando el carcter que se desea insertar. En este caso el
carcter debe ser insertado en la posicin que le corresponde (en un arreglo ordenado).

#include iostream
#define TAM 20
char c[TAM];

int validar();
void ingresar(int);
void listar(int);
void ordenar(int);
int buscarIgual(int, char);
int eliminar(int, int);
int buscarMayor(int, char);
int insertar(int, int, char);
void main();

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -7-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

void main() {
int n, pos, opcion;
char letra;
n = validar();
cout<<endl<<"Ingreso de datos"<<endl;
ingresar(n);
cout<<endl<<"Listado de datos"<<endl;
listar(n);
do {
cout<<endl<<"1. Eliminar un caracter";
cout<<endl<<"2. Insertar un caracter";
cout<<endl<<"3. Salir";
cout<<endl<<"Elija una opcion (1-3): ";
cin>>opcion;
switch (opcion) {
case 1: cout<<endl<<"Caracter a eliminar: ";
cin>>letra;
pos = buscarIgual(n, letra);
if (pos != -1) {
n = eliminar(n, pos);
if (n > 0) {
cout<<endl<<"Listado de datos"<<endl;
listar(n);
} else {
cout<<endl<<"Arreglo vacio"<<endl;
}
} else {
cout<<endl<<"El caracter no se encuentra en el arreglo"<<endl;
}
break;
case 2: ordenar(n);
cout<<endl<<"Listado de datos"<<endl;
listar(n);
cout<<endl<<"Caracter a insertar: ";
cin>>letra;
pos = buscarMayor(n, letra);
n = insertar(n, pos, letra);
cout<<endl<<"Listado de datos"<<endl;
listar(n);
if (n == TAM) {
cout<<endl<<"Arreglo lleno"<<endl;
}
break;
case 3: break;
default: cout<<endl<<"Opcion no valida"<<endl;
}
}while(opcion != 3);
cout<<endl<<endl;
}

int validar() {
int n;
do {
cout<<endl<<"Caracteres a ingresar (1-"<<TAM<<"): ";
cin>>n;
}while(n<1 || n>TAM);
return n;
}

void ingresar(int n) {
int i;
for(i=0; i<n; i++) {
cout<<"Ingrese un caracter: ";
cin>>c[i];
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -8-


Universidad Nacional de Trujillo Informtica
Ingeniera de Sistemas Arreglos

void listar(int n) {
int i;
for(i=0; i<n; i++) {
cout<<"C["<<i<<"] = "<<c[i]<<endl;
}
}

void ordenar(int n) {
int i, j;
char aux;
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
if(c[i] > c[j]) {
aux = c[i];
c[i] = c[j];
c[j] = aux;
}
}
}
}

int buscarIgual(int n, char letra) {


int i, pos;
i=0;
pos=-1;
while(pos == -1 && i<n) {
if(c[i] == letra) {
pos = i;
}
i = i+1;
}
return pos;
}

int eliminar(int n, int pos) {


int i;
for(i=pos; i<n; i++) {
c[i] = c[i+1];
}
n = n-1;
return n;
}

int buscarMayor(int n, char letra) {


int pos;
pos=0;
while (c[pos] < letra && pos<n) {
pos = pos+1;
}
return pos;
}

int insertar(int n, int pos, char letra) {


int i;
for(i=n-1; i>=pos; i--) {
c[i+1] = c[i];
}
c[pos] = letra;
n = n+1;
return n;
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -9-

You might also like