Está en la página 1de 9

1.

1 Introduccin Supongamos que nos enfrentamos a un problema como este: Una empresa que cuenta con 150 empleados, desea establecer una estadstica sobre los salarios de sus empleados, y quiere saber cual es el salario promedio, y tambin cuantos de sus empleados gana entre $1250.00 y $2500.00. Si tomamos la decisin de tratar este tipo de problemas con datos simples, pronto nos percataramos del enorme desperdicio de tiempo, almacenamiento y velocidad. Es por eso que para situaciones de este tipo la mejor solucin son los datos estructurados. Un arreglo puede definirse como un grupo o una coleccin finita, homognea y ordenada de elementos. Los arreglos pueden ser de los siguientes tipos:

De una dimensin. De dos dimensiones. De tres o ms dimensiones. 1.2 Arreglos Unidimensionales

Un arreglo unidimensional es un tipo de datos estructurado que est formado de una coleccin finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales. El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o posteriores, esto mediante el uso de un ndice para cada elemento del arreglo que nos da su posicin relativa. Para implementar arreglos unidimensionales se debe reservar espacio en memoria, y se debe proporcionar la direccin base del arreglo, la cota superior y la inferior. REPRESENTACION EN MEMORIA Los arreglos se representan en memoria de la forma siguiente: x : array[1..5] of integer

Para establecer el rango del arreglo (nmero total de elementos) que componen el arreglo se utiliza la siguiente formula: RANGO = Ls - (Li+1) donde: ls = Lmite superior del arreglo li = Lmite inferior del arreglo Para calcular la direccin de memoria de un elemento dentro de un arreglo se usa la siguiente formula: A[i] = base(A) + [(i-li) * w] donde : A = Identificador nico del arreglo i = Indice del elemento li = Lmite inferior w = Nmero de bytes tipo componente Si el arreglo en el cual estamos trabajando tiene un ndice numerativo utilizaremos las siguientes frmulas: RANGO = ord (ls) - (ord (li)+1)

A[i] = base (A) + [ord (i) - ord (li) * w] 1.3 Arreglos Bidimensionales Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito ordenado y homogneo. El acceso a ellos tambin es en forma directa por medio de un par de ndices. Los arreglos bidimensionales se usan para representar datos que pueden verse como una tabla con filas y columnas. La primera dimensin del arreglo representa las columnas, cada elemento contiene un valor y cada dimensin representa una relacin La representacin en memoria se realiza de dos formas : almacenamiento por columnas o por renglones. Para determinar el nmero total de elementos en un arreglo bidimensional usaremos las siguientes frmulas: RANGO DE RENGLONES (R1) = Ls1 - (Li1+1) RANGO DE COLUMNAS (R2) = Ls2 - (Li2+1) No. TOTAL DE COMPONENTES = R1 * R2 REPRESENTACION EN MEMORIA POR COLUMNAS

x : array [1..5,1..7] of integer Para calcular la direccin de memoria de un elemento se usan la siguiente formula: A[i,j] = base (A) + [((j - li2) R1 + (i + li1))*w] REPRESENTACION EN MEMORIA POR RENGLONES

x : array [1..5,1..7] of integer Para calcular la direccin de memoria de un elemento se usan la siguiente formula: A[i,j] = base (A) + [((i - li1) R2 + (j + li2))*w] donde: i = Indice del rengln a calcular j = Indice de la columna a calcular li1 = Lmite inferior de renglones li2 = Lmite inferior de columnas w = Nmero de bytes tipo componente

5. Arreglos y cadenas En el siguiente captulo se presentan los arreglos y las cadenas. Las cadenas se consideran como un arreglo de tipo char. 5.1 Arreglos unidimensionales y multidimensionales Los arreglos son una coleccin de variables del mismo tipo que se referencian utilizando un nombre comn. Un arreglo consta de posiciones de memoria contigua. La direccin ms baja corresponde al primer elemento y la ms alta al ltimo. Un arreglo puede tener una o varias dimensiones. Para acceder a un elemento en particular de un arreglo se usa un ndice. El formato para declarar un arreglo unidimensional es: tipo nombre_arr [ tamao ] Por ejemplo, para declarar un arreglo de enteros llamado listanum con diez elementos se hace de la siguiente forma: int listanum[10]; En C, todos los arreglos usan cero como ndice para el primer elemento. Por tanto, el ejemplo anterior declara un arreglo de enteros con diez elementos desde listanum[0] hasta listanum[9]. La forma como pueden ser accesados los elementos de un arreglo, es de la siguiente forma: listanum[2] = 15; /* Asigna 15 al 3er elemento del arreglo listanum*/ num = listanum[2]; /* Asigna el contenido del 3er elemento a la variable num */ El lenguaje C no realiza comprobacin de contornos en los arreglos. En el caso de que sobrepase el final durante una operacin de asignacin, entonces se asignarn valores a otra variable o a un trozo del cdigo, esto es, si se dimensiona un arreglo de tamao N, se puede referenciar el arreglo por encima de N sin provocar ningn mensaje de error en tiempo de compilacin o ejecucin, incluso aunque probablemente se provoque el fallo del programa. Como programador se es responsable de asegurar que todos los arreglos sean lo suficientemente grandes para guardar lo que pondr en ellos el programa. C permite arreglos con ms de una dimensin , el formato general es:

tipo nombre_arr [ tam1 ][ tam2 ] [ tamN]; Por ejemplo un arreglo de enteros bidimensionales se escribir como: int tabladenums[50][50]; Observar que para declarar cada dimensin lleva sus propios parntesis cuadrados. Para acceder los elementos se procede de forma similar al ejemplo del arreglo unidimensional, esto es, tabladenums[2][3] = 15; /* Asigna 15 al elemento de la 3 fila y la 4 columna*/ num = tabladenums[25][16]; A continuacin se muestra un ejemplo que asigna al primer elemento de un arreglo bidimensional cero, al siguiente 1, y as sucesivamente. main() { int t,i,num[3][4];

for(t=0; t<3; ++t) for(i=0; i<4; ++i) num[t][i]=(t*4)+i*1;

for(t=0; t<3; ++t) { for(i=0; i<4; ++i) printf(num[%d][%d]=%d printf(\n); } , t,i,num[t][i]);

} En C se permite la inicializacin de arreglos, debiendo seguir el siguiente formato: tipo nombre_arr[ tam1 ][ tam2 ] [ tamN] = {lista-valores}; Por ejemplo: int i[10] = {1,2,3,4,5,6,7,8,9,10}; int num[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; 5.2 Cadenas A diferencia de otros lenguajes de programacin que emplean un tipo denominado cadena string para manipular un conjunto de simbolos, en C, se debe simular mediante un arreglo de caracteres, en donde la terminacin de la cadena se debe indicar con nulo. Un nulo se especifica como \0. Por lo anterior, cuando se declare un arreglo de caracteres se debe considerar un carcter adicional a la cadena ms larga que se vaya a guardar. Por ejemplo, si se quiere declarar un arreglo cadena que guarde una cadena de diez caracteres, se har como: char cadena[11]; Se pueden hacer tambin inicializaciones de arreglos de caracteres en donde automticamente C asigna el caracter nulo al final de la cadena, de la siguiente forma: char nombre_arr[ tam ]=cadena; Por ejemplo, el siguiente fragmento inicializa cadena con ``hola: char cadena[5]=hola; El cdigo anterior es equivalente a: char cadena[5]={h,o,l,a,\0}; Para asignar la entrada estndar a una cadena se puede usar la funcin scanf con la opcin %s (observar que no se requiere usar el operador &), de igual forma para mostrarlo en la salida estndar. Por ejemplo:

main() { char nombre[15], apellidos[30];

printf(Introduce tu nombre: ); scanf(%s,nombre); printf(Introduce tus apellidos: ); scanf(%s,apellidos); printf(Usted es s\n,nombre,apellidos); } El lenguaje C no maneja cadenas de caracteres, como se hace con enteros o flotantes, por lo que lo siguiente no es vlido: main() { char nombre[40], apellidos[40], completo[80];

nombre=Jos Mara; apellidos=Morelos y Pavn;

/* Ilegal */ /* Ilegal */

completo=Gral.+nombre+appellidos; /* Ilegal */ } 5.3 Ejercicios 1. Escribir un programa que lea un arreglo de cualquier tipo (entero, flotante, char), se podra pedir al usuario que indique el tipo de arreglo, y tambin escribir un programa que revise el arreglo para encontrar un valor en particular.

2. Leer un texto, un caracter a la vez desde la entrada estndar (que es el teclado), e imprimir cada lnea en forma invertida. Leer hasta que se encuentre un final-de-datos (teclar CONTROL-D para generarlo). El programa podra probarse tecleando progrev | progrev para ver si una copia exacta de la entrada original es recreada. Para leer caracteres hasta el final de datos, se puede usar un ciclo como el siguiente char ch; while( ch=getchar(), ch>=0 ) /* ch < 0 indica fin-de-datos */ o char ch; while( scanf( %c, &ch ) == 1 ) /* se lee un caracter */ 3. Escribir un programa para leer un texto hasta el fin-de-datos, y mostrar una estadstica de las longitudes de las palabras, esto es, el nmero total de palabras de longitud 1 que hayan ocurrido, el total de longitud 2 y as sucesivamente. Define una palabra como una secuencia de caracteres alfabticos. Se debern permitir palabras hasta de una longitud de 25 letras. Una salida tpica podra ser como esta: longitud 1 : 16 ocurrencias longitud 2 : 20 ocurrencias longitud 3 : 5 ocurrencias longitud 4 : 2 ocurrencias longitud 5 : 0 ocurrencias

También podría gustarte