You are on page 1of 21

Arreglos

Profesor: J. Ignacio Vzquez Herrera

Arreglos
Conjunto de elementos, todos del mismo tipo, que se almacenan en zonas de memoria contiguas y que son referenciados por un mismo nombre o identificador (variable).
+=======================================+ | elem1 | elem2 | elem3 | elem4 | +=======================================+

Si se declara un arreglo que almacene 4 valores de tipo float (4 bytes) el tamao total reservado es de 16 bytes.

Los elementos se referencian por medio de un ndice que se aplica al nombre. El ndice siempre comienza en cero. De modo que si el arreglo se llama nums, los elementos del mismo sern: nums[0], nums[1], nums[2], ... nums[n]

Ejemplo con Arreglos


#include <stdio.h> int main(void) { float nums[4]; int x; nums[0] nums[1] nums[2] nums[3] = = = = 3.8; 9.2; 15.28; 32.0;

Se declara un arreglo nums que almacena 4 valores de tipo float (4 bytes c/u) cada uno de los cuales se indexa del 0 al 3.

+=======================================+ | 3.8 | 9.2 | 15.28 | 32.0 | +=======================================+ nums[0] nums[1] nums[2] nums[3]

for(x=0;x<4;x++) printf("El elemento %d:%f\n", x, nums[x]); return 0; }

Se imprime el arreglo nums. El utilizar un ndice permite manipularlo fcilmente con una estructura repetitiva.

Leer e Imprimir un Arreglo


#include <stdio.h> int main(void) { float nums[4]; int x;

Una variante que muestra cmo los arreglos se pueden manipular fcilmente, tanto e instrucciones de entrada (por ejemplo: scanf), como en instrucciones de salida (printf); con la ayuda de estructuras repetitivas (while, do while, for ...).

for(x=0;x<4;x++){ printf("Elemento %d del arreglo: ",x); scanf("%f%*c",&nums[x]); } for(x=0;x<4;x++) printf("El elemento %d:%f\n", x, nums[x]); return 0; }

Tamao reservado para los Arreglos


#include <stdio.h> int main(void) { float nums[4]; int x;

Declarndolo as se reserva en la memoria un espacio para 4 elementos. Es responsabilidad del programador no salirse de ese lmite. Con suerte no pasa nada, pero se pudiera invadir zonas de memoria reservadas para otras variables, como sucede abajo:

for(x=0;x<6;x++){ printf("Elemento %d: ",x); scanf("%f%*c",&nums[x]); }

for(x=0;x<6;x++) printf(Elemento %d:%f\n", x, nums[x]); return 0; }

Tamao reservado para los Arreglos


#include <stdio.h> int main(void){ char cadena1[5], cadena2[5]; printf("Ingresa la cadena 1: "); gets(cadena1); printf("Ingresa la cadena 2: "); gets(cadena2); printf("cadena1=%s\n", cadena1); printf("cadena2=%s\n", cadena2); return 0; }

Un ejemplo de cmo se obtienen resultados indeseados por sobrepasar el lmite de un arreglo:

Esto pas porque el usuario ingres ms de 5 caracteres, que era el tamao asignado a ambos arreglos.

Tamao reservado en bytes


#include <stdio.h> int main(void){ char a[4]; int b[4]; float c[4]; double d[4]; printf("%d\n", printf("%d\n", printf("%d\n", printf("%d\n", return 0; } sizeof(a)); sizeof(b)); sizeof(c)); sizeof(d));

El tamao mostrado en la salida es el total reservado, aunque el uso del arreglo sea menor.

Inicializando Arreglos

#include <stdio.h> int main(void) { float arreglo1[4]={3.8, 9.2, 15.28, 32.0}; float arreglo2[]={3.8, 9.2, 15.28, 32.0}; float arreglo3[4]={3.8}; int x;

Se inicializan los 4 elementos de arreglo1 Se reserva el tamao justo para los elementos dados (4).

for(x=0;x<4;x++) printf("El elemento %d:%f\n", x, arreglo1[x]); for(x=0;x<4;x++) printf("El elemento %d:%f\n", x, arreglo1[x]); for(x=0;x<4;x++) printf("El elemento %d:%f\n", x, arreglo1[x]); return 0; }

Se inicializa el primer elemento a 3.8 y el resto se llena de ceros

Es un Arreglo un tipo de datos?


A diferencia de otros lenguajes, en C no existe un tipo de datos Array. Por eso mismo no hay muchas funciones especializadas para su manejo. Esto es porque una funcin no puede conocer el final del arreglo, a menos que se le enve el tamao como argumento. Las cadenas alfanumricas son la excepcin, debido a que incluyen un terminador nulo (\0) que permite a las funciones conocer su terminacin.

Arreglos Bidimensionales o Matrices


#include <stdio.h> int main(void){ float matriz[4][4]; int i,j,x,y;

for(x=0; x<4; x++){ for(y=0; y<4; y++){ printf("Ingresa matriz[%d][%d]=", x, y); scanf("%f%*c", &matriz[x][y]); } Otros dos ciclos }
for(x=0; x<4; x++) for(y=0; y<4; y++) printf("matriz[%d][%d]=%f\n",x,y,matriz[x][y]); }

Los arreglos bidimensionales se pueden manipular usando dos ciclos for anidados. Aqu el ingreso. El contador x controla las filas, mientras que y las columnas. En este caso leer fila por fila.

anidados para imprimir el arreglo.

Arreglos Bidimensionales o Matrices


#include <stdio.h> int main(void){ float matriz[5][5]; int i,j,x,y;
Habr que dimensionar el arreglo con un valor extra *

for(x=1; x<=4; x++){ for(y=1; y<=4; y++){ printf("Ingresa matriz[%d][%d]=", x, y); scanf("%f%*c", &matriz[x][y]); } }

Si quieres manejar los ndices desde uno, porqu en la escuela aprendiste a utilizarlos de esa forma (empezando por matriz[1][1]), puedes hacerlo. Cuando mucho desperdiciars la primera fila y la primera columna.

for(x=1; x<=4; x++) for(y=1; y<=4; y++) printf("matriz[%d][%d]=%f\n",x,y,matriz[x][y]);

* No escatimes. Es preferible declarar los arreglos con un tamao holgado.

Arreglos Tridimensionales?
Se pueden manejar arreglos de cualquier dimensin (bueno hasta 255). En el caso de un arreglo de 3 dimensiones imagina el tercer libro en la segunda fila de libros, en el primer estante de una sala que tiene 10 estantes. Podramos ubicarlo as:
libro[2][1][0]
#include <stdio.h> int main(void){ float nums[10][10][10]; nums[3][3][3] = 45.8; (libro[posicion][fila][estante])

Suponiendo que las primeras posiciones se indexaran como cero Fragmento que muestra como se manejara un arreglo de 3 dimensiones.

...
}

Inicializando Arreglos bidimensionales


#include <stdio.h> int main(void) { int a1[2][3]={ {3,9,8}, {4,5,7} }; int a2[2][3]={ 7,8,2,9,3,6 }; int x, y; for(x=0; x<2; x++) for(y=0; y<3; y++){ printf("a1[%d][%d]=%d\n",x,y,a1[x][y]); printf("a2[%d][%d]=%d\n",x,y,a2[x][y]); } return 0; }

3 4 7 9

9 5 8 3

8 7 2 6

Ambas formas son correctas

En verdad crees que las matrices se guardan en la memoria de manera rectangular?

Manipulando Arreglos bidimensionales


Declaramos una matriz de #include <stdio.h> 4 filas por 3 columnas int main(void) { int a[4][3]={ 7,8,2,9,3,6,4,3,1,5,4,6 }; int x, y;
for(x=0; x<4; x++) for(y=0; y<3; y++) printf("a[%d][%d]=%d\n",x,y,a[x][y]); for(x=0; x<3; x++) for(y=0; y<4; y++){ printf("a[%d][%d]=%d\n",x,y,a[x][y]); }

7 9 4 5

8 3 3 4

2 6 1 6

Este es el tratamiento que esperamos, sabiendo que la matriz es de 4 filas por 3 columnas
Pero se puede manejar como si fuera de 3 filas por 4 columnas !!!

Se podra tratar como si fuera de 6 por 2?

Ejemplo: sumando dos matrices


#include <stdio.h> int main(void) { int a1[4][3]={ 7,8,2,9,3,6,4,3,1,5,4,6 }; int a2[4][3]={ 4,3,9,2,1,2,5,7,2,8,2,9 }; int a3[4][3]; int x, y;
for(x=0; x<4; x++) for(y=0; y<3; y++) a3[x][y] = a1[x][y]+a2[x][y]; for(x=0; x<4; x++) for(y=0; y<3; y++) printf("a3[%d][%d]=%d\n",x,y,a3[x][y]);

a1
7 9 4 5 8 3 3 4 2 6 1 6

a2
4 2 5 8

+
3 1 7 2 9 2 2 9

a3
11 11 9 13

=
11 4 10 6 11 8 3 15

Para sumar 2 matrices ambas deben ser compatibles, es decir, tener las mismas dimensiones.

Ejemplo: sumando dos matrices


#include <stdio.h> int main(void) { int a1[4][3]={ 7,8,2,9,3,6,4,3,1,5,4,6 }; int a2[4][3]={ 4,3,9,2,1,2,5,7,2,8,2,9 }; int x, y;
for(x=0; x<4; x++) for(y=0; y<3; y++) a2[x][y] = a1[x][y]+a2[x][y]; for(x=0; x<4; x++) for(y=0; y<3; y++) printf("a2[%d][%d]=%d\n",x,y,a2[x][y]); }

a2
11 11 9 13 11 4 10 6 11 8 3 15

a1
7 9 4 5

=
8 3 3 4 2 6 1 6

a2
4 2 5 8

+
3 1 7 2 9 2 2 9

Guardando la suma en la misma matriz a2

Ejemplo: sumando dos matrices


#include <stdio.h> int main(void) { int a1[4][3], a2[4][3], a3[4][3]; int x, y; for(x=0; x<4; x++){ for(y=0; y<3; y++){ printf("a1[%d][%d]=", x, y); scanf("%d%*c", &a1[x][y]); printf("a2[%d][%d]=", x, y); scanf("%d%*c", &a2[x][y]); a3[x][y] = a1[x][y] + a2[x][y] } } for(x=0; x<4; x++) for(y=0; y<3; y++) printf("a3[%d][%d]=%d\n",x,y,a3[x][y]); }

Ahora solicitamos los valores de las matrices a1 y a2 desde el teclado y guardamos la suma en a3, para posteriormente imprimirla.

Ejemplo: sumando dos matrices


int a1[50][50], a2[50][50], a3[50][50]; int x, y, i, j; printf("num. Filas: "); scanf("%d%*c", &i); printf("num. Columnas: "); scanf("%d%*c", &j);

Se declaran de un tamao lo suficientemente grande

Se pide al usuario el tamao

for(x=0; x<i; x++){ for(y=0; y<j; y++){ printf("a1[%d][%d]=", x, y); scanf("%d%*c", &a1[x][y]); printf("a2[%d][%d]=", x, y); scanf("%d%*c", &a2[x][y]); a3[x][y] = a1[x][y] + a2[x][y]; } } ... ...

En esta versin se solicita al usuario proporcione el tamao de las matrices

Ejemplo: Traspuesta de una matriz


#include <stdio.h> int main(void){ float matrizA[20][20], matrizB[20][20]; int i,j,x,y; printf("Num. filas: "); scanf("%d%*c", &i); printf("Num. columnas: "); scanf("%d%*c", &j);

La traspuesta de una matriz se obtiene intercambiando el orden de filas y columnas


11 4 10 6 11 8 3 15 13

11 11 9 13

for(x=0; x<i; x++){ for(y=0; y<j; y++){ printf("Ingresa matrizA[%d][%d]=",x,y); scanf("%f%*c",&matrizA[x][y]); } } ...

11 11 9

11
11

4 10
8 3

6
15

Ejemplo: Traspuesta de una matriz


... for(x=0;x<i;x++){ for(y=0;y<j;y++){ printf("Ingresa matrizA[%d][%d]=",x,y); scanf("%f%*c",&matrizA[x][y]); } Ntese como el algoritmo en s } se resume a una sola lnea en la for(x=0; x<i; x++) for(y=0; y<j; y++) matrizB[y][x]=matrizA[x][y];

que a cada elemento de matrizB se le asigna otro de la matrizB pero con los ndices invertidos, ejemplo: matrizB[3][5]=matrizA[5][3]

for(x=0; x<j; x++) for(y=0; y<i; y++) printf("matrizB[%d][%d]=%f\n",x,y,matrizB[x][y]); }

Preguntas:
cucei@outlook.com