Capítulo 7 - Arreglos.pdf

download Capítulo 7 - Arreglos.pdf

of 18

Transcript of Capítulo 7 - Arreglos.pdf

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    1/18

    ITSON Manuel Domitsu Kono

    Captulo 7

    Arreglos

    En los programas que hemos escrito hasta ahora, cada una de las variables que hemosusado han contenido un slo dato a la vez. En este tema comenzaremos el estudio de lostipos agregadosque son grupos de datos que estn relacionados. Los tipos agregadoscomprenden los arreglos, las estructurasy las uniones. Las estructuras y las uniones seestudiarn 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 localidadescontiguas de memoria y que comparten el mismo nombre. Cada una de las variables de lalista, llamadas elementos, puede ser accesada por el nombre del arreglo y su posicin enl. La posicin de un elemento en el arreglo se conoce por ndice. Por ejemplo sideseamos almacenar las calificaciones de un grupo de alumnos podemos tener unarreglo llamado califs formado de 50 variables:

    cal i f s [0] representa la calificacin del primer alumno,cal i f s [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 quedeseamos 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 serequiere de variables individuales. La siguiente pieza de cdigo realiza la tarea.

    scanf ( "%d%d . . . %d", &cal i sf 0, &cal i f s1, . . . , &cal i f s49) ;. . .pr i nt f ( "\ n%d\ t %d\ t . . . %d", cal i f s0, cal i f s1, . . . , cal i f s49) ;

    Podemos ver que cualquier instruccin para leer, procesar y escribir las calificacionesimplica 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 ladistincin entre ellas es mediante su ndice, el cual puede ser una variable entera cuyovalor puede variarse para que corresponda a las diferentes variables del arreglo. La piezade cdigo del ejemplo anterior puede modificarse a

    f or ( i = 0; i < 50; i ++)scanf ( "%d", &cal i f s[i ] ) ;

    . . .f or ( i = 0; i < 50; i ++)

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    2/18

    106 Arreglos

    ITSON Manuel Domitsu Kono

    pr i nt f ( "%d\ t" , cal i f s[ i ] ) ;

    Arreglos Unidimensionales

    Un arreglo formado por elementos cuyo tipo es un tipo bsico es un arreglounidimensional.

    Declaracin de una Variable de Tipo ArregloUnidimensional

    La sintaxis para declarar un arreglo unidimensional es la siguiente:

    tipo nomArreglo[tamArreglo]

    tipoes cualquier tipo de datos bsico. tipoes el tipo basedel arreglo, esto es el tipo decada una de las variables que forman el arreglo.

    nomArregloes un identificador, el nombre del arreglo que estamos declarando.

    tamArregloes 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:

    i nt cal i f s[50] ;

    declara un arreglo llamado cal i f s formado por 50 variables de tipo entero. Esas 50variables tienen el mismo nombre: cal i f s , pero se distinguen por su posicin en elarreglo. Las variables se llaman cal i f s[0] , cal i f s[1] , . . . , cal i f s[49] . Noteque la primera variable tiene la posicin 0, ndice 0, la segunda 1, etc. En la figura 7-1, semuestra una representacin del arreglo califs en la memoria de la computadora. Por otrolado, para almacenar las matrculas de esos alumnos podramos declarar el arreglo

    l ong mat r i cul as[ 50]

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

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    3/18

    Captulo 7 Arreglos 107

    ITSON Manuel Domitsu Kono

    Figura 7-1

    Indexamiento en Arreglos Unidimensionales

    Existen dos formas de accesar a los elementos de un arreglo: indexamiento yapuntadores. El mecanismo de apuntadores se estudia en el Captulo 8: Apuntadores. Elmecanismo de indexamientoutiliza el nombre del elemento para accesar al contenido deese elemento, tal como lo haramos con cualquier variable. El nombre de cada elementode un arreglo est formado por el nombre del arreglo y su posicin en el arreglo. Estaposicin 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 cualquierexpresin entera que al evaluarse nos indica el elemento en particular al que queremosaccesar. Por ejemplo

    cal i f s[4] = 8;

    le asigna al quinto elemento del arreglo cal i f s el valor de 8.

    cal i f s [ i ]

    accesa al i-simo elemento del arreglo cal i f s, mientras que

    mat ri cul as[j + 3]

    accesa al j-simo + 3 elemento del arreglo mat r i cul as.

    Por ejemplo supongamos que deseamos accesar en forma secuencial a los elementos delarreglo califs para sacar el promedio de las calificaciones. El cdigo para hacer esto sera

    suma = 0;

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    4/18

    108 Arreglos

    ITSON Manuel Domitsu Kono

    f or( i = 0; i < nAl ums; i ++) suma += cal i f s[i ] ;pr omedi o = ( f l oat ) suma/ nAl ums;

    donde nAl umses el nmero de calificaciones que estn almacenadas en el arreglo. Estevalor puede ser menor o igual al tamao del arreglo cal i f s.

    C y los Lmites de un Arreglo

    Una de las caractersticas de C es el hecho de que no verifica si el valor del ndicecorresponde a un elemento del arreglo. Por ejemplo expresiones como

    cal i f = cal i f s[70] ;mat ri cul as[- 6] = 9;

    no generan errores ni avisos del compilador, ni generan errores de ejecucin. En laprimera expresin cal i f s[70] no forma parte del arreglo ya que el mximo valor delndice es 49. Por lo le estamos asignando a la variable cal i f un valor que se encuentraen una localidad de memoria que se encuentra a 70 bytes del inicio del arreglo cal i f s.Esta localidad pudiera estar libre o corresponder a otra variable. De cualquier manera esbasura. En el segundo caso estamos escribiendo un 9 en una localidad situada 6 bytesantes del inicio del arreglo. Al igual que en el caso anterior esta localidad pudiera estarlibre o corresponder a otra variable. Si la localidad corresponde a una variable estaremoscorrompiendo su valor. La razn por la que C no verifica si estamos accesando dentro delos lmites del arreglo es debido a que C fue concebido como un lenguaje que pudierareemplazar al lenguaje ensamblador en la mayora de los casos. Por esa razn seminimiza cualquier verificacin de errores ya que ello hara lenta la ejecucin de unprograma. En lugar de esto C delega la responsabilidad de prevenir los errores alprogramador.

    Inicializacin de Arreglos Unidimensionales

    Los arreglos al igual que las variables de los tipos bsicos pueden inicializarse al momentode 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 asignacinseguida de una lista de constantes encerrada entre llaves: { y }. Por ejemplo, en la

    declaracin

    i nt x[ 5] = {0, 1, 2, 3, 4};

    estamos declarando al arreglo xy lo estamos inicializando a

    x 0 1 2 3 4

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    5/18

    Captulo 7 Arreglos 109

    ITSON Manuel Domitsu Kono

    En la declaracin anterior podemos omitir el tamao del arreglo

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

    El compilador contar el nmero de inicializadores y ese ser el tamao que le dar alarreglo. El nmero de inicializadores puede ser menor que el tamao del arreglo y en estecaso el compilador inicializara a ceros el resto de los elementos. En la declaracin

    i nt x[ 5] = {0, 1, 2};

    estamos inicializando los elementos de x

    x 0 1 2 0 0

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

    i nt 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 dealmacenamiento automtica si no son inicializados, tienen basura. Si los arreglos son declase de almacenamiento esttica y no son inicializados, el compilador los inicializa aceros.

    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 agotarese espacio. Si el arreglo lo declaramos como externo tendramos todos los posiblesproblemas asociados a las variables externas. La alternativa en estos casos es declararlos arreglos como estticos, que preserva el concepto de variables locales y no tiene lalimitante de espacio de memoria.

    Arreglos Unidimensionales Como Parmetros deFunciones

    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 sepermite es que a una funcin se le pase la direccin de un arreglo. Si la funcin conoce ladireccin del arreglo, puede accesar a los diferentes elementos del arreglo utilizandocualquiera de los dos mtodos ya vistos: indexamiento o apuntadores. La sintaxis de unparmetro que representa la direccin de un arreglo es la siguiente:

    tipo nomParArr[]

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    6/18

    110 Arreglos

    ITSON Manuel Domitsu Kono

    Note que los corchetes estn vacos. Si escribimos un valor dentro de los corchetes elcompilador 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 nocontiene la informacin sobre el tamao del arreglo. Si se requiere que la funcin conozcael 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 escribirsede cualquiera de las siguientes formas:

    &nomArreglo[0] nomArreglo

    La segunda forma es la forma ms empleada. Aunque normalmente al llamar a unafuncin 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 ala funcin de las formas siguientes

    &nomArreglo[3] o nomArreglo + 3

    para pasarle la direccin del cuarto elemento del arreglo, posiblemente lo que deseamoses que la funcin procese del cuarto elemento del arreglo en adelante.

    Ejemplos Sobre Arreglos Unidimensionales

    1. Crear la funcin l eeDat os( ) que lea las matrculas (nmeros enteros largos) y lascalificaciones (tipo entero) de los alumnos de un grupo y las almacene en dosarreglos unidimensionales. La funcin deber leer datos hasta que se de unamatrcula 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:

    i nt l eeDat os( l ong mat r i cul as[ ] , i nt cal i f s[ ] , i nt t amMaxGpo) ;

    / ** Est a f unci on l ee l as mat r i cul as y l as cal i f i caci ones de l os al umnos* de un gr upo y l os al macena en l os ar r egl os mat r i cul as y cal i f s.* El t amao maxi mo de l os ar regl os es de t amMaxGpo. La f unci on r egr esa* el nmero de al umnos.*/

    i nt l eeDat os( l ong mat r i cul as[ ] , i nt cal i f s[ ] , i nt t amMaxGpo) {

    i nt n = 0;

    pr i nt f ( "\ nEst e progr ama l ee l as mat r i cul as y l as cal i f i caci ones") ;pr i nt f ( "\ nde un gr upo. El pr ogr ama or dena l os dat os por l a") ;pr i nt f ( "\ n mat r i cul a y l os despl i ega. ") ;pr i nt f ( "\ nEl pr ogr ama tambi en per mi t e consul t ar l a cal i f i caci on") ;pri nt f ( "\ npor mat ri cul a. \ n") ;

    whi l e ( 1) {/ / Ver i f i ca si hay espaci o en l os ar r egl osi f ( n >= t amMaxGpo) {

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    7/18

    Captulo 7 Arreglos 111

    ITSON Manuel Domitsu Kono

    pri nt f ( "\ nArr egl os l l enos"); br eak;

    }

    / / Lee una mat r i cul apr i nt f ( "\ nMat r i cul a del al umno %d, 0 par a t er mi nar : ", n + 1) ;scanf ( "%l d", &mat r i cul as[ n] ) ;

    / / Si l a mat r i cul a l ei da es cer o termi nai f ( mat r i cul as[ n] == 0) br eak;

    / / Lee l a cal i f i caci onpr i nt f ( "\ nCal i f i caci on del al umno %d: ", n + 1) ;scanf ( "%d", &cal i f s[ n] ) ;

    / / Si gui ent e al umnon++;

    }

    / / Regr esa el numero de al umnosret ur n n;

    }

    2. Crear la funcin sel ecci n( ) que ordene en forma ascendente de las matrculaslos dos arreglos del ejemplo anterior, por el algoritmo de seleccin.

    El algoritmo de seleccin consiste en ir acomodando cada uno de los elementos enel orden especificado. Suponga que deseamos ordenar en forma creciente lossiguientes 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 cy a

    a f c d e

    Ahora debemos acomodar en el segundo lugar al menor de los elementos quequedan. Recuerde que el primer elemento ya esta acomodado. En este caso elmenor 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 loque slo es necesario acomodar n-1 de los n elementos.

    Una primera aproximacin al pseudocdigo para el ordenamiento por seleccin es

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    8/18

    112 Arreglos

    ITSON Manuel Domitsu Kono

    i = 0 / / Posi ci n del el ement o a or denarmi ent r as( i < t amGpo-1){

    menor = ibusca l a posi ci n del menor a par t i r de mat r i cul as[ i +1]

    / / Si hay un nuevo menor i ntercambi asi ( menor ! = i ) i nt er cambi a ( mat r i cul as[ menor ] , mat r i cul as[ i ] )i = i + 1

    }

    En el pseudocdigo anterior se requiere refinar ms el paso para buscar el menorde los elementos restantes. El pseudocdigo para este paso es

    j = i + 1mi ent r as( j < t amGpo){

    si ( mat r i cul as[ menor ] < mat r i cul as[ j ] ) menor = jj = j + 1

    }

    El pseudocdigo final es

    i = 0 / / Posi ci n del el ement o a or denarmi ent r as( i < t amGpo-1){

    menor = ij = i + 1

    / / busca el menormi ent r as( j < t amGpo){

    si ( mat r i cul as[ menor ] < mat r i cul as[ j ] ) menor = jj = j + 1

    }

    / / Si hay un nuevo menor i ntercambi asi ( menor ! = i ) i nt er cambi a( mat r i cul as[ menor ] , mat r i cul as[ i ] )i = i + 1

    }

    La declaracin y la definicin de la funcin sel ecci n( ) pedida son:

    / / Decl ar aci n de l a f unci n sel ecci on( )voi d sel ecci on( l ong mat r i cul as[] , i nt cal i f s[ ] , i nt t amGpo) ;

    / ** voi d sel ecci on( )

    ** Est a f unci on or dena l as mat r i cul as y l as cal i f i caci ones de l os* al umnos por l as mat r i cul as usando el al gori t mo de i nserci on. Las* mat r i cul as y l as cal i f i caci oes se encuent r an en l os ar r egl os* matr i cul as y cal i f s. El numero de al umnos est a dado por t amGpo.*/

    voi d sel ecci on( l ong mat r i cul as[] , i nt cal i f s[ ] , i nt t amGpo) {i nt i , j , menor , nTemp;l ong l Temp;

    / / Par a cada al umno

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    9/18

    Captulo 7 Arreglos 113

    ITSON Manuel Domitsu Kono

    f or ( i = 0; i < tamGpo - 1; i ++) { / / Supon que el pr i mero de l os no acomodados es el menor

    menor = i ;

    / / busca entre l os no acomodados al menorf or ( j = i + 1; j < t amGpo; j ++)

    / / Si hay uno menor, guarda su posi ci on en menori f ( mat r i cul as[ j ] < mat r i cul as[ menor ] ) menor = j ;

    / / Si el menor no es el pri mero de l os no acomodadosi f ( menor ! = i ) {

    / / I nt er cambi a l as mat r i cul asl Temp = mat r i cul as[ menor] ;mat r i cul as[ menor ] = mat r i cul as[ i ] ;mat r i cul as[ i ] = l Temp;

    / / I nt er cambi a l as cal i f i caci onesnTemp = cal i f s[ menor] ;cal i f s [menor] = cal i f s [ i ] ;cal i f s[i ] = nTemp;

    }}

    }

    Aqu se han substituido los ciclos mientras del pseudocdigo por ciclos for paracompactar el cdigo. Adems, lo que aparece en el pseudocdigo como unafuncin para intercambiar dos elementos del arreglo, se ha substituido por sucdigo equivalente y como deseamos ordenar simultneamente los dos arreglos, elde matrculas y el de calificaciones intercambiamos tanto las matrculas como lascalificaciones.

    Ejercicios Sobre Arreglos Unidimensionales

    1. Crear la funcin despl i egaDat os( ) que despliegue el contenido de los arreglosdel ejemplo 1.

    2. Crear la funcin secuenci al ( ) que busque secuencialmente una matrcula en elarreglo de matrculas del ejemplo 1. La funcin deber regresar un entero, laposicin 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 esmultidimensional . Por ejemplo un arreglo en dos dimensiones puede considerarse comoun arreglo donde cada elemento es a su vez un arreglo unidimensional; un arreglo en tresdimensiones puede considerarse como un arreglo donde cada elemento es a su vez unarreglo en dos dimensiones, etc. En C no existe lmite en cuanto al nmero dedimensiones que puede tener un arreglo.

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    10/18

    114 Arreglos

    ITSON Manuel Domitsu Kono

    Declaracin de una Variable de Tipo ArregloMultidimensional

    Las sintaxis para declarar arreglos en dos, tres, ... dimensiones son las siguientes:

    tipo nomArreglo[numFilas][numCols]tipo nomArreglo[numTablas][numFilas][numCols]. . .

    tipoes el tipo basedel arreglo y puede ser es cualquier tipo de datos bsico.

    nomArregloes un identificador, el nombre del arreglo que estamos declarando.

    Un arreglo en dos dimensiones puede visualizarse como una tabla o matriz en la quenumFilasy numColsson 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 quenumTablas, numFilasy numColsson expresiones constantes de tipo entero que indica

    el nmero de tablas, filas y columnas del arreglo, el nmero de elementos en un arreglotridimensional es numTablas * numFilas * numCols.

    Por cada dimensin del arreglo se agrega, en la declaracin, una expresin constanteencerrada entre corchetes la cual representa el tamao de la nueva dimensin. Porejemplo para almacenar las cuatro calificaciones parciales de un grupo de alumnospodramos declarar el arreglo:

    i nt cal Par s[ 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 veral arreglo es como una tabla con 50 filas (los alumnos) y con cuatro columnas (lascalificaciones) en cada fila. Esta declaracin nos crea 200 variables cuyo nombre estformado por el nombre del arreglo, cal par sy dos ndices uno para la fila y otro para lacolumna 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 unacompaa que est establecida en tres ciudades, con cuatro sucursales en cada ciudad.

    Para esto podemos declarar el arreglo ventas

    f l oat vent as[3] [ 4] [ 2] ;

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    11/18

    Captulo 7 Arreglos 115

    ITSON Manuel Domitsu Kono

    Figura 7-2

    como formado por 3 variables (las ciudades) que a su vez son arreglos en dosdimensiones. 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 delarreglo, ventas y tres ndices el primero para la tabla, el segundo para la fila y el terceropara la columna en la que se encuentra el elemento, tal como se muestran en la figura 7-3.

    Figura 7-3

    Indexamiento en Arreglos Multidimensionales

    El acceso a los elementos de un arreglo multidimensional usando indexamiento es similaral visto para los arreglos en una dimensin, nada ms que en lugar de usar un slo ndiceutilizaremos ndices mltiples, dos ndices para un arreglo en dos dimensiones, tres paraun arreglo en tres dimensiones, etc. Por ejemplo

    cal Pars[ 4] [ 2] = 9;

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    12/18

    116 Arreglos

    ITSON Manuel Domitsu Kono

    le asigna al elemento que se encuentra en la quinta fila, tercera columna del arreglocal Par sel valor de 9.

    vent as[ 2] [ 3] [ 1] = 1252. 30

    le asigna al elemento que se encuentra en el tercer plano, cuarta fila, segunda columnadel arreglo vent asel valor de 1252.30.

    Por ejemplo el siguiente cdigo nos permite calcular el promedio de las calificaciones decada alumno y la calificacin promedio del grupo:

    i nt i , j , suma;f l oat promedi os[50] , sumaT, pr omedi oT;. . .sumaT = 0;f or( i = 0; i < nAl ums; i ++){

    suma = 0;f or( j = 0; j < 4; j ++) suma += cal Pars[i ] [ j ] ;

    pr omedi os[ i ] = ( f l oat ) suma/ 4;sumaT += pr omedi os[ i ] ;

    }promedi oT = sumaT/ nAl ums;

    Inicializacin de Arreglos Multidimensionales

    Los arreglos multidimensionales tambin pueden inicializarse al momento de declararse.Por ejemplo la siguiente declaracin

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

    declara al arreglo xy lo inicializa a

    0 1 2

    x 3 4 5

    6 7 8

    En la declaracin anterior podemos omitir las llaves anidadas

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

    Tambin podemos omitir el nmero de filas

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

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

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    13/18

    Captulo 7 Arreglos 117

    ITSON Manuel Domitsu Kono

    sin embargo no podemos omitir el nmero de columnas ya que el compilador lo requierepara establecer la direccin de cada elemento. Al declarar e inicializar un arreglomultidimensional slo podemos omitir la primera de las dimensiones, como en la siguientedeclaracin de un arreglo en tres dimensiones.

    i nt 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 elcompilador inicializara a ceros el resto de los elementos

    i nt x[ 3] [ 3] = {{1}, {0, 1}, {0, 0, 1}};

    declara al arreglo xy lo inicializa a

    1 0 0

    x 0 1 0

    0 0 1

    Sin embargo si omitimos las llaves anidadas la declaracin

    i nt x[ 3] [ 3] = {{1, 0, 1, 0, 0, 1};

    inicializara al arreglo como

    1 0 1

    x 0 0 1

    0 0 0

    Arreglos Multidimensionales Como Parmetros deFunciones

    Al igual que con los arreglos unidimensionales, a una funcin slo le podemos pasar ladireccin de un arreglo multidimensional. Si el arreglo es en dos dimensiones ladeclaracin 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 sonnecesarias a fin de que el compilador pueda determinar las direcciones de los elementosdel arreglo. La declaracin del parmetro que corresponde a la direccin del arreglo endos dimensiones slo proporciona la direccin del arreglo y su nmero de columnas si serequiere que la funcin conozca el nmero de filas deberemos proporcionrsela a travsde otro parmetro. En el caso del arreglo en tres dimensiones, la declaracin slo

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    14/18

    118 Arreglos

    ITSON Manuel Domitsu Kono

    proporciona la direccin del arreglo y su nmero de filas y columnas si se requiere que lafuncin conozca el nmero de tablas deberemos proporcionrsela a travs de otroparmetro.

    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 siguientestipos: 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 dosdimensiones, el nmero de automviles que posee. Escribe una funcin llamadal eeAut os( ) 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 aalmacenar los datos.

    La declaracin y la definicin de la funcin pedida son:

    / * Const ant e que r epresent a el model o de auto ms vi ej ovendi do en l a agenci a */

    const i nt VI EJ O = 2007;

    / / Decl ar aci n de l a f unci n l eeAut os( )voi d l eeAut os(i nt aut os[ ] [ 3] ) ;

    / / Def i ni ci n de l a f unci n l eeAut os( )

    / ** voi d l eeAut os( )** Est a f unci n l ee el nmero de autos de cada marca y* model o de l a agenci a de aut os usados y l os al macena* en el ar r egl o aut os.*/

    voi d l eeAut os( i nt aut os[ ] [ 3] ) {i nt marca, model o;

    / / Para cada marca de autof or ( marca = 0; marca < 3; marca++) {

    / / Par a cada model of or ( model o = 0; model o < 3; model o++) {

    / / Despl i ega l a mar caswi t ch ( marca) {case 0: pr i nt f ( "\ nAut os Poi nt er , ") ;

    br eak;case 1: pri nt f ( "\ nAut os Gol f , ") ;

    br eak;case 2: pri nt f ( "\ nAut os J et t a, ") ;

    }/ / Despl i ega el model opr i nt f ( "model o %d: ", VI EJ O + model o) ;

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    15/18

    Captulo 7 Arreglos 119

    ITSON Manuel Domitsu Kono

    / / Lee l a cant i dad de aut os de l a marca y model oscanf ( "%d", &aut os[marca] [ model o] ) ;

    }}

    }

    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 delmismo tipo y del mismo modelo pag lo mismo). Escribe una funcin llamadaleeMontos() que permita capturar el monto pagado por cada automvil y loalmacene en un arreglo. La funcin recibe como parmetro la direccin del arregloen que se va a almacenar los datos.

    La declaracin y la definicin de la funcin pedida son

    / / Decl ar aci n de l a f unci n l eeMont os( )voi d l eeMont os( i nt aut os[ ] [ 4] ) ;

    / / Def i ni ci n de l a f unci n l eeMont os( )

    / ** Est a f unci n l ee el cost o de cada aut o para cada marca y* model o de l a agenci a de aut os usados y l os al macena* en el ar r egl o mont os.*/

    voi d l eeMont os( f l oat mont os[ ] [ 3] ) {i nt marca, model o;

    / / Para cada marca de autof or ( marca = 0; marca < 3; marca++) {

    / / Par a cada model o */f or ( model o = 0; model o < 3; model o++) {

    / / Despl i ega l a mar caswi t ch ( marca) {

    case 0: pr i nt f ( "\ nAut os Poi nt er , ") ;br eak;case 1: pri nt f ( "\ nAut os Gol f , ") ;

    br eak;case 2: pri nt f ( "\ nAut os J et t a, ") ;

    }/ / Despl i ega el model opr i nt f ( "model o %d: ", VI EJ O + model o) ;

    / / Lee l os mont os de l os aut os de l a marca y model oscanf ( "%f ", &mont os[marca] [ model o]) ;

    }}

    }

    Ejercicio Sobre Arreglos Multidimensionales

    Haga una funcin llamada cal cul aMont oTot al ( ) que devuelva el monto total invertidoen el inventario del lote. La funcin recibe como parmetros las direcciones de los arreglosque contienen el nmero de autos y sus costos.

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    16/18

    120 Arreglos

    ITSON Manuel Domitsu Kono

    Problemas

    1. Crea un programa que realice lo siguiente:

    a) Lea para cada alumno de un grupo, su matrcula, un entero largo, y sucalificacin, un entero; y los almacene en dos arreglos unidimensionales. Utilicela funcin l eeDat os( ) del ejemplo 1 sobre arreglos unidimensionales.

    b) Ordene los arreglos por orden creciente de la matrcula. Utilice el algoritmo deordenacin por. Utilice la funcin sel ecci on( ) del ejemplo 2 sobre arreglosunidimensionales.

    c) Despliegue una tabla con los arreglos de matrculas y calificaciones,ordenados por matrcula. Utilice la funcin despl i egaDat os( ) del ejercicio 1sobre arreglos unidimensionales.

    d) Encuentre y despliegue las siguientes estadsticas:

    i) Las calificaciones mayor y menor y las matrculas de los alumnos con esascalificaciones. Para ello se requieren dos funciones llamadas mayor ( ) ymenor( ) que reciban como parmetros la direccin del arreglo con lascalificaciones y el nmero de alumnos y regresen la posicin en el arreglo delas calificaciones mayor y menor, respectivamente.

    ii) La media de las calificaciones. Para ello se requiere una funcin llamadamedi a( ) que reciba como parmetros la direccin del arreglo con las

    calificaciones y el nmero de alumnos y regrese la media de lascalificaciones.

    iii) La desviacin estndar de las calificaciones. Para ello se requiere unafuncin llamada desvEst andar( ) que reciba como parmetros la direccindel arreglo con las calificaciones, la media de las calificaciones y el nmerode alumnos y regrese la desviacin estndar de las calificaciones.

    e) Nos permita consultar las calificaciones de los alumnos a partir de susmatrculas. El programa nos pedir la matrcula de cada alumno que deseemosconsultar. Para terminar se dar un cero en la matrcula. Utilice una bsquedasecuencial. Utilice la funcin secuenci al ( ) del ejercicio 2 sobre arreglosunidimensionales.

    No deber usarse variables globales.

    2. Una firma emplea a un grupo de 20 vendedores a quien se les paga comisin sobrela porcin de las ventas que exceden las dos terceras partes de las ventas

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    17/18

    Captulo 7 Arreglos 121

    ITSON Manuel Domitsu Kono

    promedio del grupo. Se requiere un programa que lea las ventas de cada vendedore imprima una lista de los vendedores que obtuvieron comisin, junto con las susventas.

    No deber usarse variables globales.

    3. En un hospital se registra la temperatura de un paciente 4 veces al da durante unasemana. Construya un programa que lea las temperaturas y los almacene en unarreglo de dos dimensiones.

    a) El programa deber desplegar una tabla de la siguiente forma:

    Lect ur a Dom Lun Mar Mi e J ue Vi e Sab1 XX XX XX XX XX XX XX2 XX XX XX XX XX XX XX3 XX XX XX XX XX XX XX4 XX XX XX XX XX XX XX

    b) Despliegue las temperaturas mxima y mnima junto con el da y lectura en laque ocurrieron.

    El programa deber contener al menos una funcin para leer los datos, una paradesplegar la tabla, una calcular las temperaturas mxima y mnima y una o mspara desplegar los dems resultados. Las funciones que requieran manejararreglos debern recibir las direcciones de stos por parmetros. No deber usarsevariables globales.

    4. Suponga que el dueo la agencia de autos usados, del ejemplo sobre arreglosmultidimensionales, es amigo suyo y sabiendo que usted sabe computacin, le pideque le desarrolle un programa para llevar el control del inventario de su lote ascomo 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 i nvI ni c.Utilice la funcin l eeAut os( ) del ejemplo 1 sobre arreglos multidimensionales.

    b) Capturar el nmero de autos comprados durante el presente mes, as como elnmero de autos vendidos. Use los arreglos compr as y vent as. Utilice, enambos casos, la funcin l eeAut os( ) del ejemplo 1 sobre arreglosmultidimensionales.

    c) Capturar el monto pagado por cada auto en el arreglo cost o y el precio deventa de cada auto en el arreglo pr eci o. Aqu, tambin suponga que los autosde la misma marca y del mismo modelo se venden igual. Utilice, en amboscasos, la funcin l eeMont os( ) del ejemplo 2 sobre arreglosmultidimensionales.

    d) Determine el inventario final (i nvI ni c +compr as vent as) y lo almaceneen el arreglo i nvFi nal . Para ste clculo se requiere una funcin llamada

  • 7/25/2019 Captulo 7 - Arreglos.pdf

    18/18

    122 Arreglos

    ITSON Manuel Domitsu Kono

    cal cul aI nvFi nal ( ) que reciba como parmetros las direcciones de cuatroarreglos: i nvFi nal , i nvI ni c, compr asy vent as.

    e) Calcule los montos de los inventarios inicial y final, evaluados al costo decompra. Utilice, en ambos casos, la funcin cal cul aMont oTot al ( ) 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 funcincal cul aMont oTot al ( ) del ejercicio sobre arreglos multidimensionales.

    g) Calcule la utilidad bruta del negocio.

    Ut i l i dad br ut a = Vent as - Compr as

    h) Despliegue el inventario final en forma de una tabla. Para ello se requiere una

    funcin llamada despl i egaI nvFi nal ( ) que reciba como parmetro ladireccin del arreglo con el inventario final: i nvFi nal .

    i) Despliegue los montos de los inventarios inicial y final, los montos de lascompras y de las ventas y la utilidad bruta del negocio.