Sei sulla pagina 1di 10

Lenguaje C (Apuntes Versin Beta)

Prof. J. C. Medina

& Arreglos FArreglo Unidimensional o Vector


A veces es conveniente colocar varios datos del mismo tipo compartiendo el mismo nombre. Por ejemplo las notas de los alumnos de un curso. Donde la nota0 corresponde a la del primer alumno, nota1 corresponde a la del segundo alumno y as sucesivamente. En este caso todas las notas de los alumnos se podran almacenar bajo un mismo nombre de variable llamado Nota, identificando cada una de ellas mediante un subndice. Este tipo de variable donde se pueden almacenar varios datos de un mismo tipo y en el cual se puede identificar cada uno de los datos mediante un subndice se llama arreglo unidimensional. Elemento del arreglo

Nota Nota[0] Nota[1] Nota[n-1]

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] ;

Lenguaje C (Apuntes Versin Beta)

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.

Lenguaje C (Apuntes Versin Beta)

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

F Ordenamiento de los elementos de un arreglo

Lenguaje C (Apuntes Versin Beta)

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; }

Lenguaje C (Apuntes Versin Beta)

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; }

FBsqueda de un elemento en un arreglo


Otra de las tareas frecuente que se realizan en arreglos es buscar un elemento ya sea para modificarlo, eliminarlo o insertar otro en la posicin encontrada. Bsqueda secuencial o lineal Consiste en revisar cada elemento del arreglo con un valor a buscar partiendo desde un extremo. Si el elemento i del arreglo coincide con el valor a buscar se detiene la bsqueda en caso contrario se continua hasta llegar al final del arreglo. Es necesario utilizar una variable que indique cuando detener la bsqueda. enum{ FALSE,TRUE} ; int i , SeEncontro ; ...... i=0 ; SeEncontro=FALSE ; while( (! SeEncontro) && (i<MAX) ) if( A[i]==DatoBuscar) SeEncontro=TRUE ; else i++ ;

Lenguaje C (Apuntes Versin Beta)

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

Lenguaje C (Apuntes Versin Beta)

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 );

FArreglos Bidimensionales o Matrices


Cada elemento del arreglo unidimensional es un tipo de arreglo unidimensional. Se define como : TipoDato IdentificadorMatriz[Dimensin_1][Dimensin_2] ;

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

Lenguaje C (Apuntes Versin Beta)

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

Ntese que no es lo mismo int A[3][4]={1,2,3,4,5,6,7,8,9 } ; ya que genera la matriz

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 :

Lenguaje C (Apuntes Versin Beta)

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.

& Cadena de Caracteres


Es un arreglo unidimensional donde cada componente es de tipo carcter (char). Toda cadena en C debe terminar con el carcter NULL (\0) que indicar el trmino de la cadena. Por lo tanto es necesario reservar el espacio de memoria suficiente para almacenar el carcter NULL. La mayora de los compiladores C tienen funciones de bibliotecas que permiten comparar cadenas de caracteres, copiar, concatenar, insertar, etc. Estas funciones se encuentran en la biblioteca stdlib.h . Algunas de las funciones ms comunes son: strcmp(s1,s2): Permite comparar dos cadenas de caracteres y retorna un valor entero positivo si la cadena s2 precede alfabticamente a la cadena s1. Si el valor es cero significa que las cadenas son idnticas. En cambio si el valor en negativo significa que la cadena s1 precede alfabticamente a la cadena s2. Ver el ejemplo para su utilizacin. strcpy(s1,s2) : Permite copiar la cadena s2 en s1. Ver el ejemplo para su utilizacin.

#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 */

Lenguaje C (Apuntes Versin Beta)

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]); }

Potrebbero piacerti anche