domingo, 24 de abril de 2011

APLICACION DE VECTORES

(Martes 19 de abril del 2011)

Ejercicio:

Dado el siguiente vector

                                            [2            9          1          3]

<!--[if !supportLists]-->a.      <!--[endif]-->Ordenar de la forma  que sea posible (método libre).

public class Main {   
public static void Ordenar( int V[ ]){
 for( int i = 0; i < V.length; i ++ ){
    for( int j = 0; j < V.length; j ++ ){
     if(V[ i ] < V[ j ]){
      int aux = V[ i ];
       V[ i ] = V[j];
       V[ j ] = aux;
      }else if(V[ i ] > V[ j ]){
       int aux = V[ i ];
       V[ i ] = aux;
       V[ j ] = V[j];
}                                   
public static void Mostrar( int V[ ] ){
    for( int i = 0; i < V.length; i ++ ){
            System.out.println(" [ " + i + " ] =  " + V[i]); }
}
    public static void main(String[] args) {
         int v[]= {2,9,1,3};
         Mostrar(v);
         System.out.println("ordenado");
         Ordenar(v);
         Mostrar(v); }
}




class vector1{
         public static void main(String[] args){
                 int vec[]={2, 9, 1, 3};//
                      for(int i=0;i<=5;i++){
                           System.out.print("\t"+vec[i]);

                }
            System.out.print("\n\n");
         }
}

<!--[if !supportLists]-->b.      <!--[endif]-->Posteriormente    ordenar el vector  utilizando un método de la clase ARRAYS          
        Creamos una clase con el método      main

/*#1  */
import java.util.Arrays;
public class vector {

    public static void mostrar(int V[]){

         int i;
         for(i = 0; i < V.length; i ++ ){
                System.out.println(" " + V[i]);
         }

    }
  
    public static void main(String[] args) {
       
      
         int vec[]={2,25,5,1};
          Arrays.sort(vec);
                mostrar(vec);

       
    }
}

miércoles, 6 de abril de 2011

METODOS DE LA CLASE VECTOR Y ARRAYS

· Métodos
ü  Definir un método
ü  Llamar a un método
ü  Llamada por valor
ü  Constructores
ü  Método static

· Arrays
· Vectores
· Problemas de la clase adicional
· Problemas de diseño

Métodos

En una clase, cada método realiza una tarea relativamente autónoma. Este permite que los programadores puedan dividir un problema complejo en varias piezas más pequeñas y manejables. Una vez que el método se ha escrito correctamente, el programador ya no necesita preocuparse por su funcionamiento interno. Cada método cuenta con:

·         Identificador de acceso. Al igual que las variables, los métodos pueden ser  public o private . A los métodos private solamente se puede acceder   desde dentro de la clase. Por su parte, a los métodos public puede acceder cualquiera, tanto desde dentro como desde fuera de la clase.

·         Tipo devuelto. Un método puede devolver un valor al usuario. Puede tratarse de un tipo de datos simple, como int o de otra clase. Un tipo devuelto void indica que no se devolverá ningún valor.
·          Nombre. El nombre de un método debe comenzar con una letra, distingue entre mayúsculas y minúsculas y no puede ser una palabra reservada de Java. Una buena práctica es utilizar nombres descriptivos, por ejemplo, setHeight.
·          Lista de argumentos. Los argumentos son campos de entrada par aun método. Un parámetro puede ser un tipo de datos simple y otra clase.
Definir un método
Para poder invocar un método, primero es necesario definirlo. La definición del método proporciona los detalles sobre el modo de realizar las tareas. Dado que cada método es un fragmento de código autónomo, puede definir sus propias variables y métodos.

Utilizando nuestra clase Box, vamos a definir 7 métodos:

public class Box
{
private double width;
private double height;
private double length;
1.    // Método para calcular el volumen de una caja
public double volume()
{
}
return width*height*length;
2.    // Método para establecer el valor del ancho de la caja
public void setWidth(double w) {
width = w;
}
3.    // Método para establecer el valor del alto de altura de la caja
public void setHeight(double h){
height = h;
}
4.    // Método para establecer el valor de la longitud de la caja
public void setLength(double l){
length = l;
}
5.    // Método para obtener el valor del ancho de la caja
public double getWidth(){
return width;
}
6.    // Método para obtener el valor de la altura de la caja
public double getHeight(){
return height;
}
7.    // Método para obtener el valor de la longitud de la caja
public double getLength(){
return length;
}
}
Un método especial: constructor
Los constructores son métodos que se utilizan para CREAR un objeto de la clase. Se llaman automáticamente cuando se utiliza el nuevo operador. Un constructor no tiene un tipo devuelto; tiene el mismo nombre que su clase y puede tener cualquier número de parámetros.
Una clase puede contener varios constructores. Se utilizan, sobre todo, para inicializar variables de miembros de un objeto.
Arrays
Un array es un conjunto de valores del mismo tipo. Para hacer referencia a un elemento concreto del array, especificamos el nombre del array seguido del número de índice del elemento en particular entre corchetes []. Observe que el primer elemento del array está indexado como 0, no como 1.
En el siguiente ejemplo, queremos crear un array c que contenga 6 enteros (de  c[0] a  c[5]).   c[0] 2  c[1] 5  c[2] 1  c[3] 43  c[4] 8  c[5] 66

Ésta es la declaración:
int[] c = new int[6]; //Reserva memoria para 6 enteros en el array c  c[0] = 2;  c[1] = 5;
…………………
O bien puede inicializar y declarar el array al mismo tiempo.
int [] c = {2, 5, 1, 43, 8, 66};
El array puede almacenar, no sólo tipos de datos primitivos, sino también objetos. Por  ejemplo:
  Box[] boxArray = new Box[3];
Cada objeto del array tiene un miembro de datos entero llamado length que devuelve el número de elementos de dicho array. Por ejemplo:
System.out.println(c.length); //se obtiene 6 como resultado
Vectores
· Sólo pueden contener elementos de un mismo tipo.  Al igual que un array, un vector es una colección de objetos, pero:
· Un vector puede aumentar su longitud automáticamente cuando lo necesite.
· Un vector puede contener elementos de distintos tipos siempre y cuando cada uno sea un objeto (pero NO un tipo de datos primitivo; no es posible incluir integers o doubles en un vector).
· Es posible acceder a un vector, agregarlo, modificarlo y consultarlo utilizando métodos de la clase Vector

domingo, 3 de abril de 2011

Estructuras estáticas

ARREGLOS. Existen arreglos unidimensionales, bidimensionales y multidimensionales.                      
Arreglos Unidimensionales:
son estructuras de datos cuyos elementos son del mismo  tipo, con las mismas características, y se referencian bajo un nombre o identificativo común.
 Este tipo de estructura también recibe el nombre de vectores. Representación gráfica: d d+1 d+2 d+3 d+4 d+5…. d + N   Último elemento del Primer elemento del vector.

Para declarar un arreglo tiene que indicar su tipo, un nombre único y la cantidad de elementos que va a contener. Por ejemplo, las siguientes instrucciones declaran tres arreglos distintos:
Float costo partes [50];                          
Para acceder a valores específicos del arreglo, use un valor de índice que apunte al elemento deseado. Por ejemplo, para acceder al primer elemento del arreglo calificaciones debe utilizar el valor de índice 0 (calificaciones [0]). Partes de un arreglo:
                                             

Las operaciones que se pueden realizar con vectores durante el proceso de resolución de un problema son:
    · Lectura/ escritura
    · Asignación
    · Actualización (inserción, eliminación, modificación)
    · Recorrido (acceso secuencial)
    · Ordenación
    · Búsqueda
Ejemplos:
Sea  un arreglo de  n   elementos enteros con índices enteros. Su representación nos queda:


#i n c l u d e <s t d i o . h>
i n t main ( )
{
i n t v [ 5 ] ; /_ Vector de 5  elementos  enteros _/
chars [ 3 0 ] ; /_ Vector de 30 elementos de t i p o c a r }

Sea bool un arreglo de 26 elementos booleanos con índices de tipo carácter. Su representación nos queda:
                Bool = arreglo["a".."z"] de booleanos

Número total de elementos:
NTE= (ord("z")-ord("a")) + 1 = 122-97+1 = 26 elementos
Lectura
El proceso de lectura de un arreglo consiste en leer y asignar un valor a cada uno de sus elementos. Normalmente se realizan con estructuras repetitivas, aunque pueden usarse estructuras selectivas. Usamos los índices para recorrer los elementos del arreglo:
desde i = 1 hasta 70 hacer
leer ( arre[i])
fin_desde
Escritura:
Es similar al caso de lectura, sólo que en vez de leer el componente del arreglo, lo escribimos.
             leer (N)
             desde i = 1 hasta N hacer
               escribir (arre[i])
             fin_desde
Asignación:
No es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar el valor deseado en cada componente. Con una estructura repetitiva se puede asignar un valor a todos los elementos del vector.
Por ejemplo:
         arre[1]  ¬120 (asignación de un valor constante único a una casilla del vector)
         arre[3] ¬arre[1] / 4 (asignar una operación)

Se puede asignar un valor constante a todos los elementos del vector:desde i = 1 hasta 5 hacer
          arre[i] ¬3
          fin_desde
O bien
           arre  ¬3 (con arre del tipo arreglo)

Inicialización
Para inicializar con cero todos los elementos del arreglo:
            desde i = 1 hasta 70 hacer
                arre[i] ¬ 0

             fin_desde
                                                                                                      
Acceso Secuencial. (Recorrido)
El acceso a los elementos de un vector puede ser para leer en él o para escribir (visualizar su contenido). Recorrido del vector es la acción de efectuar una acción general sobre todos los elementos de ese vector.
Actualización.
Incluye añadir (insertar), borrar o modificar algunos de los ya existentes. Se debe tener en cuenta si el arreglo está o no ordenado. Añadir datos a un vector consiste en agregar un nuevo elemento al final del vector, siempre que haya espacio en memoria.
Matrices
Existe dentro del conjunto de los ARREGLOS.
Tiene dos o más dimensiones. Generalmente dos (2): N x M.
El acceso a matrices de dos dimensiones es a traves de *DOS
INDICES*.
Ejemplo
Una mesa de ajedrez
El jugo del 'gato'.
M
#i n c l u d e <s t d i o . h>
i n t main ( )
{
i n t v [ 5 ] [ 3 ] ; /_ Ve c tor de 15 e n t e r o s ( i n t ) _/
cha r v [ 2 ] [ 2 ] ; /_ Ve c tor de 4 c a r a c t e r e s ( cha r ) _}












TIPOS DE DATOS ABSTRACTOS (TDA)

Introducción a los tipos abstractos de datos:

Definición del tipo:
Una lista es una colección homogénea de elementos con una relación lineal entre ellos. Es decir, cada elemento de la lista (excepto el primero) tiene un único elemento predecesor y cada elemento (excepto el último) tiene un elemento sucesor

Existe en los lenguajes de programación estructurados bajo la forma de los tipos predefinidos, que se pueden considerar como tipos abstractos sin mucho esfuerzo.
O sea  consideremos el tipo de datos de los enteros que ofrece el lenguaje Pascal; la definición del TAD correspondiente consiste en determinar:

Abstracción.-   es sacar el problema a través de un modelo.

Modelo análisis y diseño del programa (análisis, diseño, implementación, prueba...).

Dato:
Es una unidad de información que no tiene mucha relevancia al problema de la propuesta.

ü  ¿Cuáles son sus valores? Los números enteros dentro del intervalo [minint, maxint].
ü  ¿Cuáles son sus operaciones? La suma, la resta, el producto, y el cociente y el resto de la división.
.                                         
Tipos básicos de operaciones en un TAD

Ø  Constructores: Crean una nueva instancia del tipo.
Ø  Transformación: Cambian el valor de uno o más elementos de una instancia del tipo.
Ø  Observación: Nos permiten observar el valor de uno o varios elementos de una instancia sin modificarlos.

Ø  Itera dores: Nos permiten procesar todos los componentes en un TDA de forma secuencial.

Implementación
Una vez definido el TAD se escoge una representación interna utilizando los tipos que proporciona el lenguaje y / o otros TAD ya definidos previamente.
La representación deberá ocultarse utilizando los mecanismos que nos proporcione el lenguaje. Ocultamiento de Información.
Normalmente la implementación del tipo se realiza en un módulo aparte que será enlazado al programa principal

TAD:

Operaciones:
ü  Asignaciones.
ü  Incrementos.
ü  Decrementos.
ü  Operaciones aritméticas.


TDA.- estudiante: conjunto de datos

·         RU [numero];
·         Nombre[Texto];
·         Edad[numero];

Operaciones:

·         Ver nombres();
·         Calcular edad();
·         Modificar edad();
TDA.- Conjuntos: Conjunto de datos
  
Set [numero texto];

Operaciones:

·         Unión.
·         intersección.
·         comparación.
           
Un TAD es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema.
Está formado por un conjunto válido de elementos y un número de operaciones primitivas que se pueden realizar sobre ellos.

MEMORIA ESTATICA Y DINAMICA

INTRODUCCION
Tu ordenador probablemente usa ambas, memoria estática y memoria dinámica al mismo tiempo, pero las usa por diferentes razones debido al coste entre los dos tipos de memoria RAM (ram  memory). Si entiendes como los chips de RAM dinámica y RAM estática funcionan internamente, es fácil ver porqué el coste es diferente, y también podrás entender su nombre.
¿Qué es memoria?
Es un espacio lógico para guardar información.
La memoria (también llamada almacenamiento) se refiere a parte de los componentes que forman parte de una COMPUTADORA, Son dispositivos que retienen DATOS informáticos durante algún intervalo de tiempo. Las memorias de computadora proporcionan unas de las principales funciones de la computación moderna, la retención o almacenamiento de información. Es uno de los componentes fundamentales de todas las computadoras modernas que, acoplados al CPU.

¿Qué es estática?

La forma más fácil de almacenar el contenido de una variable en memoria en tiempo de ejecución es en memoria estática o permanente a lo largo de toda la ejecución del programa. O sea,  que no se modifica al menos en tiempo de ejecución.
No todos los objetos (variables) pueden ser almacenados estáticamente.
Para que un objeto pueda ser almacenado en memoria estática su tamaño (número de bytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación, como consecuencia de esta condición no podrán almacenarse en memoria estática:
¿Qué es dinámica?
Su tamaño puede variar durante la ejecución del programa y puede ser liberado mediante la función free. O sea que se modifica permanentemente.
Memoria estática.-
Las técnicas de asignación de memoria estática son sencillas.
La asignación de memoria puede hacerse en tiempo de compilación y los objetos están vigentes desde que comienza la ejecución del programa hasta que termina.
En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los objetos de estos subprogramas puedan almacenarse estáticamente se aloja en la memoria estática un registro de activación correspondiente a cada uno de los subprogramas.
Estos registros de activación contendrán las variables locales, parámetros formales y valor devuelto por la función.
Consideraciones 
ü  Error en tiempo de ejecución de índice fuera del rango.
ü  Se debe conocer con anticipación el tamaño de la estructura.
ü  Se guardan en memorias adyacentes.
ü  Vectores, matrices, cubos, registros,  archivos.
Ventajas
·         La velocidad de acceso es alta.
·         Para retener los datos solo necesita estar energizada.
·         Lógica simple.
Son más fáciles de diseñar.
Desventajas:
ü  No se puede modificar el tamaño de la estructura en tiempo de ejecucion.
ü  No es óptimo con grandes cantidades de datos.
ü  Desperdicio de memoria cuando no se utiliza en su totalidad  del tamaño  v[100]  .
ü  Menor capacidad, debido a que cada celda de almacenamiento requiere más transistores.
ü  Mayor costo por bit.
ü  Mayor consumo de Potencia

Memoria dinámica

La memoria dinámica es un espacio de almacenamiento que se solicita en tiempo de ejecución. De esa manera, a medida que el proceso va necesitando espacio para más líneas, va solicitando más memoria al sistema operativo para guardarlas. El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que no podemos saber en tiempo de compilación dónde nos dará huecos el sistema operativo (en la memoria de nuestro PC).
Un dato importante es que como tal este tipo de datos se crean y se destruyen mientras se ejecuta el programa y por lo tanto la estructura de datos se va dimensionando de forma precisa a los requerimientos del programa, evitándonos así perder datos o desperdiciar memoria si hubiéramos tratado de definirla cantidad de memoria a utilizar en el momento de compilar el programa.
Cuando se crea un programa en el que es necesario manejar memoria dinámica el sistema operativo divide el programa en cuatro partes que son: texto, datos (estáticos), pila y una zona libre o heap. En el momento de la ejecución habrá tanto partes libres como partes asignadas al proceso por lo cual si no se liberan las partes utilizadas de la memoria y que han quedado inservibles es posible que se “agote” esta parte y por lo tanto la fuente de la memoria dinámica. También la pila cambia su tamaño dinámicamente, pero esto no depende del programador sino del sistema operativo.

VENTAJAS:
ü  Es posible disponer de un espacio de memoria arbitrario que dependa de información dinámica (disponible sólo en ejecución): Toda esa memoria que maneja es implementada por el programador cuando fuese necesario.
ü  Otra ventaja de la memoria dinámica es que se puede ir incrementando durante la ejecución del programa. Esto permite, por ejemplo, trabajar con arreglos dinámicos.
ü  Es memoria que se reserva en tiempo de ejecución. Su tamaño puede variar durante la ejecución del programa y puede ser liberado mediante la función free.

DESVENTAJAS:
ü  Es difícil de implementar en el desarrollo de un programa o aplicación.
ü  Es difícil implementar estructuras de datos complejas como son los tipos recursivos (árboles, grafos, etc.).Por ello necesitamos una forma para solicitar y liberar memoria para nuevas variables que puedan ser necesarias durante la ejecución de nuestros programas: Heap.
ü  Una desventaja de la memoria dinámica es que es más difícil de manejar.
ü  La memoria dinámica puede afectar el rendimiento. Puesto que con la memoria estática el tamaño de las variables se conoce en tiempo de compilación, esta información está incluida en el código objeto generado. Cuando se reserva memoria de manera dinámica,
ü  Se tienen que llevar a cabo varias tareas, como buscar un bloque de memoria libre y almacenar la posición y tamaño de la memoria asignada, de manera que pueda ser liberada más adelante. Todo esto representa una carga adicional, aunque esto depende de la implementación y hay técnicas para reducir su impacto.