You are on page 1of 30

ARREGLOS Y ESTRUCTURAS

UNIDAD II

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Coleccin de datos del mismo tipo, almacenados en posiciones continuas de memoria. Segn el orden del ndice. Deben declararse explcitamente, par que el compilador pueda reservar el espacio de memoria donde se almacenaran los elementos, por lo stos se llaman arreglos estticos.

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


DECLARACIN DE UN ARREGLO: tipo nombre_variable [tamao]; Donde: tipo: tipo base del array tamao: nmero de elementos que tendr el array nombre_variable: nombre del arreglo Ejemplo: float deuda[10];

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


deuda[5]= 32.56; deuda[6]= 1.2e-21;

Elementos Direccin
EF00 EF04 EF08 EF0C

32.56 EF10 EF14

1.2e21 EF18 EF1C EF20 EF24

para calcular el tamao total de bytes: total_bytes= sizeof(tipo)* longitud_array


DECLARACIN CON CONSTANTES SIMBLICAS: #define N 15 int a[N]; char [N+1]; float c[N];

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Realizar un programa que acepte nmeros enteros como datos de entrada y calcule la media y el valor mximo de esos datos. El tamao del array ser fijado por el programador, y deber ser validado previamente en caso de que el numero de datos supere el tamao del arreglo. Adems, se debe indicar la finalizacin de la entrada de los nmeros, para lo cual uno de los mtodos consiste en que el usuario ingrese un valor especial (CENTINELA), que debe ser del mismo tipo que el resto de datos, y que anuncia el fin de la entrada de datos. Pero el centinela debe ser de distinto valor que los datos ingresados.

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Realizar un programa que acepte nmeros enteros como datos de entrada y calcule la media y el valor mximo de esos datos. El tamao del array ser fijado por el programador, y deber ser validado previamente en caso de que el numero de datos supere el tamao del arreglo. Adems, se debe indicar la finalizacin de la entrada de los nmeros, para lo cual uno de los mtodos consiste en que el usuario ingrese un valor especial (CENTINELA), que debe ser del mismo tipo que el resto de datos, y que anuncia el fin de la entrada de datos. Pero el centinela debe ser de distinto valor que los datos ingresados.

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


INICIALIZACIN DE ARREGLOS Se inicializan al momento de declararlos. tipo nombre_arreglo[tamao]={lista_valores}; donde: lista_valores: lista de constantes separadas por coma, cuyo tipo es compatible con tipo. Ej.: int a[5]={2,4,6,8,10};

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Ejercicio: Realizar un programa para inicializar un arreglo con el nmero de das de cada mes. Luego imprimir cada mes con su respectivo nmero de das. La salida del programa sera:
El mes 1 tiene 31 dias. El mes 2 tiene 28 dias. El mes 3tiene 31 dias. El mes 4 tiene 30 dias. El mes 5 tiene 31 dias. El mes 6 tiene 30 dias. El mes 7 tiene 31 dias.

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Ejercicio: Realizar un programa para inicializar un arreglo con el nmero de das de cada mes, siendo la lista de inicializacin ms corta que el nmero de elementos de cada ao. Luego imprimir cada mes con su respectivo nmero de das. int dias[12]= {31,28,31,30,31,30}; ** Cuando la lista es demasiado larga que el tamao del arreglo, se producir un ERROR, indicando muchas constantes a inicializador.

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


INICIALIZACIN DE ARREGLOS INDETERMINADOS: Se denominan sin tamao o no delimitados Ejemplo: int dias[]={31,28,31,30,31,30}; EJERCICIO: Realizar un programa para inicializar un array indeterminado con el nmero de das de cada mes, por lo tanto se deb determinar automticamente el tamao del array , luego imprimir cada mes con su respectivo numero de dias. Salida: El mes 1 tiene 31 dias El mes 2 tiene 28 dias

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Punteros a Arreglos: Los punteos usan directamente las direcciones de memoria. La ventaja es que los punteros hacen el trabajo ms rpidos que los arreglos. Los arreglos son por as decirlo un mtodo parecido al empleo de punteros. El nombre de un arreglo sin ndice y sin corchetes es un puntero que apunta siempre al primer elemento del array. Ej.: int meses[12]; int *p; p=meses; Por lo tanto se cumple que: p==&meses[0]; // los punteros meses y &meses[0] representan la direccin de memoria del primer elemento del arreglo.

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Ejemplo: programa que inicializa dos arreglos de tipo entero y flotante, que asigna las direcciones de los dos arreglos a variables punteros, y luego imprime las direcciones y los contenidos del array usando variables punteros.

int fechas[4]= {1,2,3,4}; int *pi, indice; float facturas[4]={1.1, 2.2,3.3,4.4}; float *pf;

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


pi=fechas; pf=facturas; for(indice=0;indice<4;indice++) printf(puntero + %d: %5p, contenido: %d \n,indice, pi+indice,(pi+indice)); printf(\n); for(indice=0;indice<4;indice++) printf(puntero + %d: %5p, contenido: %.1f\n,indice, pf+indice,(pf+indice)); printf(\n); // fechas + 2 == &fechas[2] // *fechas +2 == fechas[2] . misma direccin .mismo valor

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Indexacin de punteros: cualquier variable puntero que apunta a la primera direccin del elemento de un arreglo unidimensional, puede indexarse, es decir: int *p, a [10]; p=a; p[5]= 100; *(p+5)=100; Indexar significa poner un indice, se puede char cad[100]={}; char *p; p= cad; cad[10] = *(p+10);

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


p++ es igual a cad[i] . ???... p++ es igual a cad[i] ..??? .. p siempre apunta a cad[0]

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


ARREGLOS BIDIMENSIONALES O MULTIDIMENSIONALES: Es un arreglo de arreglos unidimensionales, llamado tambin matriz, compuesto por filas y columnas, donde al variar el primer ndice, se accesa al arreglo a lo largo de una columna, y al variar el segundo ndice, se accesa por una fila. Ejemplo: cuadro[3][4]; // se quiere acceder al elemento de la fila 1, columna 2 cuadro[0][0] cuadro[1][0] cuadro[2][0] cuadro[0][1] cuadro[0][2] cuadro[0][3] cuadro[1][1] cuadro[1][2] cuadro[1][3] cuadro[2][1] cuadro[2][2] cuadro[2][3]

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


EJERCICIO: programa que lee un nmero de filas y columnas de un arreglo bidimensional, que luego lee los elementos del arreglo y los presenta en forma de matriz. // algoritmo propuesto int a[MAX_FILA][MAX_COLUMNA]; int i,j,fila, columna; do { printf(Ingrese tamao para las filas:); scanf(%d,&fila); }while(fila<=0 || fila>MAX_FILA);

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


do { printf(Ingrese tamao para las columnas:); scanf(%d,&columna); }while(columna<=0 || columna>MAX_COLUMNA); //INGRESO DE LEMENTOS A LA MATRIZ printf(\nIngreso de elementos\n); for(i=0;i<fila;i++) for(j=0;j<columna;j++) { printf(a[%2d, %2d]=,i,j); scanf(%d,&a[i][j]); }

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES

//IMPRIME EN FORMA DE MATRIZ printf(\nElementos de la Matriz:\n); for(i=0;i<fila;i++) { for(j=0;j<columna;j++) { printf(%5d,a[i][j]); printf(\n); }

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Inicializacin d arreglos bidimensionales: Ejemplo 1: int matriz[2][3]= {{5,6},{7,8}}; Se mostrar: 5 6 0 7 8 8 Ejemplo 2: int matriz[2][3]= {5,6,7,8}; Se mostrar: 5 8 6 0 7 0

** La regla para inicializar un arreglo unidimensional se cumple para un arreglo bidimensional

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


Inicializacin de arreglos bidimensionales indeterminados: Ejemplo 1: int matriz[][3]= {1,1,2,4,3,9,4,16}; ** La regla para inicializar un arreglo unidimensional se cumple para un arreglo bidimensional

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


PUNTEROS A ARREGLOS BIDIMENSIONALES: int matriz [4][2]; int *p; Se puede apuntar al primer elemento de la primera fila y columna de la siguiente forma: p=matriz; p == &matriz[0][0] p+1 == &matriz[0][1] p+2 == &matriz[1][0] p+3 == &matriz[1][1]

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


ARREGLO DE PUNTEROS: Declaracin para un arreglo de punteros es: tipo *nombre_variable[tamao]; Ejemplo: int *x[10];
X [0] [1] . . [9]

ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES


ARREGLO DE PUNTEROS: Se ha obtenido 10 punteros, pero no existe memoria reservada para almacenar la informacin. Para esto se debe reservar memoria mediante asignacin dinmica. Ejemplo: x[2]=&var; **El acceso al valor de la variable var mediante el puntero x[2] sera *x[2]. Por ejemplo: almacenar el valor de 15 en la variable var mediante puntero x[2]: *x[2]=15;

ARREGLOS ASIGNADOS DINMICAMENTE FUNCIONES MALLOC( ) Y FREE( )


Gestin Dinmica de memoria: Consideremos un programa que evale calificaciones de los estudiantes de una asignatura (almacena c/u de las calificaciones en los elementos de una tabla), el tamao del array debe poder contener el total de alumnos matriculados en la asignatura. Por ejemplo: int asignatura[40]; Se presenta un gran incoveniente si el tamao del array solo se conoce el momento de la ejecucin, las sentencias siguientes producirn error durante la compilacin: scanf(%d, &num_estudiantes); int asignatura [num_estudiantes]; el compilador requiere que el tamao sea contante. Sin embargo no siempre se conoce la memoria necesaria hasta el momento de ejecucin.

ARREGLOS ASIGNADOS DINMICAMENTE FUNCIONES MALLOC( ) Y FREE( )


Gestin Dinmica de memoria: Por ejemplo, al almacenar una cadena tecleada por el usuario, no se puede prever a priori el tamao necesario, a menos que se reserve un array de gran dimensin y se malgaste memoria cuando no se utilice. n de estudiantes de la clase aumenta. Solucin(variar longitud del array y volver a compilar el programa). Solucin + efectiva: recurrir a punteros y a tcnicas de asignacin dinmicas de memoria. Donde el espacio de la variable asignado dinmicamente se crea durante la ejecucin del programa, al contrario que el caso de una variable local(asignada en tiempo de compilacin). El programa puede crear o destruir la asignacin dinmica en cualquier momento durante la ejecucin. Se puede determinar la cantidad de memoria necesaria en el momento en que se haga la asignacin.

ARREGLOS ASIGNADOS DINMICAMENTE FUNCIONES MALLOC( ) Y FREE( )


Gestin Dinmica de memoria: El cdigo del programa compilado se sita en segmentos de memoria denominados segmentos de cdigo. Los datos el programa, tales como variables globales, se sitan en un rea denominada segmento de datos, las variables locales y la informacin de control del programa se sitan en un rea denominada pila la memoria que queda se denomina memoria de montculo o almacn libre. Cuando el programa solicita memoria para una variable dinmica, se asigna el espacio de memoria deseado desde el montculo.

ARREGLOS ASIGNADOS DINMICAMENTE FUNCIONES MALLOC( ) Y FREE( )


Almacn Libre:
Memoria alta El montculo (Almacn libre) Memoria libre disponible en asignaciones dinmicas de memoria. SP SS DS Segmento de Pila La pila crece hacia abajo en memoria. Datos no inicializados Datos inicializados Segmento de cdigo #n CS . . . Segmento de cdigo # 2 Memoria baja Segmento de cdigo #1
Toda la memoria que queda libre despus que se carga el programa

ARREGLOS ASIGNADOS DINMICAMENTE FUNCIONES MALLOC( ) Y FREE( )


Almacn Libre: Las funciones malloc( ), realloc( ), calloc( ), free( ), asignan y liberan memoria. FUNCIN malloc ( ) Obtiene bloques de memoria. Asigna un bloque de memoria que es el nmero de bytes pasados como argumento. malloc ( ) devuelve un puntero, que es la direccin del bloque asignado en memoria. Llamada a la funcin: puntero = malloc (tamao en bytes);

ARREGLOS ASIGNADOS DINMICAMENTE FUNCIONES MALLOC( ) Y FREE( )


Almacn Libre: // generalmente se har un conversin al tipo del puntero. tipo * puntero; puntero =(tipo*) malloc (tamao en bytes); Ejemplo: long *p; p= (long*) malloc(32); Ejemplo2: int *r; r = (int*) malloc (10*sizeof(int)); // si no hay memoria disponible malloc ( ) devuelve NULL Prototipo de la funcin es: void * malloc ( size-t n);