You are on page 1of 13

TEMA 5 Datos estructurados 5.1.1.

Arrays unidimensionales

Antonio L. Carrillo

Tema 5: DATOS ESTRUCTURADOS 5.1. Arrays


5.1.1. Arrays Unidimensionales.
- Concepto, Definiciones de tipo array, y declaracin de arrays - Acceso a los elementos de un array - Inicializacin de arrays - Observaciones (operaciones permitidas y no permitidas). - Arrays en funciones.

5.1.2. Bsqueda y Ordenacin. 5.1.3. Arrays Multidimensionales.


- Concepto. Declaracin. - Acceso a los elementos. - Inicializacin de arrays multidimensionales (matrices, cubos,!) - Arrays multidimensionales en funciones.

5.2. Estructuras y Arrays de estructuras


2

Arrays Unidimensionales (en C++): Introduccin


Un array representa un conjunto, de tamao determinado (y definido en tiempo de compilacin), de elementos de un mismo tipo (de dato). Los arrays son tiles en aquellas situaciones en que necesitamos almacenar y manipular una coleccin de valores, y acceder a ellos de forma parametrizada, normalmente para aplicarles un proceso iterativo. Por ejemplo, podramos estar interesados en almacenar las notas de los 50 alumnos de un curso y, posteriormente, calcular la media de todas las notas, y luego contar cuantos aprueban (porque superan esa nota media). En este caso, el programador puede definir un nuevo tipo de dato (un tipo concreto de array: con espacio para 50 valores, todos ellos de tipo float), y posteriormente, crear una variable de ese tipo donde poder ya guardar las notas. Para ello, usaremos el tipo array de la biblioteca estndar de C++ del ao 2011 (C++11), por lo que habr que incluir la biblioteca con ese nombre: ! #include <array> Tambin puede ser necesario modificar algn parmetro en el entorno de programacin, para indicar que se desea usar ese estndar.

Arrays Unidimensionales (en C++): Introduccin


Un tipo array concreto se especifica o define utilizando typedef (indicando as que estamos definiendo un nuevo tipo de dato), seguido de una descripcin de las caractersticas de dicho tipo, y de un nombre con el que identificarlo a partir de ese momento. Las carctersticas del nuevo tipo se describen utilizando la palabra array, e indicando cmo son sus valores: el n de elementos, y el tipo base de todos ellos (el mismo para todos). Dicho tipo base puede ser simple o compuesto, predefinido o definido por el programador. El n de elementos debe ser una constante, conocida en tiempo de compilacin. Cuando posteriormente se declare una constante o variable de este tipo, se obtendr espacio en memoria para almacenar tantos elementos como tamao indique ese tipo array; y se podr acceder a cada uno de esos elementos o componentes del array, a travs de la posicin que ocupe, sabiendo que: -!la posicin de la primera componente (donde estar el primer valor) es la 0, -!y la de la ltima componente coincidir con el n mximo de elementos del array, menos uno (o sea, si hay 50 elementos, la posicin del ltimo ser la 49).
4

Arrays Unidimensionales (en C++): Declaracin y Acceso Un array es una coleccin de datos del mismo tipo, con el mismo nombre, y a los que se accede por su posicin. DEFINICIN de un nuevo Tipo array:
#include <array> using namespace std; typedef constante nombre_Tipo_Array

array< tipo_elemento, TAMAO>

DECLARACIN de una Variable de tipo array:


nombre_Tipo_Array variable_array;
cte, vble, o expresin

ACCESO a cada elemento: - Mediante un ndice (posicin): variable_array[indice] - Los ndices (o posiciones) van desde 0 hasta el TAMAO-1.

Arrays Unidimensionales: Declaracin y Acceso EJEMPLO:


typedef TAenteros a
a[0]
0

array<int, 5> a;!


a[1]
1

TAenteros

a[2]
2

a[3]
3

a[4]!
4

VENTAJAS de su uso frente a variables aisladas:


- Podemos referirnos a todos los elementos a la vez (al declararlos, al pasarlos a una funcin, etc). - Permite resolver problemas de forma sencilla y compacta.
6

Arrays Unidimensionales: Declaracin y Acceso


EJEMPLOS: typedef array<char, 5> TAcaracteres;

TAcaracteres typedef TA5short

c;

// Declara un array de 5 caracteres, // desde c[0] hasta c[4] TAnumeros;

array<short, 5>

a;

// Declara un array de 5 short, // desde a[0] hasta a[4]

Cmo se ALMACENAN en MEMORIA? Todos los elems CONTIGUOS.

c
Elemento Direccin
0 1 2 3 4 1000 1001 1002 1003 1004

a
0 1 2 3 4 1000 1002 1004 1006 1008

Suponemos que ambos arrays comienzan en la posicin 1000, que un short ocupa 2 bytes y un char ocupa 1 byte (cada nmero de posicin indica 1 byte).

Arrays Unidimensionales: Inicializacin "! Inicializacin y asignacin:


typedef array<int,5> Tarray;
#!

Inicializacin en la declaracin:
-! Completa
8 0 5 1 5 1 5 1 1 1 3 2 ? 2 ? 2 2 2 0 3 ? 3 7 3 3 3 1 4 ? 4 ? 4 4 4
8

Tarray vector1 = {{8,5,3,0,1}}; vector1


-! Incompleta

Tarray vector2 = {{8,5}};


#!

vector2 8
0

Asignacin en ejecucin:
-! A un elemento

vector2

8 0

vector2[3] = 7;
-! A todos los elementos

for(i=0;i<=4;i++) vector2[i] = i;

vector2 0
0

Arrays Unidimensionales: observaciones


"!

Se permite la asignacin y la comparacin completa de arrays: typedef array<int,3> Tarray; Tarray a, b={10,20,30}; ... a = b;

for(i=0; i<=2; i++) a[i] = b[i];

"!

A todos los efectos, cualquier elemento de un array se puede procesar como una variable del mismo tipo del elemento: int suma=0; cin >> a[2]; // machaca el 30 cout << a[0]; // imprime el 10 suma += a[1]; // suma el 20 //NO SE PUEDE: cout << a; NI TAMPOCO: cin >> a; //HAY QUE ESCRIBIR O LEER CADA ELEMENTO, UNO A UNO. A diferencia de otros lenguajes de programacin, C no chequea que los ndices estn dentro del rango vlido para el array: a[3]= 100; b[5]= 100;
ERROR: solo existen las posiciones 0, 1 y 2 ! Nos salimos del array ! qu pasar?

"!

Arrays Unidimensionales en Funciones


El paso de arrays como parmetros a una funcin se realiza como si fuesen datos simples, y por tanto, se pueden: - pasar por valor (si se tratan de parmetros de Entrada) - pasar por referencia (si son parm. de Salida, o de Entrada/Salida) - incluso se puede devolver un array como valor de retorno ! En la LLAMADA a una funcin, si un argumento actual es un array (ya sea de E., de S., o de E/S), se pone slo el nombre del array (sin corchetes)

! En la CABECERA de una funcin, si el array es un: ! Parm. de ENTRADA (la funcin slo necesita conocer los valores) ! NO se pone el & ! Parm. de SALIDA, o de E/S (la funcin puede modificar los valores) ! SI se pone el &
10

Arrays Unidimensionales: como Argumentos en Funciones


Ejemplo: Defincin de funcin que calcule y devuelva, como parmetro de salida, el vector suma de 2 vectores (de 100 valores como maximo, de tipo float cada uno), recibidos como parmetros de entrada. Suponga que los arrays tendrn el mismo tamao, pero no tiene por qu coincidir con el tamao mximo reservado (es decir, no tienen por qu estar llenos los arrays de entrada):

typedef array<int,100> Tarr; ... void suma_arrays(Tarr a1, Tarr a2, int tam, Tarr & suma ) { for (int i=0; i < tam; i++ ) suma[i] = a1[i] + a2[i]; }

Si en la funcin se necesita conocer el tamao ocupado de un array (la cantidad de elementos a considerar del array), se le deber pasar como parmetro (tam, en el ejemplo). 11

Arrays Unidimensionales: como Argumentos en Funciones


... /* calcular producto escalar de dos vectores */ const int TMAX = 10; //Tamao mximo de los vectores typedef array<int, TMAX> Tarray; Tarray leer_vector1( int tam ); void leer_vector2( Tarray // lo devolver con el return

&

vec, int tam ); // lo dev. como param.Sal.

int prod_escalar( Tarray v1, Tarray v2, int tam ); //--------------------------------------------------int main() { Tarray v1, v2; int prod; /* supongamos, por ejemplo, que ahora mismo queremos trabajar slo con 6 valores de los 10 que cabran */ cout << INTRODUCE 6 VALORES 1er VECTOR: ; v1 = leer1_vector( 6 ); cout << INTRODUCE 6 VALORES 2 VECTOR: ; leer2_vector( v2, 6 ); // prod = prod_escalar( v1, v2, 6 ); cout << \n Prod. Escalar = << prod; ... }
12

int main() { Tarr v1,v2; double m1,m2; int i, n; do{ cout<<Tamao(max.10)?; // Devuelve esperanza array cin >> n; float media( Tarr a, int tam) }while(n>10); { for( i=0; i<n; i++ ) { int i; double = 0.0; cout <<Intro elem << i; for( i=0; i<tam; i++ ) cin >> v1[i]; s = s + a[i]; } return (s/tam); } m1 = media(v1,n); // array al cuadrado potencia(v1,v2,n); void potencia( Tarr a1[], m2 = media(v2,n); Tarr & a2[], int tama){ int i; cout << Varianza= ; for( i=0; i<tama; i++ ) cout << m2-(m1*m1); a2[i] = a1[i] * a1[i]; } } 13 /* Clculo de la varianza de N nmeros !2= E(X2) - E(X)*E(X) donde E() es la esperanza matemtica (la media) */ typedef array<double,10> Tarr;

Arrays Unidimensionales: como Argumentos en Funciones

You might also like