Está en la página 1de 16

Lenguaje de Programación Arreglos

Guia 5 Arreglos
Introducción

Un arreglo es una estructura de datos estática, secuencial, física y homogenea es decir


sus elementos son del mismo tipo. Cada componente puede ser referenciado
directamente por el nombre de la variable seguido de un subindice encerrado entre
corchetes.

Un Arreglo recibe el nombre de variable dimensionada, porque sus elementos


corresponden a un mismo tipo por lo que son referenciada por un mismo nombre, sin
embargo cada elemento del mismo se referencia por su indice que indica la posicion en
el arreglo. Si los elemetos son referenciados por un indice reciben el nombre de arreglo
unidimensional, si se referenciaan por dos indices reciben el nombre de arreglopas
bidimensionales, en general, si se referencian por n indices recibe el nombre de arreglos
n-dimensional.

9.1 Arreglo unidimensional

Formalmente se define como el siguiente modelo:

Sea A arreglo unidimensional:


Sea I : conjunto de Índices o posiciones de A
V : conjunto de valores de A
Definimos una función  : I V

I V

A se define como la terna (I, V, ) donde :


I es el rango de indices, V rango de valores y  una función que hace corresponder a
cada elemento de P un valor en V.

A se define por su posición física ordenada. Cada elemento de A se referencia


respectivamente a través de su índice constituidos por números consecutivos.

Augusto Cortez Vásquez Página 1


Lenguaje de Programación Arreglos

Cada elemento de A se almacena en memoria en celdas consecutivas.

CONVENIO NOTACIONAL

Los elementos de un arreglo A,pueden denotarse:

Por medio de subíndices


A1, A2, A3,...An
o por medio de parentesis o corchetes
A(1), A(2), A(3),...A(n)

A[1], A[2], A[3],...A[n]

Independientemente el numero k recibe elnombre de indice y AK, A(k) o A[k] indica la


variable subindicada.

LONGITUD DE UN ARREGLO

I  [1,N]

El conjunto de indices I es el intervalo comprendido entre [LI, LS], donde LI y LS


corresponden al limite inferior y limite superior respectivamente. I esta incluido en [1,N].
La longitud de un arreglo A esta determinada por el numero de elementos que la componen.
La longitud del arreglo A se denota como L(A) y se define como :

L(A) = LS-LI +1

Ejemplo 1

4 5 6 7 8 9 10 11

LI =4 LS =11 L(A) =11-4 = 8

A(4) corresponde al primer elemento


A(11) corresponde al ultimo elemento

El lenguaje C no realiza comprobacion de contornos en los arreglos: esto significa que no


detiene la escritura fuera del final del arreglo.

Augusto Cortez Vásquez Página 2


Lenguaje de Programación Arreglos

void main()
{ int A[10],i;
for(i=0; i < 100; i++)
A[i] = i;
}

este ciclo iterara cien veces incluso aunque A tiene solo diez elementos. Es
responsabilidad del programador asegurar que los arreglos sean suficientemente grandes
para guardar lo que pondra en ellos el programa y de comprobar verificaciones de
entorno cuando sea necesario.

Problemas de los arreglos


Los arreglos son estructuras de datos lineales, fisicas y estaticas. Lineal porque sus
elementos estan dispuestos en forma lineal fisicamente contiguos , y es estatica porque
no varia en tamaño. Al declarar un arreglo en un prograna, se separa un espacio
contiguo determinado. Por ejemplo, si se declara :

int A[100]

Cada entero ocupa dos bytes en memoria, por tanto se separara 100 x 2 = 200 bytes en
memoria. Sin embaro, durante la ejecucion de programa solo se utilizaran N<=100
espacios, N es denominada tamaño logico, mientras que 100 es el tamaño fisico. Si N es
mayor que 100, faltara espacio en el arreglo para los elelentos mayores a 100. Si N es
pequeño, se desperdiciara los espacios entre N y 100

¿Porque C no realiza comprobación?


C no realiza comprobacion de errores para no relentizar la ejecucion de un progreama,
en vez de esto C espera que el programador sea lo suficientemente responsable para
prevenir el desbordamiento de los arreglos.

El tamaño total del arreglo se calcula en bytes:

Bytes totales = sizeof(tipo) * longitud del arreglo


Representacion de arreglos lineales en memoria

Como se mencionó al inicio, las posiciones de memoria que utiliza el arreglos son
consecutivas,por lo que cada una es direccionable por direcciones contiguas.
Conociendola direccion base del arreglo , es posible obtener la dirección de cada
elemento. Esto permite el acceso a cada elemento en forma directa sin tener que hacer
una exploración secuencial como ocurre con las filas secuenciales.

Definimos

Augusto Cortez Vásquez Página 3


Lenguaje de Programación Arreglos

LOC(A(i)) como la dirección del elemento A(i) del arreglo A

Si consideramos

BASE(A) la dirección del A


W numero de palabras que ocupa la celda A(i) en memoria

Entonces LOC(A(k)) = BASE(A)+ w *(k-LI)

Ejemplo 2
4 5 6 7 8 9 10 11

A
LI =4 LS =11 L(A) =11-4 = 8
Si consideramos Base(A) =100 w =3

LOC(A(4)) = BASE(A)+ w (k-LI) =100 +3(4- 4) = 100


LOC(A(5)) = BASE(A)+ w (k-LI) =100 +3(5- 4) = 103
LOC(A(11)) = BASE(A)+ w (k-LI) =100 +3(11-4) = 121

Un arreglo es una secuencia de datos del mismo tipo que se referencian utilizando un
nombre comun. Cada elemento se accesa por medio de un indice

El arreglo consta de posiciones de memoria contiguas fisicamente. La dirección mas baja


corresponde al primer elemento y la mas alta al último.

Un arreglo se declara de la siguiente forma :

SINTAXIS TIPO nombre[dimension]


TIPO : tipo de datos
Nombre : nombre del arreglo
Dimension : numero de elementos del arreglo

Un arreglo se conoce tambien como una variable dimensionada, pues se referencia por un único
nombre, diferenciando sus elementos por un indice

int edad[10]
float peso[12]
char nombre[30]

Augusto Cortez Vásquez Página 4


Lenguaje de Programación Arreglos

Ejemplo 3
void main()
{ int i;
int X[10]; // reserva espacio para diez primeros enteros
for(i=1; i<=10; i++)
X[i] = i;
}

Ejemplo 9.4

void main()
{ int i,dato;
int X[10]; // reserva espacio para diez elementos enteros
for(i=1; i<=10; i++)
{ cin>>dato;
X[i] = dato;
}
Recorrido de un arreglo
En muchas aplicaciones se queire realizar alguna operacion con cada uno de los
elementos del arreglo, y aunque estos se pueden accesar en cualquier orden, es
conveniente hacer un recorrido secuencial desde el inicio hata el final.

Ejemplo 4
Crea un arreglo de longitud M, y luego muestra el arreglo

Accion arreglo() #include <iostream.h>


Inicio void main()
Entero a[10],i,M; {
Leer M int a[10],i,M;
Para I desde 1 hasta M cout<<"ingrese dimension ";
cin>>M;
Leer a[i]
for(i=1;i<=M;i++)
Fin para {cout<<"\nA[ "<<i<<"]= ";
Para I desde 1 hasta M cin>>a[i];
Escribir "A[ ",I,"]= ",a[i] }
Fin Para for(i=1;i<=M;i++)
Fin {cout<<"\nA[ "<<i<<"]= "<<a[i];
}
}

Augusto Cortez Vásquez Página 5


ALGORITMICA Y PROGRAMACION

Ejemplo 5
Un obra de hidráulica requiere de un equipo de tecnicos. Cada tecnico registra su nombre,
edad, especialidad
arregloObra [] tipo especialista
Registro Persona
string Código
string Nombre
fechaFecha nacimiento
String especialidad
FinReg
JosePerez
24/12/1987
topografo
Registro Obra 7
string Código
Persona P[] 3
FinReg

Ejemplo 6
Verificar si un arreglo la suma de los elementos pares es
igual a la suma de los elementos impares.
Especificacion:
A:vector b:boleana
Precondicion: A: vector
i,n : entero
SI, SP: real
funcion arreglo: ( A:vector) dev( b:boleana)
Postcondicion:

b= ᴲ iE 1..n /
b si SP=SI "se cumple"
sino SP≠SI "No cumple"

funcion arreglo()
inicio
leer vector
vector=A[i]
SP=0
SI=0
Para i=1 hasta i=n
si A[i] mod 2=1
SI=SI+ A[i]
fin_si
si A[i] mod 2=0
SP=SP+ A[i]
fin_si
fin_para

AUGUSTO CORTEZ VASQUEZ Pag. 6


ALGORITMICA Y PROGRAMACION

si SI=SP
escribir("si cumple")
sino
escribir("no cumple")
fin_si
fin

Codificacion c++
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])


{
int n,sp,si;
int A[20];
cout<<"ingrese tamaño de la cadena :";
cin>>n;

for(int i=1;i<=n;i++)
{
cout<<"Ingrese numero"<<i<<": ";
cin>>A[i];
}
sp=0;
si=0;
for(int i=1;i<=n;i++)
{
if(A[i]%2==0)
{sp=sp+A[i];}

else if(A[i]%2!=0)
{si=si+A[i];}
}
cout<<"suma de pares :"<<sp<<endl;
cout<<"suma de impares :"<<si<<endl;

if (sp==si)
cout<<"se cumple\n";
else cout<<"No se cumple\n";

system("PAUSE");
return 0;
}

Ejemplo 7
Verificar si un arreglo la suma de los valores de posición pares es igual a
la suma de los valores de posiciones impares.
Especificacion:
A:vector b:boleana
Precondicion: A: vector

AUGUSTO CORTEZ VASQUEZ Pag. 7


ALGORITMICA Y PROGRAMACION

i ,n: entero
SI, SP: real
funcion arreglo2: ( A:vector) dev( b:boleana)
Postcondicion:

b= ᴲ kE 1..n / SI=∑ ,∑
b si SP=SI "se cumple"
sino SP≠SI "No cumple"
funcion arreglo2()
inicio
leer vector
vector=A[i]
SP=0
SI=0
Para i=1 hasta i=n incr=2

SI=SI+ A[i]
fin_para
Para i=2 hasta i=n incr=2

SP=SP+ A[i]
fin_para

si SI=SP
escribir("si cumple")
sino
escribir("no cumple")
fin_si
fin
Codificacion c++

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])


{
int n,sp,si;
int A[30];
cout<<"ingrese tamaño de la cadena :";
cin>>n;

for(int i=1;i<=n;i++)
{
cout<<"Ingrese numero"<<i<<": ";
cin>>A[i];
}
sp=0;
si=0;
for(int i=1;i<=n;i=i+2)
{
si=si+A[i];}
for(int i=2;i<=n;i=i+2)
{

AUGUSTO CORTEZ VASQUEZ Pag. 8


ALGORITMICA Y PROGRAMACION

sp=sp+A[i];}

cout<<"suma de posicion par :"<<sp<<endl;


cout<<"suma de posicion impar :"<<si<<endl;

if (sp==si) cout<<"se cumple\n";


else cout<<"No se cumple\n";
system("PAUSE");
return 0;
}

Arreglos bidimensionales
Un arreglo bidimensional es un arreglo de arreglos unidimensionales. Es decir es un
arreglo unidimensuional cuyos elementos son arreglos unidimensionales
Si el arreglo se referencia por dos índices se denomina arreglo bidimensional.

Formalmente se define como el siguiente modelo:

Sea A arreglo unidimensional:


Sea I , J : conjunto de Índices o posiciones de A
V : conjunto de valores de A

Definimos una función  : I xJ V

I V

AUGUSTO CORTEZ VASQUEZ Pag. 9


ALGORITMICA Y PROGRAMACION

A se define como la terna (I, J, V, ) donde :


I,J es el rango de indices, V rango de valores y  una funcion que hace corresponder a cada
par(i,j) I x J un valor en V.
I esta definido en [1,M] y J esta definido en [1,N]

A es de tamaño M X N

CONVENIO NOTACIONAL

Los elementos de un arreglo A,pueden denotarse:

Por medio de subíndices


A11, A21, A31,...An1

o por medio de parentesis o corchetes


A(1,1), A(2,1), A(3,1),...A(n,1)

A[1,1], A[2,1], A[3,1],...A[n,1]

Independientemente los numeros i,j reciben el nombre de indices y Aij, A(i,j) o A[i,j]
indica la variable subindicada.
A puede interpretarse matemáticamente como una matriz de orden MxN donde M
representa el numero de filas y N representa el numero de columnas. El elemento A(i,j)
representa el valor correspondiente a la fila i y la columna j.

REPRESENTACION DE ARREGLOS LINEALES EN MEMORIA

Al igual que el arreglo unidimensional, los arreglos bidimensionales tambien ocupan


posiciones contiguas de memoria, por lo que conociendo la direccion base, es posible
accesar a cualquier elemento sin tener que hacer una exploracion secuencial.

Aunque la matriz es de orden MxN , esta se puede representar en forma


unidimensional en un vector V de orden o tamaño MxN

Esta representacion puede ser por filas o por columnas.

AUGUSTO CORTEZ VASQUEZ Pag. 10


ALGORITMICA Y PROGRAMACION

En una representacion por filas V contiene los elementos de A dispuestos fila por fila.

...

Fila 1 fila 2 fila m

En una representacion por columnas V contiene los elementos de A dispuestos columnas


por columna.
...

Col. 1 Col. 2 Col. n

Definimos

LOC(A(i,j)) como la direccion del elemento A(i,j) del arreglo A

Si consideramos
BASE(A) la direccion del A
W numero de palabras que ocupa la celda A(i) en memoria

Entonces

Si se representa por filas LOC(A(i,j)) = BASE(A)+ w *[M(i-1)+(j-1)]

Si se representa por columnas LOC(A(i,j)) = BASE(A)+ w *[M(j-1)+(i-1)]

INICIALIZACIÓN DE ARREGLOS BIDIMENSIONALES

Ejemplo 8
Entero A[5][2] ={ 1,1,
2,4,
3,9,
4,16,
5,25
};

Entero TALLA[2][3] ={ 1.56 , 1.76 , 1.32,


1.72 , 1.61 , 1.28,
};

AUGUSTO CORTEZ VASQUEZ Pag. 11


ALGORITMICA Y PROGRAMACION

Ejemplo 9

Ingresa una matriz y luego la muestra


Entrada : a[i][j] para todo i,j
Salida : a[i][j] para todo i,j

Entero a[10][10],i,j,M,N; int a[10][10],i,j,M,N;


Accion ingresa() void ingresa()
Inicio {
Para I desde 1 hasta M for(i=1;i<=M;i++)
Para J desde 1 hasta N for(j=1;j<=N;j++)
{cout<<"\nA[
Leer a[i][j]
"<<i<<","<<j<<"]= ";
Fin Para cin>>a[i][j];
Fin Para }
Fin }
void muestra()
Accion Muestra() {
Inicio for(i=1;i<=M;i++)
Para I desde 1 hasta M for(j=1;j<=N;j++)
Para J desde 1 hasta N {cout<<"\nA[
Escribir a[i][j] "<<i<<","<<j<<"]= "<<a[i][j];
Fin Para }
}
Fin Para
void main()
Fin {
cout<<"ingrese dimension ";
Acion Principal cin>>M>>N;
Inicio ingresa();
Leer M,N muestra();
Ingresa() }
Muestra()
Fin

Ejemplo 10
Verifica si una matriz la suma de los elementos de la diagonal principal es igual a la suma
de los elementos de la diagonal secundaria

Diagrama de entrada y salida


A b

AUGUSTO CORTEZ VASQUEZ Pag. 12


ALGORITMICA Y PROGRAMACION

A:{ la matriz debe ser cuadrada}

P : FUN DIAGONAL(A:MATRIZ, N:entero) DEV (b: booleano)


N N
B:{b  A[i,i] =  A[i , ,N+1-i] }
i=1 i=1

int a[10][10], public boolean verifica()


void carga() {int DP=0,DS=0;
{ for(int i=0;i<5;i++) for(int i=0;i<5;i++)
for(int j=0;j<5;j++) { DP=DP+A[i][i];
A[i][j]=i+j-1; DS=DS+A[i][5-1-i];
} }
if(DP == DS) return true;
void mostrar() else return false;
{
for(int i=0;i<5;i++) }
for(int j=0;j<5;j++) void main()
cout<<A[i][j]+" "; {
} carga();
mostrar();
if(verifica()) cout<<”es igual ");
else cout<< "no es igual";
Ejemplo 11 }
Verifica si una matriz es simétrica

Diagrama de entrada y salida


A b

A:{ la matriz debe ser cuadrada}

P : FUN SIMETRICA(A:MATRIZ, N:entero) DEV (b: booleano)

B:{b A[i,j] = A[j, i]  i, j  {1..N} }

AUGUSTO CORTEZ VASQUEZ Pag. 13


ALGORITMICA Y PROGRAMACION

int a[10][10],i,j,M; void main()


int simetrico() {
{ cout <<"ingrese dimension ";
for(i=1;i<=M;i++) cin>>M;
for(j=1;j<=M;j++) for(i=1;i<=M;i++)
if(a[i][j]=a[j][i]) for(j=1;j<=M;j++)
return 1; {cout<<"elemento "<<i<<j;
else cin>>a[i][j];
return 0; }
if ( simetrico()==1)
cout <<"la matriz es simétrica ";
} else
cout <<"la matriz no es simétrica";
}

Ejemplo 12

Producto de dos matrices


Sea A con M filas y N columnas y B con P filas y Q columnas. Para que exista el
producto, ambas matrices deben ser compatibles es decir N = P

Definimos TIPO MAT = MATRIZ [1..MAX, 1..MAX] de enteros

A : { 1 M,N,P,Q  MAX , N=P}


P : FUN PRODUCTO(A:MAT, M,N:entero, B : MAT, P,Q:entero) DEV
(C:MAT, K,L: entero)
M

B : { C[i,j] =  A[i,k] * B[k,j]  i  {1..N}  j  {1..Q}}}


k=1

1 2 1 2 3 9 12 15
* =
3 4 4 5 6 19 26 33

AUGUSTO CORTEZ VASQUEZ Pag. 14


ALGORITMICA Y PROGRAMACION

#define MAX 10
void main ()
{ int A[MAX][MAX], B[MAX][MAX],P[MAX][MAX];
int i,j,k,m1,n1,m2,n2;
cout <<"multiplicaciones de matrices \n\n";
cout << "Matriz A :\n";
cout <<"Numero de Filas = "; cin>>m1;
cout <<"Numero de Columnas = "; cin>>n1;
cout <<"ingrese los datos:\n";
for (i=1; i<=m1; i++)
{cout << "fila" <<i<< ":\t";
for (j=1; j<=n1; j++)
{cin>> A[i][j] ;cout <<"\t";}
}
cout << "Matriz B :\n";
cout <<"Numero de Filas = "; cin>>m2;
cout <<"Numero de Columnas = "; cin>>n2;
cout <<"ingrese los datos:\n";
for (i=1; i<=m2; i++)
{cout << "fila" <<i<< ":\t";
for (j=1; j<=n2; j++)
{cin>> B[i][j] ;cout <<"\t";}
}
if (n1 != m2)
{cout <<"no se puede multiplicar ";
cout <<"las matrices no son compatibles ";
}
else
{
for (i=1;i<=m1;i++)
for(j=1; j<=n2; j++)
{ P[i][j]=0;
for(k=1; k<=n1; k++)
P[i][j]=P[i][j]+A[i][k]*B[k][j];

}
}
cout <<"\n\n Matriz producto :\n";
for (i=1; i<=m1;i++)
{for (j=1;j<=n2;j++)
cout <<P[i][j]<<"\t";
cout <<endl;
}
}

Para multiplicar dos matrices se requiere la precondicion que el número de columnas de


la primera matriz y el número de filas de la segunda matriz sean iguales. Cuando esto
ocurre se dicen que son compatibles respecto de la multiplicación. Observemos que la
multiplicación de matrices no es conmutativa, por ejemplo se puede multiplicar una

AUGUSTO CORTEZ VASQUEZ Pag. 15


ALGORITMICA Y PROGRAMACION

matriz de dimension 3*4 y una de 4*5; pero no se puede multiplicar una matriz de
dimension 4*5 por otra de 3*4, pues no son compatibles.

Ejercicios resueltos
Construya una solución para

1 Crear un arreglo que contenga los N primeros números primos


2 Almacenar los nombres de los técnicos que participaran en una obra hidráulica
3 De un ejemplo (relacionado a su especialidad) de una aplicación que maneje
arreglos

Referencias bibliográficas
1) [CEVALLOS 1996] Javier Cevallos Sierra “ Curso de Programacion C++”; Edit Rama
Universidad de Alcala Madrid España.
2) [CORTEZ 1999] Cortez Vasquez,Augusto. ”Matematica Discreta”, Edit San Marcos Lima 2011
3) [CORTEZ 2010] Cortez Vásquez,Augusto. ”Algorítmica”, EDit EsVega Lima Peru 2010.
4) [CORTEZ 2013] Cortez Vasquez,Augusto. ”Algoritmia, Tecnicas Algoritmicas”, Edit
CEPREDIM UNMSM Lima 2013
5) [JOYANES 1999] Joyanes Aguilar Luis ”Estructura de datos, Algoritmos, abstracción y
objetos”; Mc Graw Hill 1999.

AUGUSTO CORTEZ VASQUEZ Pag. 16