You are on page 1of 35
APITULO 5 rreglos unidimensionales 1. Introduccién En la prictica es frecuente que enfrentemos problemas cuya solucin seria muy dificil de hallar si utilizéramos tipos simples de datos para tesolverlos. Es decir, datos que ocupan una sola casilla de memoria. Sin embargo, muchos de estos problemas se podrian resolver facil- mente si aplicéramos en cambio tipos estructurados de datos, los cuales ocupan un grupo de casillas de memoria y se identifican con un nombre. Los arreglos que estudiaremos en este capitulo constitu- yen un tipo estructurado de datos. Los datos estructurados tienen varios componentes, cada uno de los cuales puede ser un tipo simple de dato o bien un tipo estructurado de dato, pero es importante recordar que los componentes del nivel mas bajo de un tipo estructurado siempre seréin tipos simples de datos. 176 Capitulo 5. Arreglos unidimensionales Formalmente definimos un arreglo de la siguiente manera: & “Un arreglo es una coleccién finita, homogénea y ordenada de elementos.” Finita, porque todo arreglo tiene un limite, es decir, se debe determinar cudll es el niimero maximo de elementos del arreglo. Homogénea, porque todos los ele mentos del arreglo deben ser del mismo tipo. Ordenada, porque se puede deter- minar cuél es el primer elemento, cual el segundo, y asf sucesivamente. 5.2. Arreglos unidimensionales Formalmente definimos un arreglo unidimensional de la siguiente manera: “Un arreglo unidimensional es una coleccién finita, homogénea y ordenada de datos, en la que se hace referencia a cada elemento del arreglo por medio de un indice. Este Ultimo indica la casilla en la que se encuentra el elemento.” Un arreglo unidimensional permite almacenar N elementos del mismo tipo (enteros, reales, caracteres, cadenas de caracteres, etc.) y acceder a ellos por medio de un fndice. En los arreglos unidimensionales se distinguen dos par- tes fundamentales: los componentes y el indice. Los componentes hacen referencia a los elementos que se almacenan en cada una de las celdas 0 casillas. El {ndice, por su parte, especifica la forma de acceder a cada uno de estos elementos. Para hacer referencia a un componente de un arreglo de- bemos utilizar tanto el nombre del arreglo como el indice del elemento. En la figura 5.1 se puede observar la representacién gréfica de un arreglo unidi mensional. 5.3 Declaracién de arreglos unidimensionales Arreglo pi aed rere N-ésimo elemento Primer elemento Figura 5.1 Representacién gréfica de un arreglo unidimensional En la figura 5.2 se muestra el arreglo unidimensional A que contiene 10 elemen- tos de tipo entero. El primer {indice del arreglo es el 0, el segundo, el 1, y asf sucesivamente. Si queremos acceder al primer elemento del arreglo debemos escribir fo}, pero si requerimos acceder al quinto elemento debemos escribir A[4]. Por otra parte, se puede observar que el valor de a{7] es 4, el de a[3+5) es -5, el resultado de a[2) + A[5] es 2, y el resultado de a[7] * A[9] es 32. Tait ile oT TRS Nicer eines ide eaten lca Ate) AL1] A[2] ATS] AL4] ATS] 6} AL7] ALB] AT9] Ficura 5.2 Indices y componentes de un arreglo unidimensional 5.3. Declaracién de arreglos unidimensionales Los arreglos ocupan espacio en memoria, que se reserva en el momento de reali- zar la declaraci6n del arreglo. A continuacién presentamos diferentes formas de declarar arreglos, con la explicacién correspondiente. [178 Capitulo 5, Arreglos unidimensionales void main(void) 4 int A[10]; /* Definicién de un arreglo de tipo entero de 1@ elementos. */ float 8[5]; /* Definicién de un arreglo de tipo real de 5 elementos. */ + Una vez que se definen los arreglos, sus elementos pueden recibir los valores a través de mttiples asignaciones, o bien, como ocurre frecuentemente en la préc- tica, a través de un ciclo. Observemos a continuacién el siguiente ejemplo. Esewpto 5.1 Construye un programa que, al recibir como datos un arreglo unidimensional de 100 elementos de tipo entero y un ntimero entero, determine cudntas veces se en- cuentra este ntimero dentro del arreglo. Datos: aRRE[ 120], Nu (donde aRRE es un arreglo unidimensional de tipo entero con capacidad para almacenar 100 valores enteros y Null es una variable de tipo entero que representa el niimero que se buscar4 en el arreglo). Programa 5.1 #include i* Cuenta-numeros. El programa, al recibir como datos un arreglo unidimensional de tipo ‘eentero y un numero entero, determina cudntas veces se encuentra el ‘niimero en el arreglo. */ Void main(void) oa sy /* Deolaracion del arregio */ 1100; T+) printf (*Ingrese el elemento %d del arreglo: *, I+); Soanf(‘%d", GARRE(T]); /* Lectura -asignacién— del arreglo */ o printf("\n\nIngrese el némero que se va a buscar en el arreglo: ") scant("2d", BNUM); for (I=; 1<100; I++) if (ARRE[I] == NUU) /* Comparacién del numero con 108 elementos del warreglo */ CUES; printt("\n\nEl %d se encuentra %d veces en el arreglo", NUM, CUE); t mente 5.3 Declaracién de arreglos unidimensionales Otra forma de asignar valores a los componentes de un arreglo es al realizar la declaracién del mismo. A continuacién presentamos diferentes casos con la ex- plicacién correspondiente, junto con figuras en las que se muestran los valores que toman los diferentes componentes del arreglo. int A[10] = {0}; /* Todos los componentes del arreglo se inicializan en 0. */ TES Th eater a alte: thar ascii wea f Alo] A[1] AI2] AIS] AL4] AS] AL6].-AL7) ALB] ATO] Figura 5.3 Declaracién del arreglo unidimensional A int _B[5] = {5}; /* El primer componente del arreglo se inicializa con el numero 5 y el resto con 0. */ EE RAO B t t Tadao t Ble} BE1] BI2) BI3] 84) Ficura 5.4 Declaracién del arreglo unidimensional 8 int [5] = (6, 23, 8, 4, 11}; J* Cada componente del arreglo recibe un valor. La asignacién se realiza en forma ‘consecutiva. */ 6 | 23 8 | 4 W c t t feecc t c[o] cit) c[2) c[3} cla) Figura 5.5 Declaraci6n del arreglo unidimensional ¢ Capitulo 5. Arreglos unidimensionales int D[5] = {6, 23, 8, 4, 11, 95} —_/* Esta asignacion genera un error de wesintaxis que se detecta en la conpilacién. El error ocurre porque el arreglo ‘tiene capacidad solamente para 5 componentes y hay 6 elementos que se quiere wasignar. */ int El] = {93, 21, 48, 8, 11}; /* En este caso, como se onite el tamafo del Wearreglo en la definicidn, se considera que el nimero de elementos del arreglo wes igual al nimero de elementos que existen en la lista por asignar. */ pln iw ed t t 1 4 t E[@) E(t] £2) E(3] E[4) Figura 5.6 Declaracién del arreglo unidimensional E Eyempto 5.2 Los organizadores de un acto electoral de un pafs sudamericano solicitaron un programa de cémputo para manejar en forma electrénica el conteo de los votos. En la eleccién hay cinco candidatos, los cuales se representan con los valores del 1 al 5, Construye un programa en C que permita obtener el ntimero de votos de cada candidato, El usuario ingresa los votos de manera desorganizada, tal y como se obtienen en una elec el final de datos se representa con un cero. Observa la siguiente lista de ejempl 26543446124312450 Donde: 2 representa un voto para el candidato 2, 5 un voto para el candidato 5, y asf sucesivamente. Datos: v0T1, VOTp,..., @ (variable de tipo entero que representa el voto a un can- didato). Programa 5.2 #include {* Elecoién. 2 Z El programa almacena los votos emitidos en una eleccién en 1a que hubo cinco “-candidatos © imprime el total de votos que obtuvo cada uno de ellos. efi 5.4 Apuntadores y arreglos void main(void) { int ELE[5] - {0}; | /* Declaracin del arreglo entero ELE de cinco ‘elementos, Todos sus elementos se inicializan en 0. */ int I, Vor; printf("Ingresa el primer voto (@ - Para terminar): "); scanf("%d", SVOT); while (VOT) if ((VOT > 0) g& (VOT < 6)) J* So verifica que el voto sea ‘correcto. */ ELE[VOT-1]++; 7? Los votes se almacenan en el arreglo. “Recuerda que 1a primera posicién del arreclo es 0, por esa razén a la ‘variable VOT se le descuenta 1. Los votos del primer candidato se ‘almacenan en 1a posicion ©. */ else prantf("\nE1 voto ingresado es incorrecto.\n"); printf ("Ingresa el siguiente voto (@ - Para terminar): "); scanf( "sd", &VOT); ic printf("\n\nResultados de 1a Eleccién\n"); for (I = 0; I <= 4; I+) printf("\nCandidato 8d: 2d", I+1, ELE(T]); ig 5.4. Apuntadores y arreglos Un apuntador es una variable que contiene la direccién de otra variable y se re- presenta por medio de los operadores de direccién (&) ¢ indireccién (*). El pri- mero proporciona la direccién de un objeto y el segundo permite el acceso al objeto del cual se tiene La direcci6n. Los apuntadores se utilizan mucho en el lenguaje de programacién C, debido prineipalmente a que en muchos casos representan la tnica forma de expresar una operacién determinada, Existe una relacién muy estrecha entre apuntadores y arreglos. Un arreglo se pasa a una funcién indicando tinicamente el nombre del arreglo, que representa el apuntador al mismo. Para comprender mejor el concepto de apuntadores, observemos a continuacién diferentes instrucciones con su explicacidn correspondiente. Luego de cada gru- po de instrucciones se presenta una tabla en la que puedes observar los valores que van tomando las variables. int X= 3, Y= 7, 215] = 42, 4, 8, 8, 10}; Capitulo 5. Arreglos unidimensionales Tasta 5.1. Apuntadores, variables y valores Variable Valor x 3 y 7 zie) 2 z11] 4 z[2) 6 2[3) 8 zt4) 10 int 4%; /* 1X representa un apuntador aun entero. */ TX = 8X} 7 IX apunta aX, IX tiene 1a direccién de X. */ y= 1x; J+ ¥ toma el valor de X. Y recibe el contenido de 1a ssdireccién almacenada en IX, es decir, el valor de X. Ahora Y es 3. */ FIX = 15 /* X se modifica. Ahora X vale 1. */ Tasta 5.2. Apuntadores, variables y valores Variable Valor x A: oi 3 210] 2 2(1) 4 212] 6 213] e 2[4) 10 Ix'="az[2]; _/* IX apunta al tercer elemento del arreglo Z. */ Y = *IX; /* ¥ toma el valor de Z[2], ahora vale 6. */ *IX = 155 /* 2[2) se modifica, ahora vale 15. */ Tasta 5.3. Apuntadores, variables y valores Variable Valor x Y Z[0) ZU] zz) 1 [3] z14) 1 Sotsno+ 5.4 Apuntadores y arreglos 183) xa AK + 5 J+ X se modifica, ahora vale Z[2] + 5 = 20. Recuerde que *IX ‘scontiene el valor de Z[2]. */ TIX = "IX 5; /* 2{2] Se modifica, ahora vale 10. */ Tapia 5.4. Apuntadores, variables y valores Variable Valor x 20 Y 6 2[0) 2 zi 4 212) 10 213) 8 z14) 10 sen; J* 2[2} se nodifica, se increnenta en 1. Z{2] ahora vale 11. */ *1x /* 2[2] se vuelve a modificar, ahora vale 12. Observa que weambas instrucciones se pueden utilizar para hacer exactamente lo mismo. */ Tata 5.5. Apuntadores, variables y valores Variable Valor x 20 ¥ 6 210) 2 zu 4 22) 12 213) 8 214) 10 x2 FaK+ 1); 7* X se modifica. E2 apuntador IX se desplaza una posicién y accede tenporalnente a 213], por lo tanto X tona este valor (8). Observa que IX no se reasigna. */ Y= "1x; 7+ ¥ se modifica, tona el valor de Z[2] (12). */ | 184 Capitulo 5. Arreglos unidimensionales Tasia 5.6. Apuntadores, variables y valores Variable Valor x 8 y 12 Z[o]) 8 ZU) 4 212] 12 213] 8 214) 10 Ke X41; 1* Observa otra forma de mover e apuntador. En este caso IX se desplaza una “sposicién, pero a diferencia del caso anterior, ahora se reasigna. IX apunta ‘ahora al cuarto elenento de Z (Z(3]). */ = AIX; J* Y se modifica, toma ahora el valor de Z[3] (8). */ Tasta 5.7. Apuntadores, variables y valores Variable Valor x 8 nM; 12 Z[0) 2 211] 4 Z[2] 12 213] 8 2{4) 10 IX = 1x + 45 J* IK se modifica. Observa que el aountador se desplaza cuatro posiciones y cae ‘eon una direcoién que se encuentra afuera del arreglo, Esto ocasiona un error ‘que no sefiala el conpilador de ¢. */ Y= #1; J*Y so modifica, toma el valor (basura) de una celda ‘incorrect. Este es un error que no sefiala el conpilador del lenguaje C. */ 5.4 Apuntadores y arreglos Tasa 5.8. Apuntadores, variables y valores Variable Valor x 8 x 9203 ZO) 2 z01] 4 212) 12 213) 8 z14) 10 1X = aX; /* IX apunta a la variable entera X. */ Xs IX+1 /* IX se mueve una posicién y ahora en una celda \eincorrecta. */ X= AIX; /* X toma el valor (basura) de la celda a la que apunta IX. */ Tasia 5.9. Apuntadores, variables y valores Variable Valor x 20079 y 9203 Z[0) 2 zi} 4 2(2) 12 213) 8 KE) z{4) 10 Esempto 5.3 En el siguiente programa se presentan todos los casos que se analizaron en la seccién anterior, Programa 5.3 Capitulo 5. Arreglos unidimensionales 5.5 Arreglos y funciones 5.5. Arreglos y funciones El lenguaje de programacién C utiliza pardmetros por referencia para pasar los arreglos a las funciones. Cualquier modificacin que se realice a los arreglos en las funciones afecta su valor original, En la llamada a la funcién s6lo se debe incluir el nombre del arregio, que es un apuntador. No se deben incluir los cor- chetes porque ocasionan un error de sintaxis. Evempto 5.4 Escribe un programa en C que calcule el producto de dos arreglos unidimensio- nales de tipo entero y almacene el resultado en otro arreglo unidimensional. Datos: VE1{101, VE2(1¢1, VE8{10] (arreglos unidimensionales de tipo entero con capacidad para 10 elementos, En vee se almacena el resultado del produc- to de los vectores VE y VE2). Programa 5.4 Capitulo 5. Arreglos unidimensionales 5.5 Arreglos y funciones Evempto 5.5 En un arreglo unidimensional se almacenan las calificaciones obtenidas por un grupo de 50 alumnos en un examen. Cada calificacién es un némero entero com- prendido entre 0 y 5. Escribe un programa que calcule, almacene e imprima la frecuencia de cada una de las calificaciones, y que ademds obtenga e imprima Ta frecuencia més alta, Si hubiera calificaciones con la misma frecuencia, debe obtener la primera ocurrencia. Dato: CAL{50] (CAL es un arreglo unidimensional de tipo entero que almacenard las 50 calificaciones de los alumnos). [190 Capftulo 5. Arreglos unidimensionales Problemas resueltos Problema PR5.1 Escribe un programa que, al recibir como dato un arreglo unidimensional de ni- ‘meros reales, obtenga como resultado la suma del cuadrado de los ntimeros. Dato: VEC{100} (arreglo unidimensional de tipo real de 100 elementos). Problemas resueltos Capitulo 1. Algoritmos, diagramas de flujo y programas en C Problema PR5.2 é Escribe un programa en C que, al recibir como dato un arreglo unidimensional desordenado de W enteros, obtenga como salida ese mismo arreglo pero sin los elementos repetidos. Dato: ARRE[N] (arreglo unidimensional de tipo entero de N elementos, 1 < N < 100). Programa 5.7 Problemas resueltos Problema PR5.3 ; Escribe un programa en C que almacene en un arreglo unidimensional de tipo entero los primeros 100 ntimeros primos. Capitulo 5. Arreglos unidimensionales Problemas resueltos 195 Problema PR5.4 Buisqueda secuencial en arreglos desordenados. La busqueda secuencial en arreglos desordenados consiste en revisar elemento por elemento, de izquierda a derecha, hasta encontrar el dato buscado o bien hasta llegar al final del arreglo, 1o que ocurra primero. Cuando el procedimiento concluye con éxito, se proporcio- na la posicién en Ia cual fue encontrado el elemento. En caso contrario, se regresa a 0 para indicar que el elemento no fue localizado. Datos: Vec{n}, ELE Donde: vec es un arreglo unidimensional de tipo entero de n elementos, 1 < N < 100, y ELE una variable de tipo entero que representa el elemento a buscar. Programa 5.9 Capitulo 5. Arreglos unidimensionales Problema PR5.5 Bisqueda secuencial en arreglos ordenados en forma creciente. La btisqueda se- cuencial en arreglos ordenados en forma creciente es similar al proceso de busqueda en arreglos desordenados. La diferencia radica en el uso de una nueva condicién para controlar el proceso de biisqueda. El método se aplica revisando elemento por elemento, de izquierda a derecha, hasta encontrar el dato buscado (éxito), hasta que el elemento buscado sea menor que el elemento del arreglo con el cual se esta comparando (fracaso), o bien hasta llegar al final de los datos disponibles (fracaso); siempre Jo que ocurra primero. Cuando el procedimiento concluye con éxito, se proporciona la posicién en la cual fue encontrado el elemento. En caso contrario, se regresa 0 para indicar que el elemento no fue localizado. Cabe destacar que si el arreglo esta ordenado en forma decreciente, en el programa s6lo hay que modificar la condicién de menor que por la de mayor que. Problemas resueltos Datos: VEC(N], ELE Donde: vec es un arreglo unidimensional de tipo entero de N elementos, 1 < N < 10a, ELE una variable de tipo entero que representa el elemento a buscar. Programa 5.10 Capitulo 5. Arreglos unidimensionales Problema PR5.6 Busqueda binaria. La biisqueda binaria consiste en dividir el intervalo de bus- queda en dos partes, comparando el elemento buscado con el central. En caso de ser diferentes se redefinen los extremos del intervalo, segtin sea el elemento cen- tral mayor o menor que el buscado, disminuyendo de esta forma el espacio de biisqueda. El proceso concluye cuando el elemento es encontrado, o bien, cuando el intervalo de busqueda se anula. Esto implica que el elemento no se encuentra en el arreglo, Cabe destacar que el método funciona tinicamente para arreglos ordenados. Con cada iteracién del método, el espacio de biisqueda se reduce a la mitad, por lo tanto, el nfimero de comparaciones que se deben realizar disminuye notablemente. Esta disminuci6n resulta més significativa cuanto més grande es el tamafio del arreglo. Datos: VEC{N], ELE Donde: vec es un arreglo unidimensional de tipo entero de N elementos, 1 < N < 400, y ELE una variable de tipo entero que representa el elemento a buscar. Problemas resueltos Capitulo 5. Arreglos unidimensionales Problema PR5.7 Ordenacién por insercién directa (forma creciente). Este es el método que utilizan generalmente los jugadores de cartas cuando las ordenan, de ahf que también se le conozea con el nombre de método de la baraja. La idea central del método consiste en insertar un elemento del arreglo en la parte izquierda del mismo que ya se encuentra ordenada, El proceso se repite desde el segundo hasta el enésimo elemento. i Obseryemos a continuacién un ejemplo en la tabla 5.10 para ilustrar el método. Consideremos un arreglo unidimensional A de tipo entero de ocho elementos. Tasta 5.10. Ordenacion por insercién directa ‘ Pasadas AfO] Alt] Al2]__A[3]_Al4]_A[5]__A[6]__A[7] la. 2 34 22 L 54 36 19 7 2a. 12 4 22 Ja, 54 36 19 7 3a. 12 22 34 i 54 36 19 Z 4a. i 12 22 34 54 36 19 - Sa. ae 12 22 34 54 36 19 7 6a. WL 12 2 34 36 54 19 7 Ta. iL 12 19 2 34 3% 54 7 8a. 7 il 12 19 22 34 36 54 Problemas resueltos Dato: vec(N} (arreglo unidimensional de tipo entero de N elementos, 1 < N < 100). Programa 5.12 Capitulo 5. Arreglos unidimensionales Problema PR5.8 Ordenaci6n por seleccién directa (forma creciente). Es el mejor de los méto- dos simples de ordenacién (intercambio —burbuja— e insercién). La idea bésica del método consiste en buscar el elemento més pequeiio del arreglo y colocarlo en la primera posicidn. Luego se busca el segundo elemento mas pequeiio y se coloca en la segunda posici6n; y asf sucesivamente hasta que todos los elementos del arreglo queden ordenados. En la tabla 5.11 se presenta un ejemplo para ilustrar al método, Consideremos un arreglo unidimensional A de tipo entero de ocho elementos. Tasta 5.11, Ordenacién por seleccién directa Pasadas AO] All] Al2]__Al3]_Al4]_— AIS] Ale) LZ) Ja. 12 34 22 i 54 36 19 7 2a. 2 34 22 I 54 36 19 12 3a. 7 I 22 34 54 36 19 12 4a. a it 12 34 54 36 19 22 5a. ib sue 12 19 54 36 34 22 6a. 7 ant 12 19 2 36 34 34 Ta. ae iL 12 19 2 34 36 54 8a, 7 ae 12 19 22 34 36 54 Problemas resueltos Dato: V€C{N} (arreglo unidimensional de tipo entero de N elementos, 1 < N < 1@0). Programa 5.13 Capitulo 5. Arreglos unidimensionales Problema PR5.9 Construye un programa que, al recibir un arreglo unidimensional de tipo entero que contiene calificaciones de exdmenes de alumnos, calcule lo siguiente: a) ‘La media aritmética. Esta se calcula como la suma de los elementos entre el ntimero de elementos. b) La varianza. Esta se calcula como la suma de los cuadrados de las desvia- ciones de la media, entre el nimero de elementos. ©) La desviacién esténdar. Se calcula como la rafz cuadrada de la varianza. d) La moda. Se calcula obteniendo el nimero con mayor frecuencia. Dato: aLu(N} (arreglo unidimensional de tipo entero de N elementos, + < Ns 100). Programa 5.14 Problemas resueltos --Frecu D = Capitulo 5. Arreglos unidimensionales Problema PR5.10 ~ Analiza cuidadosamente el siguiente programa y obtén los resultados que se ge- neran al ejecutarlo. Problemas resueltos 207) Compara los resultados que hayas obtenido con los que se presentan a conti- nuacion: Problema PR5.11 Analiza cuidadosamente el siguiente programa y obtén los resultados que se ge- neran al ejecutarlo. Programa 5.16 Capitulo 5. Arreglos unidimensionales Compara los resultados que hayas obtenido con los que se presentan a conti- nuacion: Problema PR5.12 Analiza cuidadosamente el siguiente programa y obtén los resultados que se ge- neran al ejecutarlo. Programa 5.17 Problemas resueltos vile), gy vite1v4 vita] Vitt] AX = AX +1; Vi[3] = *AK: printt(" \nVi fo] =%a Vi[1]=%d Vi[2}=ud Vi[s]=ee \tv2iey: va[2}=sd vats): sah VITO] V1[1],) we) sV1[3] »Vel0l, ah Compara los resultados que hayas obtenido con los que se presentan a conti- nuacién: Vitel? ViIEII-9 vitei-s vitai=7 VilOI-? VA[1]=6 Vi[2]=7 Vi[8]=basura v2{d] Problemas suplementarios Nota: Todos los problemas deben ser resueltos con la ayuda de funciones. Problema PS5.1 Escribe un programa que, al dar como dato un arreglo unidimensional de néimeros enteros, determine cudntos de ellos son positivos, cudntos negativos y cudntos nulos. Dato: vec(N} (arreglo unidimensional de tipo entero de N elementos, 1 < N < 100). Problema PS5.2 Escribe un programa que reciba como entrada un arreglo unidimensional ordena- do de N enteros y obtenga como salida ese mismo arreglo pero sin los elementos repetidos. Dato: VEC{N} (arreglo unidimensional de tipo entero de w elementos, 1 < N < 100). 209 |

You might also like