Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Arreglos

Un arreglo es una estructura que permite almacenar un conjunto de datos de un mismo tipo, en forma contigua, que se referencian desde la posición 0 hasta la N -1.

Declaración

La declaración básica consiste en la especificación de un tipo de dato (primitivo o de clase), un identificador y los dos operandos [ ].

tipo id[ ];       /* declara un arreglo vacío  */   
tipo [ ] id;

Ejemplo

int arr[ ];       /* declara un arreglo vacío  */   
double [ ]px , [ ]py;       /* declara dos arreglos vacíos o sin elementos px y py  */   

Las declaraciones anteriores, sirven para especificar que existe una variable de tipo arreglo, a la cual se le puede asignar un espacio (o número de elementos) o también asignar un arreglo ya existente.

Para declarar un arreglo, y asignarle de inmediato un número determinado de elementos se debe usar, la estructura anterior, seguida del operador asignación, operador new, el tipo de dato y el tamaño especificado entre los operadores [ ].

Ejemplo

int datos[ ] = new int[10];
double arr[ ] = new double[50];
boolean [ ]x = new boolean[100];

Ahora bien, si el algoritmo requerie asignar un tamaño en tiempo de ejecucíon, o sea asignado por el usuario del programa, se debe seguir el siguiente esquema :

Declarar arreglo vacio id
Leer N
asignar a id el tamaño N

Ejemplo

int arr[ ];
System.out.print(" Ingrese el numero de datos : ");
int tam = Integer.parseInt(in.readLine( ));

arr = new int[tam];

El arreglo arr está preparado para almacenar tam elementos de tipo entero (int). El acceso a estos elementos se hace con el operador [ ] desde el elemento 0 hasta el tam - 1, cumpliendo cada posición con las mismas propiedades de las variables individuales.

Ejemplo

arr[0] = 3;
arr[1] += arr[0]++;
:
--arr[tam - 1];

Número de elementos de un arreglo

Todos los arrreglos tienen una propiedad que retorna la longitud del arreglo. Esta propiedad se llama length y se accede a ella de la siguiente manera :

identificador.length

Ejemplo

int arreglo[ ] = new int[20];

System.out.println("Longitud arreglo : " + arreglo.length);

int i;

/* Se asignaran los valores : 0, 10 , 20, 30 ,..., 180, 190. */

for(i = 0; i < arreglo.length; i++)
{
    arreglo[i] = i * 10; 
}

System.out.println("Datos  del arrreglo  : ");
System.out.println();

for(i =0; i <  arreglo.length; i++)
    System.out.println(arreglo[i]);

Inicialización

Para declarar e inicializar el arreglo con un conjunto de valores, se debe usar el siguiente esquema

tipo id[ ] = {cte1 , cte2 , .... , cte_n};

Ejemplo

int entry[ ] = { 0 , 7 , 23 , 44 , 87, 99 , 166 };

double nota[ ] = { 3.50 , 4.78 , 6.50 };

char letra[ ] = { 'a' , 'e' , 'i' , 'o' , 'u' };

boolean p[ ] = { false , false , true , false , true , false , true , true , false };

Paso de un arreglo como parámetro a un método

Un arreglo se pasa por referencia, o sea cumple con la propiedad que los valores pueden ser modificados dentro del método.

Ejemplo

void imp_arreglo(int arr[ ])
{
   for(int i = 0;  i <  arr.length; i++)
      System.out.print("\t" + arr[i]);
}

*nota : "\t" permite que los datos del arreglo sean tabulados por el método print.

A continuación un programa que inicializa tres arreglos y llama al método imp_arreglo.

class Tabul
{
    public static void main(String arg[ ])
    {
        System.out.println();
        int arr[ ] = { 2 , 5 , 689 , 8 , 6 };
        imp_arreglo(arr);
        System.out.println();
        
        int arr2[ ] = { 31 , 823 , 3 , 13 , 90 };
        imp_arreglo(arr2); 
        System.out.println(); 
        System.out.println();
    }
        
    public static void  imp_arreglo(int    arr[ ])
    {
        for(int i = 0;  i <  arr.length; i++)
            System.out.print("\t" + arr[i]);
    }

}
Bajar archivo

Salida del programa :



Lectura por teclado

La lectura es similar a la lectura de una variable cualquiera. Lo único que cambia es que la lectura está dentro de un ciclo for.

Ejemplo : Programa que lee un arreglo por teclado y calcula la media,varianza y desviación estándar.

import java.io.*;
class Estad1
{
    public static void main(String arg[ ]) throws IOException
    {
        BufferedReader in = new BufferedReader(new
            InputStreamReader(System.in));
        int tam;

        System.out.println("\n Pograma de estadistica\n");
        System.out.print(" Ingrese el numero de datos : ");
        tam = Integer.parseInt(in.readLine( ));
        System.out.println( );

        if(tam > 1)
        {
            int arreglo[ ] = new int[tam];
             
            /* Lectura del arreglo */

             for(int i = 0; i < arreglo.length; i++)
             {
                 System.out.print(" Ingrese elemento " + i + " : ");
                 arreglo[ i ] = Integer.parseInt(in.readLine());     
             }
            
            System.out.println("\n Resultados \n");
            
            double aux_media = media(arreglo);
            System.out.println(" media : " + aux_media);
            
            double aux_var = varianza(arreglo,aux_media);
            System.out.println(" varianza : " + aux_var);
            System.out.println(" desv. estandar : " + Math.sqrt(aux_var));
        }
        else
        {
            System.out.println("\n numero de elementos no valido!");    
        }
    
        System.out.println();
    }

    public static double media(int arr[ ])
    {
        double sum = 0.0;

        for(int i = 0; i < arr.length ; i++)
        {
            sum += arr[i];
        }

        return sum / arr.length;
    }    
    
    public static double varianza(int arr[ ], double media)
    {
        double sum = 0.0;

        for(int i = 0; i < arr.length ; i++)
        {
            sum += Math.pow(arr[i] - media, 2);
        }
        
        return sum / (arr.length - 1);
    }

}
Bajar archivo


Salida del programa




ALGORITMOS BASADOS EN EL INTERCAMBIO DE POSICIONES

En un arreglo, una operación fundamental es poder intercambiar los valores de dos posiciones i y j , o sea dejar en la posicion i lo que habia en la posicion j y viceversa.

Para realizar esta operación, usamos el siguiente algoritmo :

    tmp <-- a[i]     /* guardamos en tmp el contenido de la posicion i */
    a[i] <-- a[j]    /* asignamos lo que hay en la posicion j, a lla posicion i */
    a[j] <-- tmp     /* rescatamos lo que había en la posición i (tmp), asignandolo a la posicion j */

El paso siguiente, es poder hacer a través de un ciclo iterativo un intercambio de posiciones de afuera hacia dentro.

Aquí la condición del ciclo, es que i tome un valor inicial de cero, j tome un valor inicial de a.length - 1, y que el ciclo se ejecute mientras i sea menor que j.

Ahora bien, para que el ciclo termine alguna vez, en cada iteración hay que incrementar la variable i, y decrementar la variable j.


Algoritmo de intercambio de afuera hacia dentro (invertir arreglo)

INICIO

    i <-- 0
    j <-- a.length - 1

    MIENTRAS(i > j) HACER

        tmp <-- a[i]
        a[i] <-- a[j]
        a[j] <-- tmp

        i <-- i + 1
        j <-- j - 1

    FIN MIENTRAS
FIN


Ahora bien, usando la idea del intercambio entre posiciones contiguas (i y j = i + 1), si se cumple la condición que a[i] es mayor que a[j], obtenemos un algoritmo para ordenar un arreglo en forma ascendente, o sea de menor a mayor.

INICIO
    PARA i <-- 0 HASTA i <-- a.length - 2 HACER
        SI (a[i] > a[i+1]) ENTONCES
            tmp <-- a[i]
            a[i] <-- a[j]
            a[j] <-- tmp
        FIN SI
    FIN PARA
FIN

Ahora bien, independientemente cual sea la configuración original del arreglo (puede estar inicialmente de mayor a menor), se puede ver fácilmente en una traza de este algoritmo, que es necesario repetirlo tantas veces como elementos tenga el arreglo, para asegurar el orden buscado.

INICIO
    PARA k <-- 0 HASTA k <-- a.length - 1 HACER
        PARA i <-- 0 HASTA i <-- a.length - 2 HACER
            SI (a[i] > a[i+1]) ENTONCES
                tmp <-- a[i]
                a[i] <-- a[j]
                a[j] <-- tmp
            FIN SI
        FIN PARA
    FIN PARA
FIN