Arreglos (Arrays). · PDF file3 Las definiciones de arreglos pueden incluir, si se desea, ... el contenido de los vectores y matrices siempre es pasado por referencia

Embed Size (px)

Citation preview

  • Unidad 9 Computacin Avanzada

    1

    Arreglos (Arrays).

    Muchas aplicaciones requieren el procesado de mltiples datos que tienen caractersticas comunes. En tales situaciones es a menudo conveniente colocar los datos en un arreglo array, donde todos comparten el mismo nombre. Los datos individuales pueden ser caracteres, enteros, nmeros en coma flotante, etc. Pero todos tienen que ser del mismo tipo y con el mismo tipo de almacenamiento.

    Cada elemento del arreglo es referido especificando el nombre del arreglo seguido por uno o ms ndices, con cada ndice encerrado entre corchetes. Cada ndice debe ser expresado como un entero no negativo: una constante entera, una variable entera o una expresin entera ms compleja.

    En un arreglo x de n elementos los elementos del arreglo son:

    x[0], x[1],...,x[n-1].

    El nmero de ndices determina la dimensionalidad del arreglo.

    En matemticas se usa la siguiente notacin para representar vectores y matrices:

    Vector. Matriz

    Donde cada componente se denota como xi en el caso de vectores unidimensionales y aij en el caso de matrices. A los smbolos i y j se los conoce como ndices y dicen la posicin de la componente dentro del vector-matriz.

    La dimensin de un vector es el nmero de sus componentes (n).

    El orden de una matriz es el nmero de sus filas y columnas (m,n)

  • Unidad 9 Computacin Avanzada

    2

    Definicin de un arreglo.

    Al definirse, cada arreglo debe acompaarse de una especificacin de tamao (nmero de elementos). En trminos generales, un arreglo unidimensional puede expresarse como:

    tipo_vector nombre_vector[tamao_vector];

    tipo_dato nombre_arreglo[expresin_entera_positiva];

    Donde tamao_vector ( que debe ser una expresin entera positiva ) indica el nmero de elementos del arreglo. Ojo que para hacer referencia a estos elementos se debe tomar en cuenta que el primer elemento es el nmero cero. Veamos unos ejemplos en los que se realiza asignaciones a elementos de un vector:

    int i;

    int vector[3]; // Define un arreglo unidimensional de 3 elementos

    i=2;

    vector[i]=1; // Esto se puede hacer

    vector[0]=2; // Esto tambin

    vector[3]=5; // Obviamente sto NO ya que no existe. Slo 0,1 y 2 ( 3 elementos )

    y unos ejemplos de lectura:

    i=vector[0];

    i=vector[i];

    vector[1]=vector[0]+vector[2];

    vector[i-1]=1;

    vector[vector[i]]=0;

  • Unidad 9 Computacin Avanzada

    3

    Las definiciones de arreglos pueden incluir, si se desea, la asignacin de valores iniciales. Los valores iniciales deben aparecer en el orden en que sern asignados a los elementos individuales del arreglo, encerrados entre llaves y separados por comas. La forma general es:

    tipo_dato nombre_arreglo[expresin] = {valor1,valor2,...,valorn};

    La presencia de la expresin, que indica el nmero de elementos del arreglo, es opcional cuando los valores iniciales estn presentes.

    OJO, MUY IMPORTANTE: Todos los elementos del arreglo que no tienen asignados valores iniciales explcitos sern puestos automticamente a cero. Por lo tanto si se desea asignar cero a todos los elementos de un arreglo, se podra tan solo declarar cero como el primer valor y el resto se har de forma automtica. P. ej.:

    int a[40]={0};

    asignar cero a los elementos entre el cero y el treinta y nueve del arreglo. Tambin aplica para arreglos multidimensionales.

    Ojo, esto no quiere decir que si se inicializa el primer elemento con uno el resto tambin lo ser. NO. El primero ser uno y el resto ser cero.

    Nota importante acerca del procesamiento de un arreglo.

    En C no se permiten operaciones que impliquen arreglos completos. As, si a y b son dos arreglos similares (mismo tipo de datos, misma dimensionalidad y mismo tamao), las operaciones de asignacin, comparacin, etc., deben realizarse elemento por elemento.

    Arreglos multidimensionales.

    Los arreglos multidimensionales son definidos prcticamente de la misma manera que los arreglos unidimensionales, excepto que se requiere un par de corchetes para cada ndice. En general:

    tipo_matriz nombre_matriz[n_filas][n_columnas];

    incluso de ms dimensiones:

    tipo_dato nombre_arreglo [indice_1][indice_2]...[indice_n];

  • Unidad 9 Computacin Avanzada

    4

    Veamos unos ejemplos en los que se realiza asignaciones a elementos de una matriz:

    int i=1, j, k;

    int Matriz[2][3];

    k=31000;

    j=2;

    Matriz[1][0]=2; // Correcto.

    Matriz[0][j]=k; // Bien.

    Matriz[i][j]=50; // Bien

    Matriz[j][k]=100; // No seor, no est permitido.

    Y unos ejemplos de lectura seran:

    k=Matriz[i][j];

    i=Matriz[1][2];

    Matriz[1][i]=5*Matriz[0][i];

    j=Matriz[5][j-1];

    k=Matriz[vector[i]][0];

    Los arreglos multidimensionales tambin pueden ser inicializados al momento de su declaracin. Un ejemplo especfico con inicializacin para un tipo bidimensional sera algo como:

    tipo_matriz nombre_matriz[][2]={

  • Unidad 9 Computacin Avanzada

    5

    {0 , 1},

    {1 , -3}

    };

    aunque las llaves internas no son necesarias y slo se usan para facilitar la lectura del arreglo por parte del programador. Lo que si es absolutamente necesario es que en la definicin del arreglo se incluya al menos uno de los ndices (sto si es de dos dimensiones. Lo importante es que slo puede faltar un solo ndice como mximo y ste debe ser el primero). sto es porque el compilador necesita saber como sern organizados los datos. Si no se coloca uno de los ndices entonces slo se sabra que es un arreglo que contiene 4 elementos lo cual podra ser un arreglo de 4 filas y 1 columna, 2 filas y 2 columnas 1 fila y 4 columnas.

    Los arreglos multidimensionales se procesan de la misma manera que los arreglos unidimensionales, sobre la base de elemento a elemento. Sin embargo, se requiere algn cuidado cuando se pasan arreglos multidimensionales a una funcin. En particular, las declaraciones de argumentos formales dentro de la definicin de funcin deben incluir especificaciones explcitas de tamao en todos los ndices excepto en el primero.

    Paso de arreglos a funciones.

    A diferencia de los tipos bsicos, el contenido de los vectores y matrices siempre es pasado por referencia.

    El nombre de un arreglo se puede usar como argumento de una funcin, permitiendo as que el arreglo completo sea pasado a la funcin. Para pasar un arreglo a una funcin, el nombre del arreglo debe aparecer slo, sin corchetes o ndices, como un argumento actual dentro de la llamada a la funcin. El correspondiente argumento formal se escribe de la misma manera, pero debe ser declarado como un arreglo dentro de la declaracin de argumentos formales. Cuando se declara un arreglo unidimensional como un argumento formal, el arreglo se escribe con un par de corchetes vacos.

    Hemos visto que los argumentos son pasados a la funcin por valor cuando los argumentos son variables ordinarias. Sin embargo, cuando se pasa un arreglo a una funcin, los valores de los elementos del arreglo no son pasados a la funcin. En vez de sto, el nombre del arreglo se interpreta como la direccin del primer elemento del arreglo. Esta direccin se asigna al correspondiente argumento formal cuando se llama a la funcin. El argumento formal se convierte por tanto en un puntero al primer elemento del arreglo. Como ya sabemos, los argumentos pasados de esta forma se dicen que son pasados por referencia en vez de por valor. Por tanto, si un elemento del arreglo es

  • Unidad 9 Computacin Avanzada

    6

    alterado dentro de la funcin, esta alteracin ser reconocida en todo el mbito de definicin del arreglo. Veamos algunos ejemplos:

    void funcionMat(int M[2][2]); // Declara una funcin que recibira una matriz de 2x2.

    void main()

    {

    int Matriz[2][2]; // Declara una matriz de 2x2 elementos

    Matriz[0][1]=1; // Inicializa el elemento (1,2) a 1

    funcionMat(Matriz); // llama a la funcin y le envia la direccin de Matriz.

    // OJO en como se le envia ( sin corchetes ). Esto se

    // traduce en la direccin del primer elemento de Matriz.

    printf(%d, Matriz*0+*1+); // Imprime el elemento que ya no contiene 1 porque...

    }

    void funcionMat(int M[2][2])

    {

    M[0][1]*=-2; // sto altera el valor del arreglo original. Recordar que es por referencia.

    }

    Existen tres formas de pasarle un arreglo a una funcin. stas son:

    void funcion(int[10]);

    que es la clsica que hace uso de un arreglo delimitado. Esta tambin:

    void funcion(int []);

  • Unidad 9 Computacin Avanzada

    7

    que es la versin con un array no delimitado. Y por ltimo, como el paso de los arreglos a una funcin se hace por referencia, tambin podemos declarar una funcin que reciba un arreglo a travs de los punteros. Por ejemplo para un arreglo unidimensional de enteros, basta con definir que la funcin recibir un puntero a entero. El prototipo de una funcin que recibir un arreglo unidimensional de enteros podra definirse:

    void funcion(int *x);

    Todo lo anterior hace lo mismo. Definir que la funcin recibir una direccin de memoria

    que apunta a un entero. De hecho, como C no comprueba los lmites de un arreglo, en lo que a la funcin se refiere, realmente no importa la longitud del arreglo. El compilador al leer:

    void funcion(int[32]);

    Har exactamente lo mismo ya que el compilador instruye a funcion para recibir un puntero; realmente no crea un arreglo de 32 elementos.

    Cadenas de caracteres.

    En realidad en Lenguaje C no existe una variable de tipo string como tal. En C, lo que es conocido en otros lenguajes como strings son tan solo un tipo especial de arreglos. Especficamente s