Sunteți pe pagina 1din 18

Captulo 7

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.

El nmero entre corchetes es el ndice.


La necesidad de los arreglos puede verse en el siguiente ejemplo. Suponga que
deseamos leer las calificaciones de los alumnos, procesarlas y por ltimo escribirlas.
Suponga que no disponemos de un arreglo para almacenar los datos y por lo tanto se
requiere de variables individuales. La siguiente pieza de cdigo realiza la tarea.
scanf("%d%d ... %d", &calisf0, &califs1, ... , &califs49);
...
printf("\n%d\t%d\t ... %d", califs0, califs1, ..., califs49);

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

Manuel Domitsu Kono

106

Arreglos
printf("%d\t", califs[i]);

Arreglos Unidimensionales
Un arreglo formado por elementos cuyo tipo es un tipo bsico es un arreglo
unidimensional.

Declaracin de una Variable de Tipo Arreglo


Unidimensional
La sintaxis para declarar un arreglo unidimensional es la siguiente:
tipo nomArreglo[tamArreglo]

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:

Los corchetes encerrando a tamArreglo no indican que este sea opcional.


Aqu forman parte de la declaracin del tipo.

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]

un arreglo llamado matriculas formado por 50 variables de tipo entero largo.

ITSON

Manuel Domitsu Kono

Captulo 7

Arreglos

107

Figura 7-1

Indexamiento en Arreglos Unidimensionales


Existen dos formas de accesar a los elementos de un arreglo: indexamiento y
apuntadores. El mecanismo de apuntadores se estudia en el Captulo 8: Apuntadores. El
mecanismo de indexamiento utiliza el nombre del elemento para accesar al contenido de
ese elemento, tal como lo haramos con cualquier variable. El nombre de cada elemento
de un arreglo est formado por el nombre del arreglo y su posicin en el arreglo. Esta
posicin se conoce como el ndice del elemento. El ndice del primer elemento de un
arreglo siempre es cero. El ndice de un elemento puede expresarse mediante cualquier
expresin entera que al evaluarse nos indica el elemento en particular al que queremos
accesar. Por ejemplo
califs[4] = 8;

le asigna al quinto elemento del arreglo califs el valor de 8.


califs[i]

accesa al i-simo elemento del arreglo califs, mientras que


matriculas[j + 3]

accesa al j-simo + 3 elemento del arreglo matriculas.


Por ejemplo supongamos que deseamos accesar en forma secuencial a los elementos del
arreglo califs para sacar el promedio de las calificaciones. El cdigo para hacer esto sera
suma = 0;

ITSON

Manuel Domitsu Kono

108

Arreglos
for(i = 0; i < nAlums; i++) suma += califs[i];
promedio = (float)suma/nAlums;

donde nAlums es el nmero de calificaciones que estn almacenadas en el arreglo. Este


valor puede ser menor o igual al tamao del arreglo califs.

C y los Lmites de un Arreglo


Una de las caractersticas de C es el hecho de que no verifica si el valor del ndice
corresponde a un elemento del arreglo. Por ejemplo expresiones como
calif = califs[70];
matriculas[-6] = 9;

no generan errores ni avisos del compilador, ni generan errores de ejecucin. En la


primera expresin califs[70] no forma parte del arreglo ya que el mximo valor del
ndice es 49. Por lo le estamos asignando a la variable calif un valor que se encuentra
en una localidad de memoria que se encuentra a 70 bytes del inicio del arreglo califs.
Esta localidad pudiera estar libre o corresponder a otra variable. De cualquier manera es
basura. En el segundo caso estamos escribiendo un 9 en una localidad situada 6 bytes
antes del inicio del arreglo. Al igual que en el caso anterior esta localidad pudiera estar
libre o corresponder a otra variable. Si la localidad corresponde a una variable estaremos
corrompiendo su valor. La razn por la que C no verifica si estamos accesando dentro de
los lmites del arreglo es debido a que C fue concebido como un lenguaje que pudiera
reemplazar al lenguaje ensamblador en la mayora de los casos. Por esa razn se
minimiza cualquier verificacin de errores ya que ello hara lenta la ejecucin de un
programa. En lugar de esto C delega la responsabilidad de prevenir los errores al
programador.

Inicializacin de Arreglos Unidimensionales


Los arreglos al igual que las variables de los tipos bsicos pueden inicializarse al momento
de declararse. La sintaxis de tal declaracin es
tipo nomArreglo[[tamArreglo]] = {cte1 [, cte2] ... }

Note que la inicializacin consiste de agregarle a la declaracin el operador de asignacin


seguida de una lista de constantes encerrada entre llaves: { y }. Por ejemplo, en la
declaracin
int x[5] = {0, 1, 2, 3, 4};

estamos declarando al arreglo x y lo estamos inicializando a


x

ITSON

Manuel Domitsu Kono

Captulo 7

Arreglos

109

En la declaracin anterior podemos omitir el tamao del arreglo


int x[] = {0, 1, 2, 3, 4};

El compilador contar el nmero de inicializadores y ese ser el tamao que le dar al


arreglo. 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. En la declaracin
int x[5] = {0, 1, 2};

estamos inicializando los elementos de x


x

Lo que no es vlido es el de tener ms inicializadores que el tamao del arreglo. La


siguiente declaracin
int x[5] = {0, 1, 2, 3, 4, 5, 6, 7};

generar un error por el compilador.


Al igual que con las variables de los tipos bsicos, los arreglos con clase de
almacenamiento automtica si no son inicializados, tienen basura. Si los arreglos son de
clase de almacenamiento esttica y no son inicializados, el compilador los inicializa a
ceros.
Otro aspecto concerniente a los arreglos y a su clase de almacenamiento es el siguiente.
En C el espacio disponible para las variables automticas es limitado, y si declaramos un
arreglo grande (que ocupe varios cientos de bytes) como automtico podramos agotar
ese espacio. Si el arreglo lo declaramos como externo tendramos todos los posibles
problemas asociados a las variables externas. La alternativa en estos casos es declarar
los arreglos como estticos, que preserva el concepto de variables locales y no tiene la
limitante de espacio de memoria.

Arreglos Unidimensionales Como Parmetros de


Funciones
En C no se permite que una funcin regrese un arreglo por el mecanismo de return.
Tampoco le podemos pasar a una funcin un arreglo como parmetro. Lo nico que se
permite es que a una funcin se le pase la direccin de un arreglo. Si la funcin conoce la
direccin del arreglo, puede accesar a los diferentes elementos del arreglo utilizando
cualquiera de los dos mtodos ya vistos: indexamiento o apuntadores. La sintaxis de un
parmetro que representa la direccin de un arreglo es la siguiente:
tipo nomParArr[]

ITSON

Manuel Domitsu Kono

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

La segunda forma es la forma ms empleada. Aunque normalmente al llamar a una


funcin y pasarle la direccin de un arreglo le pasamos la direccin de inicio del arreglo,
podemos pasarle la direccin de un subarreglo del arreglo. Por ejemplo podemos llamar a
la funcin de las formas siguientes
&nomArreglo[3]

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.

Ejemplos Sobre Arreglos Unidimensionales


1. Crear la funcin leeDatos() que lea las matrculas (nmeros enteros largos) y las
calificaciones (tipo entero) de los alumnos de un grupo y las almacene en dos
arreglos unidimensionales. La funcin deber leer datos hasta que se de una
matrcula cero la cual indica fin de captura. La funcin regresa el nmero de
alumnos por el mecanismo de return.
La declaracin y la definicin de la funcin pedida son:
int leeDatos(long matriculas[], int califs[], int tamMaxGpo);
/*
* Esta funcion lee las matriculas y las calificaciones de los alumnos
* de un grupo y los almacena en los arreglos matriculas y califs.
* El tamao maximo de los arreglos es de tamMaxGpo. La funcion regresa
* el nmero de alumnos.
*/
int leeDatos(long matriculas[], int califs[], int tamMaxGpo) {
int n = 0;
printf("\nEste programa lee las matriculas y las calificaciones");
printf("\nde un grupo. El programa ordena los datos por la");
printf("\n matricula y los despliega.");
printf("\nEl programa tambien permite consultar la calificacion");
printf("\npor matricula.\n");
while (1) {
// Verifica si hay espacio en los arreglos
if (n >= tamMaxGpo) {

ITSON

Manuel Domitsu Kono

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

2. Crear la funcin seleccin() que ordene en forma ascendente de las matrculas


los dos arreglos del ejemplo anterior, por el algoritmo de seleccin.
El algoritmo de seleccin consiste en ir acomodando cada uno de los elementos en
el orden especificado. Suponga que deseamos ordenar en forma creciente los
siguientes datos
c f a d e

El primer paso consiste en acomodar en el primer lugar al menor de todos los


elementos. Como el menor de los elementos es a, intercambiamos los valores de c
ya
a f c d e

Ahora debemos acomodar en el segundo lugar al menor de los elementos que


quedan. Recuerde que el primer elemento ya esta acomodado. En este caso el
menor es c, por lo que intercambiaremos los valores de f y c
a c f d e

Repitiendo este proceso hasta acomodar el penltimo elemento, tenemos


a c d f e
a c d e f

Note que al acomodar el penltimo elemento, el ltimo ya queda acomodado, por lo


que slo es necesario acomodar n-1 de los n elementos.
Una primera aproximacin al pseudocdigo para el ordenamiento por seleccin es
ITSON

Manuel Domitsu Kono

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
}

En el pseudocdigo anterior se requiere refinar ms el paso para buscar el menor


de los elementos restantes. El pseudocdigo para este paso es
j = i + 1
mientras(j < tamGpo)
{
si(matriculas[menor] < matriculas[j]) menor = j
j = j + 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
}

La declaracin y la definicin de la funcin seleccin() pedida son:


// Declaracin de la funcin seleccion()
void seleccion(long matriculas[], int califs[], int tamGpo);
/*
* void seleccion()
*
* Esta funcion ordena las matriculas y las calificaciones de los
* alumnos por las matriculas usando el algoritmo de insercion. Las
* matriculas y las calificacioes se encuentran en los arreglos
* matriculas y califs. El numero de alumnos esta dado por tamGpo.
*/
void seleccion(long matriculas[], int califs[], int tamGpo) {
int i, j, menor, nTemp;
long lTemp;
// Para cada alumno

ITSON

Manuel Domitsu Kono

Captulo 7

Arreglos

113

for (i = 0; i < tamGpo - 1; i++) {


// Supon que el primero de los no acomodados es el menor
menor = i;
// busca entre los no acomodados al menor
for (j = i + 1; j < tamGpo; j++)
// Si hay uno menor, guarda su posicion en menor
if (matriculas[j] < matriculas[menor]) menor = j;
// Si el menor no es el primero de los no acomodados
if (menor != i) {
// Intercambia las matriculas
lTemp = matriculas[menor];
matriculas[menor] = matriculas[i];
matriculas[i] = lTemp;
// Intercambia las calificaciones
nTemp = califs[menor];
califs[menor] = califs[i];
califs[i] = nTemp;
}
}
}

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.

Ejercicios Sobre Arreglos Unidimensionales


1. Crear la funcin despliegaDatos() que despliegue el contenido de los arreglos
del ejemplo 1.
2. Crear la funcin secuencial() que busque secuencialmente una matrcula en el
arreglo de matrculas del ejemplo 1. La funcin deber regresar un entero, la
posicin de la matrcula si la encontr o -1 si no se encuentra.

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

Manuel Domitsu Kono

114

Arreglos

Declaracin de una Variable de Tipo Arreglo


Multidimensional
Las sintaxis para declarar arreglos en dos, tres, ... dimensiones son las siguientes:
tipo nomArreglo[numFilas][numCols]
tipo nomArreglo[numTablas][numFilas][numCols]
...

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

Manuel Domitsu Kono

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

Indexamiento en Arreglos Multidimensionales


El acceso a los elementos de un arreglo multidimensional usando indexamiento es similar
al visto para los arreglos en una dimensin, nada ms que en lugar de usar un slo ndice
utilizaremos ndices mltiples, dos ndices para un arreglo en dos dimensiones, tres para
un arreglo en tres dimensiones, etc. Por ejemplo
calPars[4][2] = 9;

ITSON

Manuel Domitsu Kono

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;

Inicializacin de Arreglos Multidimensionales


Los arreglos multidimensionales tambin pueden inicializarse al momento de declararse.
Por ejemplo la siguiente declaracin
int x[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};

declara al arreglo x y lo inicializa a


x

0
3
6

1
4
7

2
5
8

En la declaracin anterior podemos omitir las llaves anidadas


int x[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};

Tambin podemos omitir el nmero de filas


int x[][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};

int x[][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};

ITSON

Manuel Domitsu Kono

Captulo 7

Arreglos

117

sin embargo no podemos omitir el nmero de columnas ya que el compilador lo requiere


para establecer la direccin de cada elemento. Al declarar e inicializar un arreglo
multidimensional slo podemos omitir la primera de las dimensiones, como en la siguiente
declaracin de un arreglo en tres dimensiones.
int y[][2][2] = {{{0, 1}, {2, 3}}, {{4, 5}, {6, 7}}};

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

declara al arreglo x y lo inicializa a

1
0
0

0
1
0

0
0
1

Sin embargo si omitimos las llaves anidadas la declaracin


int x[3][3] = {{1, 0, 1, 0, 0, 1};

inicializara al arreglo como


x

1
0
0

0
0
0

1
1
0

Arreglos Multidimensionales Como Parmetros de


Funciones
Al igual que con los arreglos unidimensionales, a una funcin slo le podemos pasar la
direccin de un arreglo multidimensional. Si el arreglo es en dos dimensiones la
declaracin del parmetro tendr la siguiente forma:
tipo nomParArr[][numCols]

Para un arreglo en tres dimensiones sera


tipo nomParArr[][numFilas][numCols]

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

Manuel Domitsu Kono

118

Arreglos

proporciona la direccin del arreglo y su nmero de filas y columnas si se requiere que la


funcin conozca el nmero de tablas deberemos proporcionrsela a travs de otro
parmetro.
Al llamar a la funcin, el argumento ser slo el nombre del arreglo,
nomArreglo

Ejemplo Sobre Arreglos Multidimensionales


Una agencia de autos usados se especializa en automviles Volkswagen de los siguientes
tipos: Pointer, Golf y Jetta. Adems slo maneja los modelos de los tres aos recientes.
1. Para tener el control del inventario, el dueo guarda en un arreglo de dos
dimensiones, el nmero de automviles que posee. Escribe una funcin llamada
leeAutos() que permita capturar el inventario del lote y lo almacene en un
arreglo. La funcin recibe como parmetro la direccin del arreglo en el que se va a
almacenar los datos.
La declaracin y la definicin de la funcin pedida son:
/* Constante que representa el modelo de auto ms viejo
vendido en la agencia */
const int VIEJO = 2007;
// Declaracin de la funcin leeAutos()
void leeAutos(int autos[][3]);
// Definicin de la funcin leeAutos()
/*
* void leeAutos()
*
* Esta funcin lee el nmero de autos de cada marca y
* modelo de la agencia de autos usados y los almacena
* en el arreglo autos.
*/
void leeAutos(int autos[][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);

ITSON

Manuel Domitsu Kono

Captulo 7

Arreglos

119

// Lee la cantidad de autos de la marca y modelo


scanf("%d", &autos[marca][modelo]);
}
}
}

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

Ejercicio Sobre Arreglos Multidimensionales


Haga una funcin llamada calculaMontoTotal() que devuelva el monto total invertido
en el inventario del lote. La funcin recibe como parmetros las direcciones de los arreglos
que contienen el nmero de autos y sus costos.

ITSON

Manuel Domitsu Kono

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

Manuel Domitsu Kono

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

b) Despliegue las temperaturas mxima y mnima junto con el da y lectura en la


que ocurrieron.
El programa deber contener al menos una funcin para leer los datos, una para
desplegar la tabla, una calcular las temperaturas mxima y mnima y una o ms
para desplegar los dems resultados. Las funciones que requieran manejar
arreglos debern recibir las direcciones de stos por parmetros. No deber usarse
variables globales.
4. Suponga que el dueo la agencia de autos usados, del ejemplo sobre arreglos
multidimensionales, es amigo suyo y sabiendo que usted sabe computacin, le pide
que le desarrolle un programa para llevar el control del inventario de su lote as
como un registro de sus ventas. El programa deber hacer las siguientes tareas:
a) Capturar el inventario inicial del lote, al inicio del mes, en el arreglo invInic.
Utilice la funcin leeAutos() del ejemplo 1 sobre arreglos multidimensionales.
b) Capturar el nmero de autos comprados durante el presente mes, as como el
nmero de autos vendidos. Use los arreglos compras y ventas. Utilice, en
ambos casos, la funcin leeAutos() del ejemplo 1 sobre arreglos
multidimensionales.
c) Capturar el monto pagado por cada auto en el arreglo costo y el precio de
venta de cada auto en el arreglo precio. Aqu, tambin suponga que los autos
de la misma marca y del mismo modelo se venden igual. Utilice, en ambos
casos, la funcin leeMontos() del ejemplo 2 sobre arreglos
multidimensionales.
d) Determine el inventario final (invInic + compras ventas) y lo almacene
en el arreglo invFinal. Para ste clculo se requiere una funcin llamada

ITSON

Manuel Domitsu Kono

122

Arreglos

calculaInvFinal() que reciba como parmetros las direcciones de cuatro


arreglos: invFinal, invInic, compras y ventas.
e) Calcule los montos de los inventarios inicial y final, evaluados al costo de
compra. Utilice, en ambos casos, la funcin calculaMontoTotal() del
ejercicio sobre arreglos multidimensionales.
f) Calcule el costo de los automviles comprados y el monto de las ventas,
durante el presente mes. Utilice, en ambos casos, la funcin
calculaMontoTotal() del ejercicio sobre arreglos multidimensionales.
g) Calcule la utilidad bruta del negocio.
Utilidad bruta = Ventas - Compras
h) Despliegue el inventario final en forma de una tabla. Para ello se requiere una
funcin llamada despliegaInvFinal() que reciba como parmetro la
direccin del arreglo con el inventario final: invFinal.
i) Despliegue los montos de los inventarios inicial y final, los montos de las
compras y de las ventas y la utilidad bruta del negocio.

ITSON

Manuel Domitsu Kono

S-ar putea să vă placă și