Sunteți pe pagina 1din 36

CONTENIDO

8.1.
8.8.
8.3.
8.4.
8.5.
Arrays.
Inicializacin de un array.
Arrays de caracteres
y cadenas de texto.
multidiniensiona-
in de arrays como
parnetms.
8.6. Ordenacin de listas.
8.7. Bsqueda en listas.
8.8. Resumen.
8.9. Ejerciicios.
8.10. Problemas.
li 258
se han descrito
s elementos del rriisrno tipo, tales como veinte
un solo carhter;
e contenga un gr
CONCEPTOS CLAVE
Declasacin de un array.
259
Iyy
260 Programacin en C. Metodologa, algoritmos y estructura de datos
25.1 34.2 5.25 7.45 6.09
a
8.1. ARRAYS
7.54
Un array (lista o tabla) es una secuencia de datos del mismo tipo. Los datos se llaman elementos del
array y se numeran consecutivamente O, 1,2,3, etc. El tipo de elementos almacenados en el array puede
ser cualquier tipo de dato de C, incluyendo estructuras definidas por el usuario, como se describir ms
tarte. Normalmente el array se utiliza para almacenar tipos tales como char , i nt o f l oat .
Un array puede contener, por ejemplo, la edad de los alumnos de una clase, las temperaturas de
cada da de un mes en una ciudad determinada, o el nmero de personas que residen en cada una de las
diecisiete comunidades autnomas espaolas. Cada item del array se denomina elemento.
Los elementos de un array se numeran, como ya se ha comentado, consecutivamente O, I , 2, 3, ...
Estos nmeros se denominan valores ndice o subindice del array. El trmino subndice se utiliza ya
que se especifica igual que en matemticas, como una secuencia tal como ql, a, , a2... Estos nmeros
localizan la posicin del elemento dentro del array, proporcionando acceso directo al array.
Si el nombre del array es a, entonces a [ 0 1 es el nombre del elemento que est en la posicin O,
a [ 11 es el nombre del elemento que est en la posicin 1, etc. En general, el elemento i-simo esta en
la posicin i -l . De modo que si el array tiene n elementos, sus nombres son a [ O I , a [ 1 I , . . . , a [ n- 1 I .
Grficamente se representa as el array a con seis elementos.
Figura 8.1. Array de sei s elementos.
El array a tiene 6 elementos: a [ O 1 contiene 25.1. a [ 1 I contiene 34.2, a [ 2 1 contiene 5.25, a [ 3 1
contiene 7.45, a [ 4 ] contiene 6.09 y a [ 5 1 contiene 7.54. El diagrama de la Figura 8.1 representa
realmente una regin de la memoria de la computadora, ya que un array se almacena siempre con sus
elementos en una secuencia de posiciones de memoria contigua.
En C los ndices de un array siempre tienen como lmite inferior O, como ndice superior el tamao
del array menos 1.
8.1.1. Declaracin de un array
Al igual que con cualquier tipo de variable, se debe declarar un array antes de utilizarlo. Un array se
declara de modo similar a otros tipos de datos, excepto que se debe indicar al compilador el tamaRo o
longitud del array. Para indicar al compilador el tamao o longitud del array se debe hacer seguir al
nombre, el tamao encerrado entre corchetes. La sintaxis para declarar un array de una dimensin
determinada es:
tipo nornbreArray [numeroDeEl ernen t os 1 ;
Por ejemplo, paracrear un array (lista) de diez variables enteras, se escribe:
i nt numer os [ 10 I ;
Esta declaracin hace que el compilador reserve espacio suficiente para contener diez valores
enteros. En C los enteros ocupan, normalmente, 2 bytes, de modo que un array de diez enteros ocupa 20
bytes de memoria. La Figura 8.2 muestra el esquema de un array de diez elementos; cada elemento
puede tener su propio valor.
Arrays (listas y tablas) 261
Array de datos enteros: a
Un array de enteros se almacena en bytes consecutivos de memoria. Cada elemento
utiliza dos bytes. Se accede a cada elemento de array mediante un ndice que
comienza en cero. As, el elemento quinto ( a [ 4 1 ) del array ocupa los bytes 9" y 10".
Figura 8.2. Almacenamiento de un array en memoria.
Se puede acceder a cada elemento del array utilizando un ndice en el nombre del array. Por ejemplo,
pr i nt f ( " %d \ n" , numer os [ 4] ) ;
visualiza el valor del elemento 5 del array. Los arrays siempre comienzan en el elemento O. As pues, el
array numer os contiene los siguientes elementos individuales:
numer os [ O ] numer os [ 1 ] numer os [ 2 ] numer os [ 3 ]
numer os [ 4 ] numer os [ 7 ]
numer os [ 8 ]
Si por ejemplo, se quiere crear un array de nmeros reales y su tamao es una constante represen-
numer os [ 5 1
numer os [ 9 1
numer os [ 6 ]
tada por un parmetro
#def i ne N 20
f l oat vect or [ N] ;
Para acceder al elemento 3 y leer un valor de entrada:
scanf ( " %f 'I, &vect or [ 2 1 ) ;
Precaucin
C no comprueba que los ndices del array estn dentro del rango definido. As, por ejemplo, se
puede intentar acceder a numer os [ 12 1 y el compilador no producir ningn error, lo que puede
producir un fallo en su programa, dependiendo del contexto en que se encuentre el error.
8.1.2. Subndices de un array
El ndice de un array se denomina, con frecuencia, suhindice del arruy. El trmino procede de las
matemticas, en las que un subndice se utiliza para representar un elemento determinado.
numer o s equivale a
numer os equivule a
numer os [ O I
numer os I 3 I
El mtodo de numeracin del elemento i-simo con el ndice o subndice i-l se denomina indexucin
husada en cero. Su uso tiene el efecto de que el ndice de un elemento del array es siempre el mismo que
el nmero de <<pasos>> desde el elemento inicial a I O I a ese elemento. Por ejemplo, a [ 3 I est a 3 pasos
o posiciones del elemento a 1 O 1 . La ventaja de este mtodo se ver de modo ms evidente al tratar las
relaciones entre arrays y punteros.
-
262 Programacin en C. Metodologa, algoritmos y estructura de datos
Ejemplos
i nt edad[ 5] ; Array edad contiene 5 elementos: el primero, edad [ O 1 y
el ltimo, edad [ 4 1 .
Declara 2 arrays de enteros.
Declara un array de 25 elementos f l oat .
Declara un array de 50 elementos doubl e.
i nt pesos [ 25] , l ongi t udes [ l oo] ;
f l oat sal ar i os [ 25] ;
doubl e t emper at ur as[ 501;
char l et r as [ 15] ; Declara un array de caracteres.
#def i ne MX 120
char r buf f er [ MX+l ] ; Declara un array de caracteres de tamao MX+l,
el primer elemento es buffer[O] y el ltimo buffer[MX].
En los programas se pueden referenciar elementos del array utilizando frmulas para los subndices.
Mientras que el subndice puede evaluar a un entero, se puede utilizar una constante, una variable o una
expresin para el subndice. As, algunas referencias individuales a elementos son:
edad [ 4 I
vent as [ t ot al +5 1
bonos [ mes 1
sal ar i o [ mes [ i l *5]
8.1.3. Al macenami ento en memori a de los arrays
Los elementos de los arrays se almacenan en bloques contiguos. As, por
i nt edades [ 5 1 ;
char codi gos [ 5 I ;
se representan grficamente en memoria en la Figura 8.3.
Edades
I
mplo, los arrays
Figura 8.3. Almacenamiento en memoria de arrays.
Arrays (listas y tablas) 263
Nota
Todos los subndices de los arrays comienzan con O.
Precaucin
C permite asignar valores fuera de rango a los subndices. Se debe tener cuidado no hacer esta
accin, debido a que se sobreescribiran datos o cdigo.
Los arrays de caracteres funcionan de igual forma que los arrays numricos, partiendo de la base de
que cada carcter ocupa normalmente un byte. As, por ejemplo, un array llamado nombr e se puede
representar en la Figura 8.4.
F
char nornhre [ ] = "('azor I d"
P-
I
Figura 8.4. Almacenamiento de un arrays de caracteres en memoria.
A tener en cuenta, en las cadenas de caracteres el sistema siempre inserta un ltimo carcter (nulo)
para indicar fin de cadena.
8.1.4. El t amao de los arrays
El operador si zeof devuelve el nmero de bytes necesarios para contener su argumento. Si se usa
si zeof para solicitar el tamao de un array, esta funcin devuelve el nmero de bytes reservados para
el array completo.
Por ejemplo, supongamos que se declara un array de enteros de 100 elementos denominado edades;
si se desea conocer el tamao del array, se puede utilizar una sentencia similar a:
n = si zeof ( edades) ;
L
264 Programacin en C. Metodologa, algoritmos y estructura de datos
donde n tomar el valor 200. Si se desea solicitar el tamao de un elemento individual del array, tal
como
n = si zeof ( edades[ 6] ) ;
n almacenar el valor 2 (nmero de bytes que contienen un entero).
8.1.5. Verificacin del rango del ndice de un array
C, al contrario que otros lenguajes de programacin -por ejemplo, Pascal-, no verifica el valor del
ndice de la variable que representa al array. As, por ejemplo, en Pascal si se define un array a con
ndices O a 5, entonces a [ 6 1 har que el programa se rompa en tiempo de ejecucin.
Ejemplo 8.1
Proteccin frente a errores en el intervalo (rango) de valores de una variable de ndice que representa
un array.
doubl e suma( const doubl e a[ ] , const i nt n)
t
doubl e S = 0. 0;
i f ( n * si zeof ( doub1e) > si zeof ( a) )
f or ( i nt i = 0; i < n; i ++)
r et ur n S;
r et ur n 0;
S += a[ i l ;
1
8.2. INICIALIZACIN DE UN ARRAY
Se deben asignar valores a los elementos del array antes de utilizarlos, tal como se asignan valores a
variables. Para asignar valores a cada elemento del array de enteros pr eci os, se puede escribir:
pr eci os[ 0] = 10;
pr eci os[ l ] = 20;
pr eci osl 31 = 30;
pr eci os[ 4] = 40;
...
La primera sentencia fija pr eci os [ 0 1 al valor 10, pr eci os [ 11 al valor 20, etc. Sin embargo, este
mtodo no es prctico cuando el array contiene muchos elementos. El mtodo utilizado, normalmente,
es inicializar el array completo en una sola sentencia.
Cuando se inicializa un array, el tamao del array se puede determinar automticamente por las
constantes de inicializacin. Estas constantes se separan por comas y se encierran entre llaves, como
en los siguientes ejemplos:
i nt numer os[ l = 110, 20, 30, 40, 50, 601;
i nt n[ l = {3, 4, 51 / * Decl ar a un ar r ay de 3 el ement os */
char c[ ] = { L , u , i , s }; / * Decl ar a un ar r ay de 4 el ement os */
El array numer os tiene 6 elementos, n tiene 3 elementos y el array c tiene 4 elementos.
Arrays (listas y t abl as) 265
En C los arrays de caracteres, las cadenas, se caracterizan por tener un carcter final que indica el
fin de la cadena, es el carcter nulo. Lo habitual es inicializar un array de caracteres (una variable
cadena) con una constante cadena.
char s[ ] = " Puest a del Sol " ;
Nota
c pued
i nt cuenta!] = (15, 25, -45, O, 501;
rchetes vacos, slo cuando se asignan vdores al
El compilador asigna automticamente cinco elementos a cuenta
El mtodo de inicializar arrays mediante valores constantes despus de su definicin es adecuado
cuando el nmero de elementos del array es pequeo. Por ejemplo, para inicializar un array (lista) de I O
enteros a los valores 10 a I , y a continuacin visualizar dichos valores en un orden inverso, se puede
escribir:
i nt cuent a[ l Ol = {l o, 9, 8 , 7 , 6, 5, 4, 3, 2, l };
f or ( i = 9; i >= O; i - - )
pr i nt f ( " \ n cuent a descendent e %d = %d' , i , cuent a[ i ] ) ;
Se pueden asignar constantes simblicas como valores numricos, de modo que las sentencias
siguientes son vlidas:
#def i ne ENE 31
I #def i ne FER 28
#def i ne MAR 31
i nt meses[ l 2] = {ENE, FEB, MAR, ABR, MAY, J UN,
Pueden asignarse valores a un array utilizando un bucle f or o whi l e/ do- whi l e, y ste suele ser
el sistema ms empleado normalmente. Por ejemplo, para inicializar todos los valores del array
numer os al valor O, se puede utilizar la siguiente sentencia:
. . .
J UL, AGO, SEP, OCT, NOV, DI C};
f or ( i = O; i <= 5; i ++)
numer os[ i l = O;
debido a que el valor del subndice i vm'a de O a 5, cada elemento del array numer os se inicializa y
establece a cero.
Ejemplo 8.2
El programa I NI CI AL I . C lee ocho enteros; a continuacin visualiza el total de los nmeros.
#i ncl ude <st di o. h>
#def i ne NUM 8
i nt mai n( )
I
i nt nums [ NUM] ;
i nt i ;
i nt t ot al = O;
266 Programacin en C. Metodologa, algoritmos y estructura de datos
f or ( i = O; i < NUM; i ++)
i
pri nt f ( ' Por f avor , i nt r oduzca el nmer o: ' I ) ;
scanf ( " %d" , &nums [ i I ) ;
}
pr i nt f ( " \ nLi st a de nmer os : I' ) ;
f or ( i = O; i < NUM; i ++)
{
pr i nt f ( " %d " , nums [ i l ) ;
t ot al += nums [ i l ;
1
pr i nt f ( ' \ nLa suma de l os nmer os es %d" , t ot al ) ;
r et ur n O;
i
Las variables globales que representan arrays se inicializan a O por defecto. Por ello, la ejecucin del
siguiente programa visualiza O para los 1 O valores del array:
i nt l i st a[ l Ol ;
i nt mai n0
i
i nt j ;
f or ( j = O; j <= 9; j ++)
pr i nt f ( " \ n l i st a[ %d] = %d" , j , l i st a[ j l ) ;
r et ur n O;
A As, por ejemplo, en
i nt Not as [ 5 1 ;
voi d mai n( )
i
st at i c char Nombr es [ 5l ;
Si se define un array globalmente o un array esttico y no se proporciona ningn valor de
inicializacin, el cornpilador inicializar el array con un valor por defecto (cero para arrays
de elementos enteros y reales --coma flotante- y carcter nulo para arrays de caracteres).
el array de enteros se ha definido globalmente y el array de caracteres se ha definido como un array
local esttico de mai n ( ) . Si se ejecuta ese segmento de programa, se obtendrn las siguientes
asignaciones a los elementos de los arrays:
Nombr es
101 ' \ O'
[ l l ' \ O'
[21 ' \ O'
[ 31 ' \ O '
[ 41 ' \ O'
8.3. ARRAYS DE CARACTERES Y CADENAS DE TEXTO
Una cadena de texto es un conjunto de caracteres, tales como ABCDEFG. C soporta cadenas de texto
utilizando un array de caracteres que contenga una secuencia de caracteres:
I
char cadena [ ] = " ABCDEFG" ;
Es importante comprender la diferencia entre un array de caracter
cadenas contienen un carcter nulo al final del array de caracteres.
Cadena
Arrays (listas y tablas) 267
A B C D E F \ O
r una cadena de caracteres. Las
Las cadenas se deben almacenar en arrays de caracteres, pero no todos los arrays de caracteres
contienen cadenas.
Examine la Figura 8.5. donde se muestra una cadena de caracteres y un array de caracteres.
I ,
U
P
1
d
r
Figura 8.5. ( a) Array de caracteres; ( b) cadena.
I
,
268 Programacin en C. Metodologa, algoritmos y estructura de datos
Cadena[ 31 = ' D' ;
Cadena[ 41 = ' E' ;
Cadena[ 5] = I F' ;
Cadena[ bl = ' \ O' ;
Sin embargo, no se puede asignar una cadena a un array del siguiente modo:
Cadena = " ABCDEF" ;
Para copiar una constante cadena o copiar una variable de cadena a otra variable de cadena se debe
utilizar la funcin de la biblioteca estndar -posteriormente se estudiar- st r cpy ( ) (copiar cade-
nas). st r cpy ( ) permite copiar una constante de cadena en una cadena. Para copiar el nombre " Abr a-
cadabr a" en el array nombr e, se puede escribir
s t r cpy ( nombr e, "Abr acadabr a" ) ; / *Copi a Abr acadabr a en nombr e */
st r cpy ( ) aade un carcter nulo al final de la cadena. A fin de que no se produzcan errores en la
sentencia anterior, se debe asegurar que el array de caracteres nombr e tenga elementos suficientes para
contener la cadena situada a su derecha.
Ejemplo 8.3
Rellenar los elementos de un array con nmeros reales positivos procedentes del teclado.
#i ncl ude <st di o. h>
/ * Const ant es y var i abl es gl obal cs */
#def i ne MAX 10
f l oat muest r a[ MAXl ;
voi d mai n0
i nt i ;
pr i nt f ( " \ nI nt r oduzca una l i st a de Bd el ement os posi t i vos. \ n" , MAX) ;
f or ( i = O; i < MAX; muest r a[ i ] >O?++i : i )
scanf ( ' %f ", &muest r a[ i ] ) ;
1
En el bucle principal, slo se incrementa i si muest r a [ i 1 es positivo: muest r a [ i 1 >0 ? ++i : i .
Con este incremento condicional se consigue que todos los valores almacenados sean positivos.
Ejemplo 8.4
Visualizar el array muestra despus de introducir datos en el mismo, separndolos con el tabulador:
#i ncl ude <st di o. h>
#def i ne MAX 10
f l oat muest r a[ MAXl ;
voi d mai n0
{
i nt i ;
pr i nt f ( " \ nI nt r oduzca una l i st a de ad el ement os posi t i vos. \ n" , MAX) ;
f or ( i = O; i < MAX; muest r a[ i ] >O?++i : i )
scanf ( " %f " , &muest r a[ i ] ) ;
pr i nt f ( " \ nDat os l ei dos del t ecl ado: " ) ;
f or ( i = O, i < MAX; ++i )
pr i nt f ( ' %f \ t ' , muest r a[ i ] ) ;
I
Arrays (listas y tablas) 269
8.4. ARRAYS MULTIDIMENSIONALES
Los arrays vistos anteriormente se conocen como arrays unidimensionales (una sola dimensin) y se
caracterizan por tener un solo subndice. Estos arrays se conocen tambin por el trmino listas. Los
arrays multidimensionales son aquellos que tienen ms de una dimensin y, en consecuencia, ms de un
ndice. Los arrays ms usuales son los de dos dimensiones, conocidos tambin por el nombre de tablas
o matrices. Sin embargo, es posible crear arrays de tantas dimensiones como requieran sus aplicaciones,
esto es, tres, cuatro o ms dimensiones.
Un array de dos dimensiones equivale a una tabla con mltiples filas y mltiples columnas (Fig.
8.6).
O 1 2 3 n
I 1 I I
mL u
Figura 8.6. Estructura de un array de dos dimensiones.
Obsrvese que en el array bidimensional de la Figura 8.6, si las filas se etiquetan de O a m y las
columnas de O a n, el nmero de elementos que tendr el array ser el resultado del producto (m+1 ) x
(n+l). El sistema de localizar un elemento ser por las coordenadas representadas por su nmero de fila
y su nmero de columna (a, b). La sintaxis para la declaracin de un array de dos dimensiones es:
<tipo de datoElemento> <nombre array> [<NmeroDeFilas<] [<NmeroDeColumnas>]
L
Algunos ejemplos de declaracin de tablas:
char Pant al l aL251 [ 80] ;
i nt puest os [ 61 [81 ;
i nt equi pos [ 4 I [ 3 O 1 ;
i nt mat r i z[ 4] [ 21 ;
Atenci n
Al contrario que otros lenguajes, C requiere que cada dimensi6n est encerrada entre corchetes. La
sentencia
int equipoc[4, 301
no es vlida.
270 Programacin en C. Metodologa, algoritmos y estructura de datos
Un array de dos dimensiones en realidad es un array de arrays. Es decir, es un array unidimensional,
y cada elemento no es un valor entero, o de coma flotante o carcter, sino que cada elemento es otro
array.
Los elementos de los arrays se almacenan en memoria de modo que el subndice ms prximo al
nombre del array es la fila y el otro subndice, la columna. En la Tabla 8.1 se representan todos los
elementos y sus posiciones relativas en memoria del array, i nt t abl a [ 4 I [ 2 1 ; suponiendo que cada
entero ocupa 2 bytes.
Tabla 8.1. Un array bidimensional.
Elemento Posicin relativa de memoria
~
t abl aL01 [ O1
t abl a[ Ol [ l ]
t abl a[ l l [ O1
t abl a[ l l [ l ]
t abl a[ 2] [ O]
t abl a[ 21 [ l ]
t abl aL31 [ O 1
t abl a[ 31 [ l l
O
2
4
6
8
10
12
14
8.4.1. Inicializacin de arrays mul ti di mensi onal es
Los arrays multidimensionales se pueden inicializar, al igual que los de una dimensin, cuando se
declaran. La inicializacin consta de una lista de constantes separadas por comas y encerradas entre
llaves, como en los ejemplos siguientes:
1. i nt t abl a[ 2] [ 3 ] = ( 51, 52, 53, 54, 55, 56) ;
o bien en los formatos mas amigables:
i nt t abl a[ 2] [31= { 151, 52, 531,
i nt t abl a[ 2] [ 3 ] = {{Sl , 52, 531, 154, 55, 1611;
i nt t abl a[ 2] [ 31= 1
{54, 55, 56) i ;
{51, 52, 531,
( 54, 55, 561
1;
O 1 2 3 Col umna
F i l d
Figura 8.7. Tablas de dos dimensiones.
Arrays (listas y t abl as) 271
2. i nt tabl a:! [31 [ 41 = {
11, 3 , 3, 41,
15, 6, ' 1 , 81,
19, 10, 11, 121
1;
Consej o
Los arrays multidimensionales (a menos que sean globales) no se inicializan a valores especficos
a menos que se les asignen valores en el momento de la declaracin o en el programa. Si se
inicializan uno o ms elementos, pero no todos, G rellena el resto con ceros o valores nulos
( ' \ 0 ' ) . Si se desea inicializar a cero un array multidimensional, utilice una sentencia tal como
sta:
'
float ventasE31 [41 = { O . , O . , O. , O. , O. , O. , O . , O . , O. , O. , O . , O . 1 ;
t ah I <i
Figura 8.8. Almacenamiento en memoria de tabla i31141.
8.4.2. Acceso a los el ementos de los arrays bidimensionales
Se puede acceder a los elementos de arrays bidimensionales de igual forma que a los elementos de un
array unidimensional. La diferencia reside en que en los elementos bidimensionales deben especificarse
los ndices de la fila y la columna.
El formato general para asignacin directa de valores a los elementos es:
i nserci n de elementos
<nombr e ar r ay>[ i ndi ce f i l a] [ i ndi ce col umnal =val or el ement o;
272 Programacin en C. Metodologa, algoritmos y estructura de datos
ext r acci n de el ement os
<var i abl e> = <nombr e ar r ay> [ i ndi ce f i l a] [ i ndi ce col umna] ;
Algunos ejemplos de inserciones:
Tabl a[ 2] [ 31 = 4. 5;
Resi st enci as[ LI [ 41 = 50;
Asi ent osLi br es [ 5] [ 12] = 5;
y de extraccin de valores:
Vent as = Tabl a[ l l [ l l ;
Di a = Semana[ 31 [ 61;
8.4.3. Lectura y escritura de el ementos de arrays bi di mensi onal es
Las funciones de entrada o salida se aplican de igual forma a los elementos de un array bidimensional.
Por ejemplo,
i nt t abl ar 31 [ 41;
doubl e r esi st enci as [ 4] [ 51 ;
scanf ( "%d' , &t abl a[ 21 [ 31 1 ;
pr i nt f ( " %4d" , t abl a[ l ] [ l ] ) ;
scanf ( "%l f ", &r esi st enci as[ 21 [ 41 1;
i f ( asi ent osLi br es [ 3] [ 11 )
el se
put s ( "VERDADERO" ) ;
put s ( " FALSO" ) ;
8.4.4. Acceso a el ementos medi ante bucles
Se puede acceder a los elementos de arrays bidimensionales mediante bucles anidados. Su sintaxis es:
i nt I ndi ceFi l a, I ndi ceCol ;
f or ( I ndi ceFi l a = O; I ndi ceFi l a < NumFi l as; ++I ndi ceFi l a)
f or ( I ndi ceCol = O; I ndi ceCol < NumCol ; ++I ndi ceCol )
Procesar el ement o[ I ndi ceFi l al [ I ndi ceCol l ;
Ejemplo 8.9
Dejine una tabla de discos, rellena la tabla con datos de entrada y se muestran por pantalla.
f l oat di scos C21 [41 ;
i nt f i l a, col ;
f or ( f i l a = O; f i l a < 2; f i l a++)
i
f or ( col = O; col < 4; col ++)
i
1
scanf ( " %f " , &di scos[ f i l a] [ col ] ) ;
i
/ * Vi sual i zar l a t abl a */
Arrays (listas y tabl as) 273
f or ( f i l a = O; f i l a < 2; f i l a++)
t
f or ( col = O; col < 4; col ++)
I
I
pr i nt f ( " \ n Pt s %. l f \ n" , di scos [ f i l a] [ col ] ) ;
Ejercicio 8.1
Lectura y visualizacin de un array de dos dimensiones.
La funcin l eer ( ) lee un array (una tabla) de dos dimensiones y la funcin vi sual i zar ( )
presenta la tabla en la pantalla.
#i ncl ude <st di o. h>
/ * pr ot ot i pos */
voi d l eer ( i nt a[ l [ 5] ) ;
voi d vi sual i zar ( const i nt al l [ 51) ;
i nt mai n ( )
{
i nt a[ 3] [ 5] ;
l eer ( a) ;
vi sual i zar ( a) ;
r et ur n O;
I
voi d l eer ( i nt a [ I [51
I
i nt i , j ;
put s( " 1nt r oduzca 15 nmer os ent er os, 3 por f i l a" ) ;
f or ( i = O; i < 3; i ++)
{
pr i nt f ( " Fi l a %d: ' I , i ) ;
f or ( j = O; j < 5; j ++)
scanf ( "&d", &a[ i l l j l 1 ;
I
I
voi d vi sual i zar ( const i nt a[ ] 151)
I
i nt i , j ;
f or ( i = O; i < 3; i ++)
I
r fila
h
274 Programacin en C. Metodologa, algoritmos y estructura de datos
Fi l a O: 45 75 25 10
Fi l a 1: 20 14 36 15
Fila 2: 21 15 37 16
45 75 25 10 40
20 14 36 15 26
21 15 37 16 27
8.4.5. Arrays de ms de dos dimensiones
~
40
26
27
C proporciona la posibilidad de almacenar varias dimensiones, aunque raramente los datos del mundo
real requieren ms de dos o tres dimensiones. El medio ms fcil de dibujar un array de tres dimensiones
es imaginar un cubo tal como se muestra en la Figura 8.10.
Un array tridimensional se puede considerar como un conjunto de arrays bidimensionales
combinados juntos para formar, en profundidad, una tercera dimensin. El cubo se construye con filas
(dimensin vertical), columnas (dimensin horizontal) y planos (dimensin en profundidad). Por
consiguiente, un elemento dado se localiza especificando su plano, fila y columna. Una definicin de un
array tridimensional equipos es:
i nt equi pos[ 31 [ 151 [ l o1 ;
Un ejemplo tpico de un array de tres dimensiones es el modelo libro, en el que cada pgina del
libro es un array bidimensional construido por filas y columnas. As, por ejemplo, cada pgina tiene
cuarenta y cinco lneas que forman las filas del array y ochenta caracteres por lnea, que forman las
columnas del array. Por consiguiente, si el libro tiene quinientas pginas, existirn quinientos planos y
el nmero de elementos ser 500 x 80 x 45 =1.800.000.
4
5
Figura 8.10. Un arrayde tres dimensiones ( 4 x 5 x 3).
8.4.6. Una aplicacin prctica
El array l i bro tiene tres dimensiones [ PAGI NAS] [ LI NEAS] [ COLUMNAS] , que definen el tamao
del array. El tipo de datos del array es char, ya que los elementos son caracteres.
h
I
i I
Arrays (listas y tablas) 275
Cmo se puede acceder a la informacin del libro? El mtodo ms fcil es mediante bucles
anidados. Dado que el libro se compone de un conjunto de pginas, el bucle ms externo ser el bucle
de pgina; y el bucle de columnas el bucle ms interno. Esto significa que el bucle de filas se insertar
entre los bucles pgina y columna. El cdigo siguiente permite procesar el array l
i nt pagi na, l i nea, col umna;
f or ( pagi na = O; pagi na < PAGI NAS; ++pagi na)
f or ( l i nea = O; l i nea < LI NEAS; ++l i nea)
f or ( col umna = O; col umna < COLUMNAS; ++col umna)
<pr ocesar Li br o [ pagi na] [ l i neal [ col umna] >
Ejercicio 8.2
Comprobar si una matriz de nmeros enteros es simtrica respecto a la diagonal principal.
La matriz se genera internamente, con la funcin r andom( y argumento N(8) para que la matriz
tenga valores de O a 7. El tamao de la matriz se pide como dato de entrada. La funcin s i me t r i ca ( )
determina si la matriz es simtrica. La funcin mai n ( genera matrices hasta encontrar una que sea
simtrica y la escribe en pantalla.
/ *
Det er mi na si una mat r i z es si mt r i ca. La mat r i z se gener a con nmer os
al eat or i os de O a 7. El pr ogr ama i t er a hast a encont r ar una mat r i z
si mt r i ca.
*/
#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <t i me. h>
#def i ne N 8
voi d genmat ( i nt a[ ] [ NI , i nt n) ;
i nt si met r i ca( i nt a[ ] [ NI , i nt n) ;
voi d escr i bemat ( i nt a[ ] [ NI , i nt n) ;
i nt mai n ( voi d)
t
i nt a[ N] [ N] ; / * def i ne mat r i z de t amao mxi mo N */
i nt n, i , j ;
i nt es- si m;
r andomi ze ( ) ;
do i
pr i nt f ( " \ nTamao de cada di mensi n de l a mat r i z, mxi mo %d: " , N) ;
scanf ( " %d" , &n) ;
}whi l e ( n<2 1 I n>N) ;
do i
gen- mat ( a, n) ;
es- si m= si met r i ca( a, n) ;
i f ( es- si m)
i
put s ( " \ n\ Encont r ada mat r i z si mt r i ca. \ n" ) ;
escr i be- mat ( a, n) ;
1
} whi l e ( ! es- si m) ;
r et ur n O;
276 Programacin en C. Metodologa, algoritmos y estructura de datos
1
voi d genmat ( i nt a [ ] [ NI , i nt n)
i
i nt i , j ;
f or ( i =0; i <n; i t +)
f or ( j =O; j <n; j ++)
a[ i ] [ j l = r andom( N) ;
I
i nt si met r i ca( i nt a[ ] [ NI , i nt n)
i
i nt i , j ;
i nt es- si met r i ca;
f or ( es- s met r i ca=l , i =O; i <n- i && es- si met r i ca; i ++)
{
f or ( j =i +l ; j cn && es- si met r i ca; j ++)
i f ( a[ i ] [j l != a[ j l [ i l )
es- si met r i ca= O;
1
r et ur n es- si met r i ca;
1
voi d escr i bemat ( i nt a[ ] [ NI , i nt n)
{
i nt i , j ;
put s ( " \ t Mat r i z anal i zada" ) ;
f or ( i z o; i m; i ++)
{ put char ( ' \ t ' ) ;
\ n" ) ;
put s ( "\ t - - - _ _ _ ----~-
f or ( j =0; j <n; j ++)
pr i nt f ( " %d %c" , a[ i ] [ j ] , ( j ==n- l ?' \ n ': ' ' 1 ) ;
1
I
8.5. UTILIZACI~N DE ARRAYS COMO PARMETROS
En C todos los arrays se pasan por referencia (direccin). Esto significa que cuando se llama a una
funcin y se utiliza un array como parmetro, se debe tener cuidado de no modificar los arrays en
una funcin llamada. C trata automticamente la llamada a la funcin como si hubiera situado el ope-
rador de direccin & delante del nombre del array. La Figura 8.1 1 ayuda a comprender el mecanismo.
Dadas las declaraciones
#def i ne MAX 100
doubl e dat os[ MAXl ;
se puede declarar una funcin que acepte un array de valores double como parmetro. La funcin
SumaDeDat os ( ) puede tener ei prototipo:
doubl e SumaDeDat os( doub1e dat os[ MAXl ) ;
Incluso mejor si se dejan los corchetes en blanco y se aade un segundo parmetro que indica el
doubl e SumaDeDat os( doub1e dat os[ ] , i nt n) ;
tamao del array:
k
i nt mai n0
t
char
pal abr a [ 4 I ="AB(: ";
cambi ar - pa l abr a ;
put s( pa1abr a) ;
return O;
7
~ ~ ~- -
Arrays (listas y tablas) 277
I
voi d
Figura 8.11. Paso de un array por direccin.
A la funcin SumaDeDat os se pueden entonces pasar argumentos de tipo array junto con un entero
n, que informa a la funcin sobre cuantos valores contiene el array. Por ejemplo, esta sentencia visualiza
la suma de valores de los datos del array:
pr i nt f ( " \ nSuma = %I f " , SumaDeDat os ( dat os, MAX) ) ;
La funcin SumaDeDat os no es difcil de escribir. Un simple bucle f or suma los elementos del
array y una sentencia r et ur n devuelve el resultado de nuevo al llamador:
doubl e SumaDeDat os( doub1e dat osi ] , i nt n)
I
doubl e suma = O;
whi l e ( n > O)
suma += dat os[ - - nl ;
r et ur n suma;
1
El cdigo que se utiliza para pasar un array a una funcin incluye el tipo de elemento del array y su
nombre. El siguiente ejemplo incluye dos funciones que procesan arrays. En ambas listas de parmetros,
el array a [ 1 se declara en la lista de parmetros tal como
doubl e a[l
El nmero real de elementos se pasa mediante una variable entera independiente. Cuando se pasa un
array a una funcin, se pasa realmente slo la direccin de la celda de memoria donde comienza el
array. Este valor se representa por el nombre del array a. La funcin puede cambiar entonces el
contenido del array accediendo directamente a las celdas de memoria en donde se almacenan los
elementos del array. As, aunque el nombre del array se pasa por valor, sus elementos se pueden cambiar
como si se hubieran pasado por referencia.
Ejemplo 8.5
Paso de arrays a funciones. En el ejemplo se lee un array y se escribe.
El array tiene un tamao mximo, L, aunque el nmero real de elementos es determinado en la
funcin l eer Ar r ay ( ) . El segundo argumento es, por tanto, un puntero para as poder transmitir por
referencia y obtener dicho dato de la funcin.
278 Programacin en C. Metodologa, algoritmos y estructura de datos
#i ncl ude <st di o. h>
#def i ne L 100
voi d l eer Ar r ay( doub1e a[ ] , i nt * ) ;
voi d i mpr i mi r Ar r ay ( const doubl e [ I , i nt ) ;
i nt mai n( )
i
doubl e a[ L] ;
i nt n;
1eer Ar r ay ( a, &n) ;
pr i nt f ( " E1 ar r ay a t i ene %d el ement os, est os son\ n " , n) ;
i mpr i mi r Ar r ay ( a, n) ;
r et ur n O;
1
voi d l eer Ar r ay( doub1e a[ ] , i nt * num)
i
i nt n = 0;
put s( " 1nt r oduzca dat os. Par a t er mi nar pul sar O. \ n" ) ;
f or ( ; n < L; n++)
i
pr i nt f ( " %d: " , n) ;
scanf ( " %l f " , &a[ n] ) ;
i f ( a[ n] == O) br eak;
I ;
*num= n;
1
voi d i mpr i mi r Ar r ay( const doubl e a[ l , i nt n)
t
i nt i = 0;
f or ( ; i < n; i ++)
pr i nt f ( " \ t %d: %l f \ n" , i , a[ i ] ) ;
1: 15. 25
2: 44. 77
3: O
El array tiene tres elementos, stos son:
O: 31. 31
1: 15 - 2 5
2: 44. 77
k
Ar r ays (l i st as y tablas) 279
Ejercicio 8.2
Escribir una funcin que calcule el mximo de los primeros n elementos de un array especificado.
doubl e maxi mo( const doubl e a[ l , i nt n)
doubl e mx;
i nt i ;
mx = a[ Ol ;
f or ( i = 1; i < n; i ++)
m~ = ( a[ i ] >mx ? a[ i l : mx) ;
r et ur n mx;
I
8.5.1. Precauciones
Cuando se utiliza una variable array como argumento, la funcin receptora puede no conocer cuntos
elementos existen en el array. Sin su conocimiento una funcin no puede utilizar el array. Aunque la
variable array puede apuntar al comienzo de l, no proporciona ninguna indicacin de donde termina el
array.
La funcin SumaDeEnt er os ( ) suma los valores de todos los elementos de un array y devuelve el
total.
{
1
i nt mai n( )
{
i nt SumaDeEnt er os( i nt " Ar r ayEnt er os)
. . .
i nt l i st a[ i ] = {l o, 11, 12, 13, 141;
SumaDeEnt er os ( l i st a) ;
...
1
Aunque SumaDeEnt er os ( ) conoce donde comienza el array, no conoce cuntos elementos hay en
el array; en consecuencia, no sabe cuntos elementos hay que sumar.
Se pueden utilizar dos mtodos alternativos para permitir que una funcin conozca el nmero
de argumentos asociados con un array que se pasa como argumento de una funcin:
situar un valor de seal al final del array, que indique a la funcin que se ha de detener
el proceso en ese momento;
un segundo argumento que indica el nmero de elementos del array.
Todas las cadenas utilizan el primer mtodo ya que terminan en nulo. Una segunda alternativa es
pasar el nmero de elementos del array siempre que se pasa el array como un argumento. El array y el
nmero de elementos se convierten entonces en una pareja de argumentos que se asocian con la funcin
llamada. La funcin SumaDeEnt er os ( 1, por ejemplo, se puede actualizar as:
I
i nt SumaDeEnt er os( i nt Ar r ayEnt er os[ ] , i nt NoEl ement os)
i
1
. . .
280 Programacin en C. Metodologa, algoritmos y estructura de datos
El segundo argumento, NoEl ement os, es un valor entero que indica a la funcin SumaDeEnt er os ( )
cuantos elementos se procesarn en el array Ar r ayEnt er os . Este mtodo suele ser el utilizado para
arrays de elementos que no son caracteres.
Ejemplo 8.6
Este programa introduce una lista de I O nmeros enteros y calcula su suma y el valor mximo.
#i ncl ude <st di o. h>
i nt SumaDeEnt er os( const i nt Ar r ayEnt er os[ ] , i nt NoEl ement os) ;
i nt maxi mo( const i nt Ar r ayEnt er os[ ] , i nt NoEl ement os) ;
i nt mai n0
{
i nt i t ems [ l o] ;
i nt Tot al , i ;
put s( ' 1nt r oduzca 10 nmer os, segui dos por r et ur n" ) ;
f or ( i = O; i < 10; i ++)
scanf ( " %d" , &I t ems[ i l ) ;
pr i nt f ( ' Tot a1 = %d \ n' , SumaDeEnt er os( I t ems, l O) ) ;
pr i nt f ( " Va1or mxi mo: %d \ n" , maxi mo( I t ems, l O) 1 ;
r et ur n O;
1
i nt SumaDeEnt er os( cons i nt Ar r ayEnt er os[ l , i nt NoEl ement os)
i
i nt i , Tot al = O;
f or ( i = 0; i < NoEl ement os; i ++)
Tot al += Ar r ayEnt er os[ i ] ;
r et ur n Tot al ;
1
i
i nt maxi mo( const i nt Ar r ayEnt er os[ ] , i nt NoEl ement os)
i nt mx;
i nt i ;
mx = Ar r ayEnt er os [ 0 I ;
f or ( i = 1; i < NoEl ement os; i ++)
mx = ( Ar r ayEnt er os [ i ] >mx ? Ar r ayEnt er os [ i ] : mx) ;
r et ur n mx;
1
El siguiente programa muestra cmo se pasa un array de enteros a una funcin de ordenacin,
#i ncl ude <st di o. h>
voi d or denar ( i nt [ l , i nt ) ; / * pr ot ot i po de or denar */
i nt mai n ( )
or denar ( ) .
t
i nt Li st aEnt [ ] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 101;
i nt i ;
i nt LongLi st a = si zeof ( Li st aEnt ) / si zeof ( i nt ) ;
or denar ( Li st aEnt , LongLi st a) ;
1
Arrays (listas y tablas) 281
f or ( i = O; i < LongLi st a; i ++)
r et ur n O;
pr i nt f ( " %d " , Li st aEnt [ i l ) ;
1
voi d or denar ( i nt l i st a[ l , i nt numEl ement os)
{
/ * cuer po de l a f unci n or denar el ar r ay */
1
Como C trata las cadenas como arrays de caracteres, las reglas para pasar arrays como argumentos
a funciones se aplican tambin a cadenas. El siguiente ejemplo de una funcin de cadena que convierte
los caracteres de sus argumentos a maysculas, muestra el paso de parmetros tipo cadena.
voi d convi er t emayus( char cad[ ] )
i
i nt i = O;
i nt i nt er val o = ' a' - ' A ';
whi l e ( cad[ i l )
{
cad[ i ] = ( cad[ i ] >=' a' && cad[ i l <=' z' ) ? cad[ i l - i nt er val o: cad[ i l ;
i ++;
1
1
La funcin convi er t emayus ( recibe una cadena, un array de caracteres cuyo ltimo carcter es
el nulo (O). El bucle termina cuando se alcance el fin de cadena (nulo, condicinfulse). La condicin del
operador ternario determina si el carcter es minscula, en cuyo caso resta a dicho carcter el intervalo
que hay entre las minsculas y las maysculas.
8.5.2. Paso de cadenas como parmetros
La tcnica de pasar arrays como parmetros se utiliza para pasar cadenas de caracteres a funciones. Las
cadenas terminadas en nulo utilizan el primer mtodo dado anteriormente para controlar el tamao de
un array. Las cadenas son arrays de caracteres. Cuando una cadena se pasa a una funcin, tal como
s t r 1 en ( ) (vase captulo de tratamiento de cadenas), la funcin conoce que se ha almacenado el final
del array cuando ve un valor de O en un elemento del array.
Las cadenas utilizan siempre un O para indicar que es el ltimo elemento del array de caracteres. Este
O es el carcter nulo del cdigo de caracteres ASCII.
Considrese estas declaraciones de una constante y una funcin que acepta un parmetro cadena y
un valor de su longitud.
#def i ne MAXLON 128
voi d FuncDemo( char s[ l , i nt l ong) ;
El parmetro s es un array de caracteres de longitud no especificada. El parmetro l ong indica a la
funcin cuntos bytes ocupa (que puede ser diferente del nmero de caracteres almacenados en s).
Dadas las declaraciones siguientes:
char pr esi dent e [ MAXLON] = " Manuel Mar t i nez" ;
FuncDemo( pr esi dent e, MAXLON) ;
la primera lnea declara e inicializa un array de caracteres llamado pr esi dent e, capaz de almacenar
hasta MAXLON- 1 caracteres ms un byte de terminacin, carcter nulo. La segunda lnea, pasa la cadena
a la funcin.
282 Programacin en C. Metodologa, algoritmos y estructura de datos
8.6. ORDENACIN DE LISTAS
La ordenacin de arrays es otra de las tareas usuales en la mayora de los programas. La ordenacin o
clasificacin es el procedimiento mediante el cual se disponen los elementos del array en un orden
especificado, tal como orden alfabtico u orden numrico.
18
14
Lista
desordenada
Lista ordenada
(ascendente)
Lista ordenada
(descendente)
Figura 8.12. Lista de nmeros desordenada y ordenada en orden ascendente y en orden descendente.
Un diccionario es un ejemplo de una lista ordenada alfabticamente, y una agenda telefnica o lista
de cuentas de un banco es un ejemplo de una lista ordenada numricamente. El orden de clasificacin
u ordenacin puede ser ascendente o descendente.
Existen numerosos algoritmos de ordenacin de arrays: insercin, burbuja, seleccin, rpido (quick
sort), fusin (merge), montculo (heap), shell, etc.
8.6.1. Al gori tmo de la burbuja
La ordenacin por burbuja es uno de los mtodos ms fciles de ordenacin. El mtodo (algoritmo) de
ordenacin es muy simple. Se compara cada elemento del array con el siguiente (por parejas), si no
estn en el orden correcto, se intercambian entre s sus valores. El valor ms pequeoflota hasta la parte
superior del array como si fuera una burbuja en un vaso de refresco con gas.
La Figura 8.13 muestra una lista de nmeros, antes, durante las sucesivas comparaciones y a la
terminacin del algoritmo de la burbuja. Se van realizando diferentes pasadas hasta que la lista se
encuentra ordenada totalmente en orden ascendente.
Lista desordenada: 6 4 10 2 8
Primera pasada 6 4 4 4
4 6 6 6
10 10 2 2
2 2 10 8
8 8 8 10
Segunda pasada 4 4
6 2
2 6
8 8
10 10
Arrays (listas y tablas) 283
Tercera pasada 4 2
2 4
6 6
8 8
10 10
Cuarta pasada 2
4
6
8
10
Figura 8.13. Secuencias de ordenacin.
La ordenacin de arrays requiere siempre un intercambio de valores, cuando stos no se encuentran
en el orden previsto. Si, por ejemplo, en la primera pasada 6 y 4 no estn ordenados se han de
intercambiar sus valores. Suponiendo que el array se denomina lista:
l i st a [ O I 6
l i st a[ l ] 4
l i st a [ 2 1 10
l i st a[ 3] 2
l i st a[ 4] 8
para intercambiar dos valores, se necesita utilizar una tercera variable auxiliar que contenga el resultado
inmediato. As, por ejemplo, si las dos variables son 1 i s t a [ O I y 1 1 s t a [ 1 1 , el siguiente cdigo realiza
I/
E '
el intercambio de dos variables:
Ejemplo 8.7
La funcin intercambio intercambia los valores de dos variables x e y
El algoritmo de intercambio utiliza una variable auxiliar
aux = x;
x = y;
y = aux;
La funcin i nt er cambi o sirve para intercambiar dos elementos x e y que se pasan a ella. Al tener
que pasar por referencia, los argumentos de la funcin son punteros.
voi d i nt er cambi o( f l oat * x, f l oat " y)
i
f l oat aux;
aux = *x;
*x = * y ;
*y = aux;
I
Una llamada a esta funcin:
f l oat r , v;
i nt er cambi o( &r , &v) ;
284 Programacin en C. Metodologa, algoritmos y estructura de datos
Ejemplo 8.8
El programa siguiente ordena una lista de nmeros reales y a continuacin los imprime.
#i ncl ude <st di o. h>
/ * pr ot ot i pos */
voi d i mpr i mi r ( f 1oat a[ ] , i nt n) ;
voi d i nt er cambi o( f l oat * x, f l oat * y) ;
voi d or denar ( f l oat a[ ] , i nt n) ;
i nt mai n( )
f l oat a[ 10] ={25. 5, 34. 1, 27. 6, 15. 24. 3. 27, 5. 14, 6. 21, 7. 57, 4. 61, 5. 41;
i mpr i mi r ( a, l O) ;
or denar ( a, 1 O ) ;
i mpr i mi r ( a, l O) ;
r et ur n O;
1
voi d i mpr i mi r ( f 1oat a[ ] , i nt n)
i
i nt i = O;
f or ( ; i < n- 1; i ++) {
1
pr i nt f ( " %f \ n" , a[ n- 11) ;
pr i nt f ( " %f , %c" , a[ i ] , ( ( i +1) %10==0 ? ' \ n' : ' ' ) 1 ;
1
voi d i nt er cambi o( f l oat * x, f l oat * y)
{
f l oat aux;
aux = *x;
*x = *y;
*y = aux;
1
/ * or denar bur buj a */
voi d or denar ( f l oat a[ ] , i nt n)
{
i nt i , j ;
f or ( i = n- 1; i >O; i - - )
f or ( j =, O; j < i ; j ++)
i f (a[]] > a[ j +l l )
i nt er cambi o( &a[ j l , &a[ j +l l 1 ;
1
8.7. BSQUEDA EN LISTAS
Los arrays (listas y tablas) son uno de los medios principales por los cuales se almacenan los datos en
programas C. Debido a esta causa, existen operaciones fundamentales cuyo tratamiento es imprescin-
dible conocer. Estas operaciones esenciales son: la bsqueda de elementos y la ordenacin o clasifica-
cin de las listas.
La bsqueda de un elemento dado en un array (lista o tabla) es una aplicacin muy usual en el
desarrollo de programas en C. Dos algoritmos tpicos que realizan esta tarea son la bsqueda secuencial
1
Arrays (listas y tablas) 285
o en serie y la bsqueda binaria o dicotmica. La bsqueda secuencial es el mtodo utilizado para
listas no ordenadas, mientras que la bsqueda binaria se utiliza en arrays que ya estn ordenados.
8.7.1. Bsqueda secuencial
Este algoritmo busca el elemento dado, recorriendo secuencialmente el array desde un elemento al
siguiente, comenzando en la primera posicin del array y se detiene cuando se encuentra el elemento
buscado o bien se alcanza el final del array.
Por consiguiente, el algoritmo debe comprobar primero el elemento almacenado en la primera
posicin del array, a continuacin el segundo elemento y as sucesivamente, hasta que se encuentra el
elemento buscado o se termina el recorrido del array. Esta tarea repetitiva se realizar con bucles, en
nuestro caso con el bucle while.
Algoritmo BusquedaSec
Se utiliza una variable lgica, en C tipo i nt , denominada Encont r ado, que indica si el elemento se
encontr en la bsqueda. La variable Encont r ado se inicializa a fulso(0) y se activa a verdudero(1)
cuando se encuentra el elemento. Se utiliza un operador and ( en c && ) , que permita evaluar las dos
condiciones de terminacin de la bsqueda: elemento encontrado o no haya ms elementos (ndice del
array excede al ltimo valor vlido del mismo).
Cuando el bucle se termina, el elemento o bien se ha encontrado, o bien no se ha encontrado. Si el
elemento se ha encontrado, el valor de Enc ont r ado ser verdadero y el valor del ndice ser la posicin
del array (ndice del elemento encontrado). Si el elemento no se ha encontrado, el valor de Enc ont r ado
serfalso y se devuelve el valor - I ai programa llamador.
BusquedaSec
inicio
Poner Encont r ado = f al so
Poner I ndi ce = pr i mer i ndi ce del ar r ay
mientras ( El ement o no Encont r ado) y ( I ndi ce < Ul t i mo) hacer
si ( A[ i ndi ce] = El ement o) entonces
si no
Poner Encont r ado a Ver dader o
I ncr ement ar I ndi ce
fin-mientras
si ( Encont r ado) entonces
r et or no ( I ndi ce)
si no
r et or no ( - 1)
fin-si
in
El algoritmo anterior implementado como una funcin para un array Li st a es:
enum{FALSE, TRUE};
i nt BusquedaSec( i nt Li st a[ MAX] , i nt El ement o)
i
i nt Encont r ado = FALSE;
i nt i = O;
/ * Bsqueda en l a l i st a hast a que se encuent r a el el ement o
*/
o se al canza el f i nal de l a l i st a.
286 Programacin en C. Metodologa, algoritmos y estructura de datos
whi l e ( ( ! Encont r ado) && ( i <= MAX- 1) )
i
1
/ *Si se encuent r a el el ement o se devuel ve l a posi ci n en l a l i st a. */
i f ( Encont r ado)
r et ur n ( i ) ;
el se
r et ur n ( - 1) ;
1
En el bucle whi l e se ha utilizado el operado condicional ? : para asignar TRUE si se encuentra el
Encont r ado = ( ( A[ i ] == El ement o) ?TRUE: i ++) ;
elemento, o bien incrementar el ndice i.
Ejemplo 8.9
El siguiente programa busca todas las ocurrencias de un elemento y la posicin que ocupa en una
matriz. La posicin viene dada porJila y columna; la matriz se genera con nmeros aleatorios de O
a 49.
La funcin de bsqueda devuelve O si no encuentra al elemento, 1 si lo encuentra. Tiene el
argumento de la matriz y dos parmetros para devolver la fila y columna, por lo que tendrn que ser de
tipo puntero para poder devolver dicha informacin. La bsqueda se har a partir de la fila y columna
de la ltima coincidencia.
#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <t i me. h>
#def i ne F 8
#def i ne C 10
#def i ne N 50
voi d escr i bemat ( i nt a [ I [ Cl ) ;
voi d genmat ( i nt a [ I [ Cl ) ;
i nt buscar ( i nt a[ ] [ C] , i nt * f i l a, i nt * co1, i nt el ement o) ;
i nt mai n( )
i
i nt a[ Fl [ Cl ;
i nt i t em, nf , nc, est a;
i nt veces = O;
r andomi ze ( ) ;
genmat ( a) ;
pr i nt f ( " \ n El ement o a buscar : " ) ;
scanf ( " %d" , &i t em) ;
do i
est a = buscar ( a, &nf , &nc, i t em) ;
i f ( est a)
i
veces = veces+l ;
pr i nt f ( " \ n coi nci denci a %d: Fi l a %d, Co1. umna %d\ n" , veces, nf , nc) ;
1
}whi l e ( est a) ;
escr i be- mat ( a) ;
pr i nt f ( " \ nNmer o de coi nci denci as del el ement o %d : %d" ,
i t em, veces) ;
r et ur n O;
I
Arrays (listas y tablas) 287
I'
/ * Busqueda l i neal en t oda l a mat r i z */
i nt buscar ( i nt a[ ] [ Cl , i nt * f i l a, i nt * co1, i nt el ement o)
st at i c i nt x = O, y = - 1;
i nt i , j , encont r ado;
/ * avanza al si gui ent e el ement o( f i l a, col umna) */
i f ( y == C- 1) / * ul t i ma col umna */
I
y = o;
x = x+l ;
I
el se
y = y+l ;
encont r ado = O;
whi l e ( ! encont r ado && (x<F))
{
encont r ado = ( a[ xl [ y ] == el ement o) ;
i f ( ! encont r ado) / * avanza a si gui ent e el ement o */
i f ( y == C- 1)
i
y = o;
x = x+l ;
I
el se
y = y+l ;
i
/ * ul t i mo val or de x e y */
* f i l a = x;
*col = y;
r et ur n encont r ado;
}
voi d gen- mat ( i nt a[ ] [Cl )
i
i nt i , j ;
f or ( i =O ; i <F; i ++)
f or ( j =O ; j <C; j ++)
a[ i ] [ j ] = r andom( N) ;
I
voi d escr i bemat ( i nt a [ I [Cl )
I
i nt i , j ;
put s ( " \ t \ t Mat r i z anal i zada" ) ;
f or ( i zo; k F ; i ++)
{ put char ( ' \ t ' ) ;
\ n" 1 ;
put s ( "\ t \ t - - -
f or ( j =O ; j <C; j ++)
pr i nt f ( " %d %c" , a[ i l [ j ] , ( j ==C- i ?' \ n ' : I I ) ) ;
1
I
288 Programacin en C. Metodologa, algoritmos y estructura de datos
Ejemplo 8.10
En este programa se quiere buscar la fila de una matriz real que tiene la mxima suma de sus elementos
en valor absoluto, La matriz se genera con nmeros aleatorios, las dimensiones de la matriz se
establecen con una constante predejinida.
Para determinar la suma de una fila se define la funcin sumar ( ) , se la pasa la direccin del primer
elemento de la fila para tratar cada fila como una array unidimensional. Para generar nmeros aleatorios
de tipo real, se divide el nmero que devuelve la funcin r and ( ) entre 100.0.
#i ncl ude <st dl i b. h>
#i ncl ude <st di o. h>
#i ncl ude <t i me. h>
#def i ne F 6
#def i ne C 10
#def i ne V 100. 0
voi d escr i be- mat ( f l oat mt [ I [Cl ) ;
voi d gen- mat ( f l oat mt [ 1 [Cl ) ;
f l oat sumar ( f 1oat v[ l ) ;
i nt maxi mo( f 1oat mt [I [ Cl ) ;
i nt mai n ( )
t
f l oat mat [Fl [ C] ;
i nt f i l a;
r andomi ze ( ) ;
gen- mat ( mat ) ;
escr i bemat ( mat ) ;
f i l a = maxi mo( mat ) ;
pr i nt f ( " \ n\ nFi l a cuya suma de el ement os es mayor : %d" , f i l a) ;
r et ur n O;
1
voi d gen- mat ( f l oat mat [ 1 [Cl
{
i nt i , j ;
f or ( i =O; i <F; i ++)
f or ( j =O; j <C; j ++)
mat [ i l [ j l = r andO/ V;
1
voi d escr i bemat ( f 1oat mat [ l [ Cl )
{
i nt i , j ;
put s ( I' \ n\ t \ t Mat r i z anal i zada\ n" ) ;
\ n" ) ;
put s( l l \ t \ t - - - ___ ------
f or ( i =O; i <F; i ++)
{
f or ( j =O; j <C; j ++)
pr i nt f ( " %. 2f %c" , mat [ i ] [ j l , ( j ==C- l ?' \ n I : ' ' ) I ;
I
1
f l oat sumar ( f l oat v [ I )
{
i nt i ;
f l oat s;
Arrays (listas y tabl as) 289
f or ( s=O. O, i =O; i d ; i ++)
r et ur n s;
s += v[ i ] ;
I
i nt maxi r no( f 1oat mt [I [ Cl )
{
f l oat mx;
i nt i , f ;
mx = sumar ( &mt [ O] [ O] ) ; / * di r ecci n de pr i mer a f i l a */
pr i nt f ( " \ nSuma f i l a %d %. 2f " , O, mx) ;
f or ( f =O, i =l ; i <F; i ++)
i
f l oat t ;
t = sumar( &rnt [i l [ O] ) ;
pr i nt f ( " \ nSuma f i l a %d %. Lf " , i , t ) ;
i f ( t > rnx)
{
mx = t ;
f = i ;
I
I
r et ur n f ;
1
290 Programacin en C. Metodologa, algoritmos y estructura de datos
8.9. EJERCICIOS
Para los Ejercicios 8.1 a 8.5, suponga las declaracio-
nes:
i nt i , j , k;
i nt Pr i mer o [ 21] , Segundo [ 211;
i nt Ter cer oL61 [ I 21 ;
Determinar la salida de cada segmento de progra-
ma(en los casos que se necesite, se indica debajo el
archivo de datos de entrada correspondiente).
8.1. f or ( i =l ; i <=6; i ++)
scanf ( ' %d"&Pr i mer o[ i l ) ;
f or ( i = 3; i >O; i - - )
pr i nt f ( " %4d" , ~r i mer o[ 2*i ] ) ;
.................
3 7 4 - 1 0 6
8.2. scanf ( " %d" , &k) ;
f or ( i =3; i <=k; )
j = 4;
pr i nt f ( " %d %d\ n"
, Segundo[ kl , Segundo[ j +l l ) ;
6 3 0 1 9
scanf ( "Bd", &Segundo[ i ++] ) ;
.............
8.3. f or ( i = O; i <l O; i ++)
Pr i mer o[ i ] = i + 3;
scanf ( "%d %d" , &j , &k) ;
f or ( i = j ; i <=k; )
pr i nt f ( ' %d\ n", Pr i mer o[ i ++l ) ;
............
7 2 3 9
8.4, f or ( i =O, i <12; i ++)
scanf ("%d", &Pri mero [ i l ) ;
Segundo [ j ] =Pr i mer o [2 * j I + j ;
pr i nt f ( "%d %d \nl '
Pr i mer o [ k+l l , Segundo [ k- 11) ;
f or ( j =O; j <6; j++)
f or ( k=3; k<=7, k++)
...........
2 7 3 4 9 - 4
6 - 5 O 5 - 8 1
8.5. f or ( j =O; j <7; 1
scanf ( " %d" , &Pr i mer o[ j ++I ) ;
i = O;
j = 1;
while ( (j< 6) && ( Pr i mer o[ j - 11
<Pr i mer o [ j I ) )
i
1
f or ( k= - 1; k<j +2; )
i ++, j ++;
pr i nt f ("%di', Pr i mer o [ ++kl ) ;
..........
20 60 70 10 O 40
30 90
8.6. f or ( i = O; i <: 3; i ++)
f or ( j = O; j <12; j ++)
f or ( i = O; i < 3; i ++)
{
TerceroLi . 1 [ j l = i +j +l ;
j = 2;
while ( j < 12)
{
pr i nt f ( "%i d %d %d \ni ', i , j ,
Ter cer o [ i l Ej l ) ;
j +=3 ;
8.7. Escribir un programa que lea el array
4 7 1 3 5
2 0 6 9 7
3 1 2 6 4
y lo escriba como
4 2 3
7 0 1
1 6 2
3 9 6
5 7 4
8.8. Dado el array
4 7 - 5 4 9
O 3 - 2 6 - 2
1 2 4 1 1
6 1 0 3 - 4
escribir un programa que encuentre la suma de
todos los elementos que no pertenecen a la
diagonal principal.
8.9. Escribir una funci6n que. intercambie la fila
i-sima por la j-sima de un array de dos
dimensiones, mxn.
Arrays (listas y tabl as) 291
8.1.
8.2.
8.3.
8.4.
85.
8.6.
nvierta un nmero
nmero arbigo.
Reglas de conversin
M 1000
D 500
c 100
L 50
X 10
V 5
1 1
Escribir un programa que permita visualizar el
tringulo de Pascal:
1 2 1
1 3 3 1
8.7.
1 4 6 4 1
1 5 10 1 0 5 1
1 6 15 20 15 6 1
En el tringulo de Pascal cada nmero es la
suma de los dos nmeros situados encima de
l. Este problema se debe resolver utilizando
un array de una sola dimensin.
Escribir una funcin que invierta el contenido
de n nmeros enteros. El primero se vuelve el
ltimo; el segundo, el penltimo, etc.
Escribir una funcin a la cual se le proporcione
una fecha (da, mes, ao), as como un nmero
de das a aadir a esta fecha. La funcin
calcula la nueva fecha y se visualiza.
- 8.8.
8.9.
Un nmero entero es primo si ningn otro
nmero primo ms pequeo que l es divisor
suyo. A continuacin escribir
rellene una tabla con los 80 primeros nmeros
primos y los visualice.
Escribir un programa que visualice un cuadra-
do mgico de orden impar n comprendido
entre 3 y I 1 ; el usuario debe elegir el valor de
Ejemplo
8 1 6
3 5 7
rado caiga en una
casilla situada
de ser situado.
letras individuales. Disear un programa para
jugar al ahorcado. Sugemncia: almacenar una
lista de palabras en un array y seleccionar pala-
bras aleatoriamente.
Escribir un programa que lea las dimensiones
de una matriz, lea y visualice la matriz y a
continuacin encuentre el mayor y menor
elemento de la matriz y sus posiciones.
Si x representa la media de los niimeros xi ,
xz, ..A,,, entonces la varianza es la media de los
cuadrados de las desviaciones de los nmeros
de la media.
Y la desviacin esbandar es la raz cuadra-
continuacin calcule e imprima su media,
varianza y desviacin estndar. Utilizar fun-
ciones para calcular la media, vananZa y des-
viacibn estndar.
292 Programacin en C. Metodologa, algoritmos y estructura de datos
tro un vector que puede contener elementos
duplicados. La funcin debe sustituir cada
valor repetido por -5 y devolver ai punto don-
de fue llamado el vector modificado y el
nmero de entradas modificadas.
8.12. Los resultados de las ltimas elecciones a
alcalde en el pueblo x han sido los siguientes:
Distrito Cdi dat o Candidato Candidato Candidaio
A 3 c D
1 1 94 48 206 45
2 180 20 16
3 221 90 20
4 432 50 82 1 14
5 820 61 946 18
Escribir un a que haga las siguien-
tes tareas:
a) Imprimir la tabla anterior con cabeceras
incluidas.
mbre de los dos candidatos
necesita saber cul es el vendedor que ms
coches ha vendido.
1
2
3
10
1 2 3 4... 15
4 8 1 4
12 4 25 14
15 3 4 7
8.15. Disear un programa que determine la fre-
. E tante.
8.18. Escribir un programa que lea una frase y a con-
abra de la frase en thuaci6n visuaii
820. Escribir u lea una linea de
Arrays (listas y tablas) 293
8.22. Escribir una serie de
cadenas, e si la cadena
es un ide la sintaxis de
C. Sugerencias: utilizar las siguientes funcio-
&o del identifcador en el
primero (determinar si el
nombre comienza con un smbolo permitido);
restantes (comprueba si los restantes son
cartcteres permitidos).
8.23. Escriba una funci6n sort que ordene un con-
junto de n cadenas en orden alfatico.
8.24. Disear un programa que determine la media
del nmero de horas trabajadas durante todos
los das de la semana. para cada uno de los
empleados de la Universidad.
8.25. Escriba una funcin que ordene en sentido des-
cendente los n primeros elementos de un array
de cadenas basado en las longitudes de las cade-
nas. Por ejemplo, 'bibi' vendr antes que 'Ana'.
8.26. Se introduce una frase por teclado. Se desea
imprimir cada palabra de la frase en lneas
diferentes y consecutivas.
837. Escribir un programa que determine si una fra-
nmero de veces que se encuentra la palabra
en las n lineas.
839. Se dice que una matriz tiene un punto de silla
si alguna posicin de la matriz es el menor
valor de su fila, y a la
columna. Escribir un
como entrada una
calcule la posici
que existe).
z de numeros reales, y
punto de silla (si es
trar el vector original y el vector con la distri-
bucin indicada.
' I