Capítulo 7 - Arreglos PDF
Capítulo 7 - Arreglos PDF
Capítulo 7 - Arreglos PDF
Arreglos
En los programas que hemos escrito hasta ahora, cada una de las variables que hemos
usado han contenido un slo dato a la vez. En este tema comenzaremos el estudio de los
tipos agregados que son grupos de datos que estn relacionados. Los tipos agregados
comprenden los arreglos, las estructuras y las uniones. Las estructuras y las uniones se
estudiarn en el captulo 12: Tipos de Datos definidos por el Usuario.
Un arreglo es una lista de variables del mismo tipo que se encuentran en localidades
contiguas de memoria y que comparten el mismo nombre. Cada una de las variables de la
lista, llamadas elementos, puede ser accesada por el nombre del arreglo y su posicin en
l. La posicin de un elemento en el arreglo se conoce por ndice. Por ejemplo si
deseamos almacenar las calificaciones de un grupo de alumnos podemos tener un
arreglo llamado califs formado de 50 variables:
califs[0] representa la calificacin del primer alumno,
califs[1] representa la calificacin del segundo alumno, etc.
Podemos ver que cualquier instruccin para leer, procesar y escribir las calificaciones
implica escribir la lista de las 50 variables. Esto representa una tarea bastante tardada y
molesta. Sin embargo, al emplear arreglos los nombres de las variables son iguales y la
distincin entre ellas es mediante su ndice, el cual puede ser una variable entera cuyo
valor puede variarse para que corresponda a las diferentes variables del arreglo. La pieza
de cdigo del ejemplo anterior puede modificarse a
for(i = 0; i < 50; i++)
scanf("%d", &califs[i]);
...
for(i = 0; i < 50; i++)
ITSON
106
Arreglos
printf("%d\t", califs[i]);
Arreglos Unidimensionales
Un arreglo formado por elementos cuyo tipo es un tipo bsico es un arreglo
unidimensional.
tipo es cualquier tipo de datos bsico. tipo es el tipo base del arreglo, esto es el tipo de
cada una de las variables que forman el arreglo.
nomArreglo es un identificador, el nombre del arreglo que estamos declarando.
tamArreglo es una expresin constante de tipo entero que indica el tamao del arreglo,
el nmero de variables de la lista.
NOTA:
Por ejemplo:
int califs[50];
declara un arreglo llamado califs formado por 50 variables de tipo entero. Esas 50
variables tienen el mismo nombre: califs, pero se distinguen por su posicin en el
arreglo. Las variables se llaman califs[0], califs[1], ... , califs[49]. Note
que la primera variable tiene la posicin 0, ndice 0, la segunda 1, etc. En la figura 7-1, se
muestra una representacin del arreglo califs en la memoria de la computadora. Por otro
lado, para almacenar las matrculas de esos alumnos podramos declarar el arreglo
long matriculas[50]
ITSON
Captulo 7
Arreglos
107
Figura 7-1
ITSON
108
Arreglos
for(i = 0; i < nAlums; i++) suma += califs[i];
promedio = (float)suma/nAlums;
ITSON
Captulo 7
Arreglos
109
ITSON
110
Arreglos
Note que los corchetes estn vacos. Si escribimos un valor dentro de los corchetes el
compilador lo ignora ya que para el compilador esta declaracin significa una direccin.
Note tambin que la declaracin anterior slo representa la direccin del arreglo pero no
contiene la informacin sobre el tamao del arreglo. Si se requiere que la funcin conozca
el tamao del arreglo deberemos proporcionrsela a travs de otro parmetro.
Al llamar a la funcin, el argumento ser la direccin del arreglo, el cual puede escribirse
de cualquiera de las siguientes formas:
&nomArreglo[0]
nomArreglo
nomArreglo + 3
para pasarle la direccin del cuarto elemento del arreglo, posiblemente lo que deseamos
es que la funcin procese del cuarto elemento del arreglo en adelante.
ITSON
Captulo 7
Arreglos
111
printf("\nArreglos llenos");
break;
}
// Lee una matricula
printf("\nMatricula del alumno %d, 0 para terminar: ", n + 1);
scanf("%ld", &matriculas[n]);
// Si la matricula leida es cero termina
if (matriculas[n] == 0) break;
// Lee la calificacion
printf("\nCalificacion del alumno %d: ", n + 1);
scanf("%d", &califs[n]);
// Siguiente alumno
n++;
}
// Regresa el numero de alumnos
return n;
}
112
Arreglos
i = 0
// Posicin del elemento a ordenar
mientras(i < tamGpo-1)
{
menor = i
busca la posicin del menor a partir de matriculas[i+1]
// Si hay un nuevo menor intercambia
si(menor != i) intercambia (matriculas[menor], matriculas[i])
i = i + 1
}
El pseudocdigo final es
i = 0
// Posicin del elemento a ordenar
mientras(i < tamGpo-1)
{
menor = i
j = i + 1
// busca el menor
mientras(j < tamGpo)
{
si(matriculas[menor] < matriculas[j]) menor = j
j = j + 1
}
// Si hay un nuevo menor intercambia
si(menor != i) intercambia(matriculas[menor], matriculas[i])
i = i + 1
}
ITSON
Captulo 7
Arreglos
113
Aqu se han substituido los ciclos mientras del pseudocdigo por ciclos for para
compactar el cdigo. Adems, lo que aparece en el pseudocdigo como una
funcin para intercambiar dos elementos del arreglo, se ha substituido por su
cdigo equivalente y como deseamos ordenar simultneamente los dos arreglos, el
de matrculas y el de calificaciones intercambiamos tanto las matrculas como las
calificaciones.
Arreglos Multidimensionales
Si el tipo base de un arreglo es a su vez un arreglo, decimos que el arreglo es
multidimensional. Por ejemplo un arreglo en dos dimensiones puede considerarse como
un arreglo donde cada elemento es a su vez un arreglo unidimensional; un arreglo en tres
dimensiones puede considerarse como un arreglo donde cada elemento es a su vez un
arreglo en dos dimensiones, etc. En C no existe lmite en cuanto al nmero de
dimensiones que puede tener un arreglo.
ITSON
114
Arreglos
tipo es el tipo base del arreglo y puede ser es cualquier tipo de datos bsico.
nomArreglo es un identificador, el nombre del arreglo que estamos declarando.
Un arreglo en dos dimensiones puede visualizarse como una tabla o matriz en la que
numFilas y numCols son expresiones constantes de tipo entero que indica el nmero de
filas y nmero de columnas de la tabla, el nmero de elementos de la tabla es numFilas
* numCols.
Un arreglo en tres dimensiones puede visualizarse como un arreglo de tablas en la que
numTablas, numFilas y numCols son expresiones constantes de tipo entero que indica
el nmero de tablas, filas y columnas del arreglo, el nmero de elementos en un arreglo
tridimensional es numTablas * numFilas * numCols.
Por cada dimensin del arreglo se agrega, en la declaracin, una expresin constante
encerrada entre corchetes la cual representa el tamao de la nueva dimensin. Por
ejemplo para almacenar las cuatro calificaciones parciales de un grupo de alumnos
podramos declarar el arreglo:
int calPars[50][4]
que declara un arreglo llamado calPars formado por 50 variables (una para cada alumno)
que a su vez son arreglos de 4 elementos de tipo int (las calificaciones). Otra forma de ver
al arreglo es como una tabla con 50 filas (los alumnos) y con cuatro columnas (las
calificaciones) en cada fila. Esta declaracin nos crea 200 variables cuyo nombre est
formado por el nombre del arreglo, calpars y dos ndices uno para la fila y otro para la
columna en la que se encuentra el elemento, tal como se muestran en la figura 7-2.
Por otro lado, supongamos que deseamos almacenar las ventas por semestre de una
compaa que est establecida en tres ciudades, con cuatro sucursales en cada ciudad.
Para esto podemos declarar el arreglo ventas
float ventas[3][4][2];
ITSON
Captulo 7
Arreglos
115
Figura 7-2
como formado por 3 variables (las ciudades) que a su vez son arreglos en dos
dimensiones. Cada uno de los elementos es un arreglo de 4 (sucursales) por 2 elementos
(semestres) de tipo float. Otra forma de ver al arreglo es como uno formado de 3 tablas
(las ciudades), cada una con 4 filas (las sucursales y cada fila con 2 columnas.
Esta declaracin nos crea 24 variables cuyo nombre esta formado por el nombre del
arreglo, ventas y tres ndices el primero para la tabla, el segundo para la fila y el tercero
para la columna en la que se encuentra el elemento, tal como se muestran en la figura 73.
Figura 7-3
ITSON
116
Arreglos
le asigna al elemento que se encuentra en la quinta fila, tercera columna del arreglo
calPars el valor de 9.
ventas[2][3][1] = 1252.30
le asigna al elemento que se encuentra en el tercer plano, cuarta fila, segunda columna
del arreglo ventas el valor de 1252.30.
Por ejemplo el siguiente cdigo nos permite calcular el promedio de las calificaciones de
cada alumno y la calificacin promedio del grupo:
int i, j, suma;
float promedios[50], sumaT, promedioT;
...
sumaT = 0;
for(i = 0; i < nAlums; i++)
{
suma = 0;
for(j = 0; j < 4; j++) suma += calPars[i][j];
promedios[i] = (float)suma/4;
sumaT += promedios[i];
}
promedioT = sumaT/nAlums;
0
3
6
1
4
7
2
5
8
ITSON
Captulo 7
Arreglos
117
El nmero de inicializadores puede ser menor que el tamao del arreglo y en este caso el
compilador inicializara a ceros el resto de los elementos
int x[3][3] = {{1}, {0, 1}, {0, 0, 1}};
1
0
0
0
1
0
0
0
1
1
0
0
0
0
0
1
1
0
Note que slo los primeros corchetes estn vacos. Las otras dimensiones del arreglo son
necesarias a fin de que el compilador pueda determinar las direcciones de los elementos
del arreglo. La declaracin del parmetro que corresponde a la direccin del arreglo en
dos dimensiones slo proporciona la direccin del arreglo y su nmero de columnas si se
requiere que la funcin conozca el nmero de filas deberemos proporcionrsela a travs
de otro parmetro. En el caso del arreglo en tres dimensiones, la declaracin slo
ITSON
118
Arreglos
ITSON
Captulo 7
Arreglos
119
2. A fin de saber la inversin que tiene en la agencia, el dueo guarda en otro arreglo,
el monto que pago por cada automvil (Supongamos que por todos los autos del
mismo tipo y del mismo modelo pag lo mismo). Escribe una funcin llamada
leeMontos() que permita capturar el monto pagado por cada automvil y lo
almacene en un arreglo. La funcin recibe como parmetro la direccin del arreglo
en que se va a almacenar los datos.
La declaracin y la definicin de la funcin pedida son
// Declaracin de la funcin leeMontos()
void leeMontos(int autos[][4]);
// Definicin de la funcin leeMontos()
/*
* Esta funcin lee el costo de cada auto para cada marca y
* modelo de la agencia de autos usados y los almacena
* en el arreglo montos.
*/
void leeMontos(float montos[][3]) {
int marca, modelo;
// Para cada marca de auto
for (marca = 0; marca < 3; marca++) {
// Para cada modelo */
for (modelo = 0; modelo < 3; modelo++) {
// Despliega la marca
switch (marca) {
case 0: printf("\nAutos Pointer, ");
break;
case 1: printf("\nAutos Golf, ");
break;
case 2: printf("\nAutos Jetta, ");
}
// Despliega el modelo
printf("modelo %d: ", VIEJO + modelo);
// Lee los montos de los autos de la marca y modelo
scanf("%f", &montos[marca][modelo]);
}
}
}
ITSON
120
Arreglos
Problemas
1. Crea un programa que realice lo siguiente:
a) Lea para cada alumno de un grupo, su matrcula, un entero largo, y su
calificacin, un entero; y los almacene en dos arreglos unidimensionales. Utilice
la funcin leeDatos() del ejemplo 1 sobre arreglos unidimensionales.
b) Ordene los arreglos por orden creciente de la matrcula. Utilice el algoritmo de
ordenacin por. Utilice la funcin seleccion() del ejemplo 2 sobre arreglos
unidimensionales.
c) Despliegue una tabla con los arreglos de matrculas y calificaciones,
ordenados por matrcula. Utilice la funcin despliegaDatos() del ejercicio 1
sobre arreglos unidimensionales.
d) Encuentre y despliegue las siguientes estadsticas:
i) Las calificaciones mayor y menor y las matrculas de los alumnos con esas
calificaciones. Para ello se requieren dos funciones llamadas mayor() y
menor() que reciban como parmetros la direccin del arreglo con las
calificaciones y el nmero de alumnos y regresen la posicin en el arreglo de
las calificaciones mayor y menor, respectivamente.
ii) La media de las calificaciones. Para ello se requiere una funcin llamada
media()que reciba como parmetros la direccin del arreglo con las
calificaciones y el nmero de alumnos y regrese la media de las
calificaciones.
iii) La desviacin estndar de las calificaciones. Para ello se requiere una
funcin llamada desvEstandar() que reciba como parmetros la direccin
del arreglo con las calificaciones, la media de las calificaciones y el nmero
de alumnos y regrese la desviacin estndar de las calificaciones.
e) Nos permita consultar las calificaciones de los alumnos a partir de sus
matrculas. El programa nos pedir la matrcula de cada alumno que deseemos
consultar. Para terminar se dar un cero en la matrcula. Utilice una bsqueda
secuencial. Utilice la funcin secuencial() del ejercicio 2 sobre arreglos
unidimensionales.
No deber usarse variables globales.
2. Una firma emplea a un grupo de 20 vendedores a quien se les paga comisin sobre
la porcin de las ventas que exceden las dos terceras partes de las ventas
ITSON
Captulo 7
Arreglos
121
promedio del grupo. Se requiere un programa que lea las ventas de cada vendedor
e imprima una lista de los vendedores que obtuvieron comisin, junto con las sus
ventas.
No deber usarse variables globales.
3. En un hospital se registra la temperatura de un paciente 4 veces al da durante una
semana. Construya un programa que lea las temperaturas y los almacene en un
arreglo de dos dimensiones.
a) El programa deber desplegar una tabla de la siguiente forma:
Lectura
1
2
3
4
XX
XX
XX
XX
Dom
XX
XX
XX
XX
Lun
XX
XX
XX
XX
Mar
XX
XX
XX
XX
Mie
XX
XX
XX
XX
Jue
XX
XX
XX
XX
Vie
XX
XX
XX
XX
Sab
ITSON
122
Arreglos
ITSON