Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prof. J. C. Medina
Obs : El nmero de subndices determina la dimensin del arreglo. Un arreglo es un tipo estructurado de datos que permite agrupar elementos primitivos del mismo tipo y asociar un nmero de orden a cada elemento. Declaracin de un arreglo unidimensional TipoDato IdentificadorArrreglo[tamao]
tamao : constante de tipo entero positivo. Ej. : int x[10] ; /* Contiene 10 elementos c/u de tipo entero */ float y[300] ; /* Contiene 300 elementos c/u de tipo float */ char ch[40]; /* Contiene 40 elementos c/u de tipo char */ Cabe destacar que el arreglo es una estructura esttica, es decir, el nmero de elementos queda determinada en el momento que su compilacin. No es posible volver a modificar el tamao del arreglo cuando se est ejecutando el programa. A veces es conveniente definir el tamao de un arreglo mediante una constante simblica. Ej. : #define MAX 400 ......... int X[MAX] ;
Prof. J. C. Medina
Para asignar valores a los elementos de un arreglo se debe calcular el valor del ndice y luego accesar a la estructura y asignar el valor del elemento correspondiente. NombreArreglo[ndice] = valor ; Ej. : X[3]=6 ; // En la cuarta posicin del arreglo se asigna el valor 6 Para ingresar valores a un arreglo se puede utilizar un ciclo for, do-while o while donde la variable ndice comience desde 0. Ej. : #define MAX 20 ....... int x[MAX] , i ; for(i=0 ; i<MAX ; i++) scanf(%d,x[i ]); // se lee el valor de la entrada estndar y se asigna en el arreglo x ......... Inicializacin del arreglo x con ceros. .......... i=0 ; while( i<MAX) { x[i ]=0 ; i++ ; } .......... A un arreglo se le pueden definir valores iniciales. Estos valores deben estar en el orden en que sern asignados a los elementos del arreglo. TipoDato IdentificadorArreglo[tamao] ={valor_1, valor_2,......., valor_n}; donde valor_1 ser asignado al primer elemento del arreglo, valor_2 ser asignado al segundo elemento del arreglo y as sucesivamente. Ej. : int digitos[10] ={0,1,2,3,4,5,6,7,8,9} ; float x[8] ={-0.34, 1.54, 2., 3.15} ; /* Al resto de los elementos se le asigna 0*/ char digito[10] = {0,1,2,3,4,5,6,7,8,9}; En el lenguaje C no se permiten operaciones que impliquen arreglos completos. Por ejemplo Si float A[8],B[8],C[8] ; ........ B=A ; // es ilegal. Otros lenguajes lo permiten. C=A+B ; // ilegal En este caso la asignacin debe realizarse elemento a elemento.
Prof. J. C. Medina
for(i=0 ; i<8 ; i++) B[i ]=A[i ]; // copia de arreglo o for(i=0 ;i<8 ;i++) C[i]=A[i]+B[i] ; // operaciones con los elementos Determinacin del promedio de los elementos ledos en un arreglo ...... suma=0 ; for(i=0 ; i< MAX ;i++) suma+=A[i] ; promedio = suma/MAX ; Determinar el mximo valor en un arreglo Algoritmo: Almacenar en una variable temporal el primer elemento del arreglo. Luego comparar cada uno de los elementos del arreglo con la variable temporal, si el elemento es mayor que la variable temporal cambiar su contenido por el del elemento ......... Maximo=A[0] ; i=1 ; while(i<MAX) { if(A[i] >Maximo)Maximo=A[i] ; i++ ; } otra forma .. Maximo=A[0]; for(i=1; i<MAX; i++) if(A[i]>Maximo) Maximo=A[i]; .. Ejercicio: Determinar el mnimo valor de un arreglo Determinar la posicin del primer mayor valor en un arreglo ........ Mayor=A[0] ; posicion =0 ; for(i=0 ; i<MAX ; i++) if( A[i]>Mayor) { Mayor=A[i] ; posicion =i ; } Ejercicio: Determinar la posicin del ltimo mayor valor de un arreglo. Ejercicio: Se tienen dos arreglos llamados palabraClave y Combinacin de tamaos N y M. Estos contiene nmeros enteros y se encuentran llenos. En el arreglo palabraClave se encuentran almacenados los nmeros ASCII de caracteres. En el arreglo Combinacin se encuentran las posiciones de los nmeros ASCII que estn en el arreglo
Prof. J. C. Medina
El ordenar los elementos en un arreglo es una tarea que se realiza con frecuencia. A pesar que existen numerosos algoritmos de ordenamiento veremos los ms simples. Ordenamiento Burbuja o BubleSort. Dado un arreglo A de enteros es posible ordenarlo en forma ascendente comparando dos elementos adyacentes (A[j] y A[j+1]), si no se encuentran en el orden establecido sus elementos se intercambian. Los elementos ms livianos (menores) ascienden y los pesados bajan. En la primera revisin del arreglo se realizan N-1 comparaciones, quedando el elemento mayor en la ltima posicin. En la segunda revisin se realizan N-2 comparaciones. Y as sucesivamente hasta comparar las dos primeras posiciones.
for(i=MAX-1 ; i>0 ; i--) for( j=0 ; j<i ; j++) if( A[j]>A[j+1]) { auxiliar = A[j] ; A[j]=A[j+1] ; A[j+1]= auxiliar ; } Ordenamiento por Seleccin Dado un arreglo A de enteros es posible ordenarlo en forma ascendente, determinando el prximo menor valor y colocado en orden. Como resultado de despus de i-pasadas los i-elementos menores ocupan posiciones desde A[0] hasta A[i-1] En la primera pasada se busca el menor elemento del arreglo y se intercambia con el elemento de la primera posicin. En la siguiente pasada se busca en menor elemento del subarreglo A[1] hasta A[n-1] y se intercambia con el elemento A[1]. En la siguiente pasada se busca el menor de A[2] hasta A[n-1] y se intercambia con A[2]. Y as sucesivamente hasta el subarreglo A[n-1] for(i=0; i < N ; i++) { menor = A[i]; posicion = i; for(j = i+1; j < N ; j++) { if(A[j] < menor) { menor = A[j]; posicion = j; } } A[posicion] = A[i]; A[i] = menor; }
Prof. J. C. Medina
Ordenamiento por Insercin Dado un arreglo A de enteros es posible ordenarlo en forma ascendente, Insertando cada elemento de la parte no ordenada del arreglo en la parte ordenada respetando el orden. En el i-simo recorrido se inserta el i-simo elemento A[i-1] en el orden correcto entre A[0] y A[i-2]. menor = A[0]; posicion = 0; for( i = 1 ; i< N ; i++) { if( A[i] < menor) { menor= A[i]; posicion= i; } } A[posicion] = A[0]; A[0] = menor; for( i= 2; i < N ; i++) { primerElemento = A[i]; j=i; while( primerElemento < A[j-1]){ A[j] = A[j-1]; j--; } A[j] = primerElemento; }
Prof. J. C. Medina
if( SeEncontro) printf(El dato se encuentra en la posicin %d, i) ; else printf(El dato no se encontr \n);
Otra forma de escribir lo anterior es: i=0 ; while ( (DatoBuscar != A[i]) && (i<MAX) )i++ ; if (i<MAX) printf(El dato se encuentra en la posicin %d,i) ; else printf(El dato no se encuentra \n ); Una pequea variante sera ..... i=0 ; while( DatoBuscar !=A[i] && i<MAX-1) i++ ; SeEncontro= DatoBuscar ==A[i] ? TRUE : FALSE ; .... Ntese que en el ciclo no se realiza la comparacin con el ltimo elemento. La comparacin del ltimo elemento se realiza si no se encontr en los MAX-1 elementos anteriores. Bsqueda binaria En el caso anterior los elementos se encontraban en el orden en que fueron ingresados. Por lo tanto en el peor de los casos deben realizarse N comparaciones. A veces es necesario realizar bsquedas en arreglos donde sus elementos no cambian en el tiempo. Por ejemplo, en un diccionario. En estos casos conviene que sus elementos se encuentren previamente ordenados. Si comparamos el tiempo que tardaramos en realizar una bsqueda en un diccionario donde sus palabras estn desordenas con uno en el cual estn ordenadas, nos damos cuenta que es mucho menor el tiempo de bsqueda en aquel que sus palabras estn ordenadas. Se puede comprobar que el nmero de comparaciones se reduce a log2n. Supongamos que tenemos una lista de nombres ordenada ascendente, y nos piden buscar un nombre. Lo primero que realizamos es ubicar el nombre por la mitad de la lista. Si lo ubicamos detenemos nuestra bsqueda. Si no lo tratamos de ubicar en la mitad superior o en la mitad inferior de la lista dependiendo si nombre en orden alfabtico es menor o mayor que del centro de la lista respectivamente. Este proceso se repite hasta que lo ubiquemos o bien hasta que no hay submitades para seguir buscando. Suponiendo que el arreglo A est ordenado en forma ascendente. ........ primero=0 ; ultimo=MAX-1 ; SeEncontro=FALSE ; while( (!SeEncontro) && (primero<=ultimo)){ medio=(primero+ultimo)/2 ; if( A[medio]==DatoBuscar) SeEncontro=TRUE ; else
Prof. J. C. Medina
if( A[medio]>DatoBuscar) ultimo=medio-1 ; else primero=medio+1 ; } if (SeEncontro) printf(El dato se encuentra en la posicin %d, medio) ; else printf(El dato no se encuentra \n );
La constante Dimensin_1 indica el nmero de filas y Dimensin_2 el nmero de columnas del arreglo bidimensional o matriz. Ej. float A[50][50] ; // arreglo de 50 fila por 50 columnas int B[10][5] ; // arreglo de 10 filas por 5 columnas Para tener acceso a un elemento de la matriz se debe indicar la fila y columna (recuerde que los subndices comienzan desde 0). Por ejemplo, para almacenar el valor 8 en la sexta fila y tercera columna del arreglo B definido previamente, sera B[5][2]=8. Escribir B[2][5]=8 sera incorrecto. Para recorrer una matriz se puede realizar por filas o por columnas. Si se realiza por filas se debe tener una variable i que indique la fila en que se encuentra y una variable j para recorrer todos los elementos de la fila. Por lo tanto para cada fila i se recorre cada elemento j de la fila, donde 0i<Nmero_de_Filas y 0j<Nmero_de_Columnas, es decir: for(i=0,i<MAX_FILAS ;i++) for(j=0 ; j<MAX_COLUMNAS ; j++) printf(%f,A[i][j] ); Para el recorrido de la matriz por columnas. En cada columna j se recorre todos los elemento i de la columna, es decir : for(j=0 ; j<MAX_COLUMNAS ; j++) for(i=0,i<MAX_FILAS ;i++) printf(%f,A[i][j] ); A una matriz se le pueden definir valores iniciales. Estos valores deben estar en el orden en que sern asignados a los elementos de la matriz. Ej. : int A[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ; // matriz de tres filas por 4 columnas
Prof. J. C. Medina
es equivalente de haber asignado A[0][0]=1 ; A[0][1]=2 ; A[0][2]=3 ; A[0][3]=4 ; A[1][0]=5 ; A[1][1]=6 ; A[1][2]=7 ; A[1][3]=8 ; A[2][0]=9 ; A[2][1]=10 ; A[2][2]=11 ; A[2][3]=12 ; Se pueden utilizar {} para separar las filas de la matriz. Ej. : int A[3][4]={ {1, 2, 3, 4}, {5, 6, 7, 8}, {9,10,11,12} } ; Si existen menos elementos en un par de llaves, al resto de los elementos de la fila se asignan 0. Ej. : int A[3][4]={ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } ; es equivalente a
1 2 3 0 4 5 6 0 7 8 9 0
1 2 5 6 9 0
3 4 7 8 0 0
Si existen ms valores que la dimensin de la matriz se produce un error. Los arreglos bidimensionales o matrices se procesan del mismo modo que los arreglos unidimensionales o vectores sobre la base de elemento a elemento. Ej. : Suma de dos matrices int A[5][5],B[5][5],C[5][5] ; ...... for(i=0,i<MAX_FILAS ;i++) for(j=0 ; j<MAX_COLUMNAS ; j++) C[i][j]=A[i][j]+B[i][j] ;
FArreglos Muldidimencionales
TipoDato IdentificadorArreglo[Dimensin_1][Dimensin_2][Dimensin _3].... ;
Ej. : int A[10][20][30]={ { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, { {13, 14, 15}, {16, 17, 18}, {19, 20, 21} } } Los valores son asignados al arreglo de la siguiente forma :
Prof. J. C. Medina
A[0][0][0]=1 ; A[0][1][0]=5 ; A[0][2][0]=9 ; A[0][0][1]=2 ; A[0][1][1]=6 ; A[0][1][1]=10 ; A[0][0][2]=3 ; A[0][1][2]=7 ; A[0][1][2]=11 ; A[0][0][3]=4 ; A[0][1][3]=8 ; A[0][1][3]=12 ; A[1][0][0]=13 ; A[1][1][0]=16 ; A[1][2][0]=19 ; A[1][0][1]=14 ; A[1][1][1]=17 ; A[1][2][1]=20 ; A[1][0][2]=15 ; A[1][1][2]=18 ; A[1][2][2]=21 ; Todos los dems elementos son 0.
#include <stdio.h> #include <stdlib.h> /* ordena alfabticamente una lista de cadenas este programa usa un array bidimensional de caracteres */ void main() { int i, n = 0; char x[10][12] , temp[12]; printf(Ingresar cada cadena en una lnea separada\n\n); printf(Escribir FIN para terminar el ingreso\n\n); /* leer la lista de cadenas*/ do { printf(cadena %d:, n + l); scanf(%s", x[n]); }while (strcmp(x[n++], FIN")); /* recordar que 0 es falso. No hay control de cantidad de nombres ingresados */
Prof. J. C. Medina
/* reordenar la lista de cadenas*/ for (i= n-1; i >0; i--) for(j=0; j<i ; j++) if (strcmp(x[j], x[j+1]) > 0) { /* intercambiar las dos cadenas */ strcpy(temp, x[j]); strcpy(x[j], x[j+1]); strcpy(x[j+1], temp); }
/*mostrar la lista ordenada de cadenas */ printf(\n\tLista reordenada de cadenas:\n"); for (i = 0; i < n; ++i) printf(\ncadena %d: %s, i + 1, x[i]); }