viernes, 25 de abril de 2008

Primer Año: Programacion 1

Programacion 1
Teoria General

Estructuras dinamincas: son estructuras que crecen y se contraen a medida que se ejecuta el programa, a diferencia de las estructuras de datos estaticas ( array, vectores, etc.)
Listas enlazadas: es una colección o secuencia de elementos dispuestos uno detrás de otro, en la que cadaelemento se conecta al siguiente elemento por un <> o <>
Nodos: son cada uno de los elementos que componen una lista enlazada. Y consta de un campo de dato y un puntero que apunta al siguiente elemento de la lista.
Puntero: es una direccion de memoria. Una variable puntero es una variable que contiene direcciones de otras variables. Estas contienen valores que son direcciones de memoria donde se almacenan datos.
Elementos que se pueden hacer con una lista enlazada:
• Declaracion de los tipos nodo y puntero a nodo.
• Inicializacion o creación.
• Insertar elementos en una lista
• Eliminar elementos de una lista
• Buscar elementos de una lista (comprobar la existencia de elementos de una lista).
• Recorrer una lista enlazada (visitar cada nodo de la lista).
• Comprobar si la lista esta vacia.
Declaracion de un nodo: se puede declarar con la palabra reservada “struct” que permite agrupar compos de diferentes tipos. Con la sentencia “typedef” se declara el nombre del elemento y sirve para que se pueda cambiar el tipo de dato con facilidad.
Ej:
Typedef double elemento;
Struct nodo
<
elemento dato;
struct nodo * enlace;
>;
Punteros de cabecera: el acceso mas frecuente a una lista enlazada es a traves del primer nodo de la lista que se llama “cabecera” de la lista. Un puntero al primer nodo se llama “puntero cabeza”. El ultimo nodo es la cola de la lista, y un puntero al ultimo nodo es el “puntero cola”.
Definición de punteros:
Struct nodo * ptr_cabeza;
Struct nodo * ptr_cola;

Struct nodo se simplifica utilizando la declaracion “typedef”
Typedef ptr_cabeza;
Typedef ptr_cola;
El puntero nulo: el puntero nulo (NULL) se utiliza para cualquier valor de puntero que no apunte a ningun sitio.


Construccion de una lista: tenemos 4 pasos para crear una lista enlazada.
1. Declarar el tipo de dato y el puntero de cabeza.
2. Asignar memoria para un elemento del tipo definido anteriormente utilizando alguna de las funciones de asignación de memoria (malloc ( ), calloc ( ), realloc ( )), y un cast para la conversión de void* al tipo puntero a nodo.
3. Crear iterativamente el primer elemento (cabeza) y los elementos secesivos de una lista enlazada simplemente.
4. Repetir hasta que no haya mas entrada para el elemento.
Insertar un elemento en una lista: el algoritmo para insertar elementos varia dependiendo de la posición en que se desea insertar el elemento.
Las posiciones pueden ser:
• En la cabeza de la lista
• En el final de la lista
• Antes de un elemento especifico
• Después de un elemento especificado.
Insertar un nuevo elemento en la cabeza de una lista: es mas facil y eficiente insertar un elemento nuevo en la cabeza de una lista. Los pasos son:
1. asignar una nuevo nodo apuntado por “nuevo” que es una variable puntero local que apunta al nuevo nodo que se va a insertar en la lista.
2. situar el nuevo elemento en el campo “dato ( info)” del nuevo nodo.
3. hacer que el campo enlace “siguiente” del nuevo nodo apunte a la cabeza de la lista original.
4. hacer que el puntero cabeza apunte al nuevo nodo que se ha creado.
Inserción de un nuevo nodo que no esta en la cabeza de lista: se puede insertar en el centro o al final de la lista. Los pasos son:
1. asignar en nuevo nodo apuntado por el puntero “ nuevo”.
2. situar el nuevo elemento en el campo “ dato (info)” del nuevo nodo.
3. hacer que el campo enlace “siguiente” del nuevo nodo apunte al nodo que va después de la posición del nuevo nodo ( o bien a NULL si no hay ningun nodo después de la nueva posición).
4. en la variable puntero anterior tener la direccion del nodo que esta antes de la posición deseada para el nuevo nodo. Hacer que “anterior ->siguiente” apunte al nuevo nodo que se acaba de crear.
Inserción al final de la lista: es la menos eficiente. Tenemos que seguir desde la cabeza hasta el ultimo elemento de la lista y a continuación realizar la inserción. Cuando “ultimo” es una variable que apunta el ultimo nodo de la lista, las sentencias siguientes insertan un nodo al final de la lista:
Ultimo -> siguiente = (nodo*) malloc (sizeof (nodo));
Ultimo -> siguiente ->dato = entrada;
Ultimo -> siguiente ->siguiente = NULL;
Ultimo = ultimo -> siguiente;
Búsqueda de un elemento: la funcion “ buscarlista” utiliza una variable puntero denominada “indice” que va recorriendo la lista nodo a nodo. Mediante un bucle, Indice apunta a los nodos de la lista de modo que si se encuentra el nodo buscado, se devuelve un puntero al nodo buscado con la sentencia de retorno ( return); en el caso de no encontrarse el nodo buscado la funcion debe devolver NULL ( return NULL).
Supresión de un nodo en una lista: al eliminar un nodo de una lista enlazada tenemos que enlazar el nodo anterior con el nodo siguiente al que se desea eliminar y liberar la memoria que ocupa. Los pasos son los siguientes:
1. búsqueda del nodo que contiene el dato.
2. el puntero “siguiente” del nodo anterior ha de apuntar al “ siguiente” del nodo a eliminar.
3. en caso de que el nodo a eliminar sea el primero, “cabeza”, se modifica “cabeza” para que tenga la direccion del nodo “ siguiente”
4. por ultimo, se libera la memoria ocupada por el nodo.

VER LOS CHAPINES DE LA CARPETA

Archivos: conjunto de información almacenado en forma permanente. Conjunto de registros.
Los archivos de caracterizan según el tipo y según el acceso.
Según el tipo:
• archivos de texto (ANSI): son aquellos que están compuestos únicamente por texto sin formato, sólo caracteres. Estos caracteres se pueden codificar de distintos modos dependiendo de la lengua usada.
• archivos binarios (registros): Estructura de datos formada por uno o más elementos denominados "Campos" y estos pueden estar compuestos a su vez por "subcampos".
Según el Acceso:
• archivos secuenciales:
• Archivos aleatorios:
o Archivo: es un conjunto de registros.
o Registro: un conjunto de campos. = estructuras.
Los registros pueden ser de diferentes tipos. En cambio, los arreglos son del mismo tipo.

Tipos de archivos:
Según sus funciones:
a.- Archivos Permanentes: Son aquellos cuyo registros sufren pocas o ninguna variación a lo largo del tiempo, se dividen en:
Constantes: Están formados por registros que contienen campos fijos y campos de baja frecuencia de variación en el tiempo.
De Situación: Son los que en cada momento contienen información actualizada.
Históricos: Contienen información acumulada a lo largo del tiempo de archivos que han sufridos procesos de actualización o bien acumulan datos de variación periódica en el tiempo.
b.- Archivos de Movimiento: Son aquellos que se utilizan conjuntamente con los maestros (constantes), y contienen algún campo común en sus registros con aquellos, para el procesamiento de las modificaciones experimentados por los mismos.
c.- Archivo de Maniobra o Transitorio: Son los archivos creados auxiliares creados durante la ejecución del programa y borrados habitualmente al terminar el mismo.


Según sus elementos:
Los principales archivos de este tipo son:
Archivo de Entrada, una colección de datos localizada en un dispositivo de entrada.
Archivo de Salida, una colección de información visualizada por la computadora.
Archivo de Programa, un programa codificado en un lenguaje especifico y localizado o almacenado en un dispositivo de almacenamiento.
Archivo de Texto, una colección de caracteres almacenados como una unidad en un dispositivo de almacenamiento.

Acceso: Existen distintas formas de acceder a los datos:
Secuenciales; los registros se leen desde el principio hasta el final del archivo, de tal forma que para leer un registro se leen todos los que preceden.
Directo; cada registro puede leerse / escribirse de forma directa solo con expresar su dirección en el fichero por él numero relativo del registro o por transformaciones de la clave de registro en él numero relativo del registro a acceder.
Por Índice; se accede indirectamente a los registros por su clave, mediante consulta secuenciales a una tabla que contiene la clave y la dirección relativa de cada registro, y posterior acceso directo al registro.
Dinámico; es cuando se accede a los archivos en cualquier de los modos anteriormente citados.
La elección del método esta directamente relacionada con la estructura de los registros del archivo y del soporte utilizado.

Tipos de acceso:
Acceso Secuencial. Exige el tratamiento de elemento, para esto es necesario una exploración secuencial comenzando desde el primer momento (Pascal permite este acceso)
Secuenciales: archivo de texto que debe ser leído del principio hasta el final.
Acceso Directo. Permite procesar o acceder a un elemento determinado y referencia directamente por su posición en el soporte de almacenamiento (Turbo Pascal permite este acceso.
Aleatorios: es un archivo con registros de un mismo largo. Un programa puede accesar directamente cualquier registro sin tener que leer los registros previos.
Binarios: es un archivo que lee byte por byte sin asumir ninguna estructura.
Los archivos Binarios no son un nuevo tipo de archivo, pero si una nueva forma de manipular cualquier tipo de archivo. Las técnicas de archivo binarios permiten leer o cambiar cualquier byte de un archivo. Son herramientas extremadamente potentes, pero como toda herramienta potente debe manejarse con cuidado.

Paradigmas de programación:
Programación orientada a eventos:
La programacion dirigida por eventos es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema o que ellos mismos provoquen.
Para entender la programación dirigida por eventos, podemos oponerla a lo que no es: mientras en la programación secuencial es el programador el que define cuál va a ser el flujo del programa, en la programación dirigida por eventos será el propio usuario --o lo que sea que esté accionando el programa-- el que dirija el flujo del programa.
En la programación dirigida por eventos, al comenzar la ejecución del programa se llevarán a cabo las inicializaciones y demás código inicial y a continuación el programa quedará bloqueado hasta que se produzca algún evento. Cuando alguno de estos eventos tenga lugar, el programa pasará a ejecutar el código del correspondiente manejador de evento. Por ejemplo, si el evento consiste en que el usuario ha hecho click en el botón de play de un reproductor de películas, se ejecutará el código del manejador de evento, que será el que haga que la película se muestre por pantalla.
Un ejemplo claro lo tenemos en los sistemas de programación Lexico y Visual Basic, en los que a cada elemento del programa (objetos, controles, etcétera) se le asignan una serie de eventos que generará dicho elemento, como la pulsación de un botón del ratón sobre él o el re dibujado del control.

Programación orientada a objetos:
Programa: Los programas se organizan como colecciones de objetos que colaboran entre si enviándose mensajes.

Componentes Básicos:
Objetos: Entidad de la vida real que tiene atributos (datos) y métodos (operaciones) que operan sobre esos atributos. A los datos que forman parte del objeto se les conoce como datos miembros y a las funciones como funciones miembros. Los datos quedan ocultos al programador y únicamente dispondrá de las funciones para acceder a ellos. Es una abstracción que se usa para representar una entidad real.
Todo objeto tiene estado, exhibe un comportamiento bien definido y posee identidad única.
Para crear objetos es necesario contar con otro objeto que pueda crear objetos. El objeto creador de objetos se llama clase y los objetos creados se llaman instancias. Los objetos en Java se crean en forma dinámica. No es necesario destruir un objeto ya que java lo hace solo.

Clase: Modelo que se usa para describir objetos similares. Es un tipo de dato definido por el usuario que determina las estructuras de datos que lo forman y las funciones asociadas con él, es decir es un modelo con el que se construyen los objetos.
[public][final][abstract] class nombreClase [extends clase base][implements interface]
{ lista de atributos y métodos }
Public: Clase publica que puede ser usada por cualquier otra clase de otro paquete.
Final: Clase que no puede tener clases derivadas.
Abstract: Clase que no puede ser instanciada, si derivada.
Extends: Indica de que clase hereda la nuestra (en herencia)
Implements: Implementa interfaces (en herencia)

Mensaje: Es una petición de un objeto a otro para que este se comporte de una determinada manera, ejecutando uno de sus métodos.

Características fundamentales de la POO:
Encapsulamiento: Es la ocultación de información. Significa mantener la información dentro del objeto y mantenerlo como una caja negra. Puede ser accedida por métodos.
Abstracción: Es la capacidad de aislar y encapsular la información del diseño y la ejecución. Es la capacidad para identificar atributos y métodos.
Herencia: Es la propiedad que permite a los objetos crearse a partir de otros objetos. Cada subclase comparte características comunes con la clase de la que deriva. La clase original la llamamos clase base y las nuevas clases creadas a partir de ella clases derivadas. Una clase derivada puede ser también clase base dando lugar a una jerarquía de clases.
Los miembros de la clase base deben ser protected o private protected.
La clase derivada hereda todos los datos y funciones miembro, pero solo puede acceder a los miembros que le sean permitidos desde la clase base. Puede añadir a los miembros heredados, sus propios atributos y métodos. Para acceder a los métodos de la clase base se usa super().
La ventaja de la herencia es que permite la reutilización de código, ahorrando tiempo y dinero.
Polimorfismo: Es la capacidad de que diferentes objetos reaccionen de distinta forma a un mismo mensaje. Es la capacidad de referirse a objetos de clases distintas en una jerarquía utilizando el mismo elemento de programa (método) para realizar la misma operación, pero de manera diferente.
Características Secundarias de la POO:
Tipificación: Permite la agrupación de objetos en tipos.
Concurrencia: Los objetos pueden actuar al mismo tiempo.
Persistencia: Un objeto puede seguir existiendo tras desaparecer su antecesor.
Ventajas de la POO:
Modelos
Modularidad
Extensibilidad
Eliminación de redundancias
Reutilización: ahorro de trabajo
Desventajas de la POO:
Exige conocer bien la teoría de objetos.
II. Requiere mayor capacidad de los programadores.
Acceso a los miembros de una clase:
Private: Los miembros private son solo accesibles por la propia clase.
Public: Son accesibles por cualquier clase.
Protected: Son accesibles por la propia clase, clases derivadas y clases del mismo paquete.
Private protected: Son accesibles por la propia clase y clases derivadas.
Friendly (por defecto): Son accesibles por la propia clase y clases del mismo paquete.
Atributos Estáticos: Son los atributos de clase. Existe solo una instancia de ese miembro. Se diferencian de los atributos de instancias en que mantienen un valor por clase. A un dato static se le asigna una zona fija de almacenamiento en tiempo de compilación.

[modificador de acceso][static][final][transient][volatile] Tipo nombre [= valor]

Static: Define un atributo de clase, unico para todos los objetos de ella.
Final: Define una constante.
Transient: Variables que no forman parte del estado permanente del objeto.
Volatile: Fuerza a la lectura de la variable cada vez que se le va a usar.
Métodos Especiales:
Métodos sobrecargados: Métodos de una clase que tienen mismo nombre pero difieren en numero y/o tipos de parámetros.
Redefinición de métodos: Implica definir un metodo en la clase derivada con el mismo nombre y firma que el metodo en la clase base. Permite la refinación de métodos o modificación de los mismos en clases derivadas.
Se diferencia de la sobrecarga en que se aplica en una jerarquía de clases y con firmas iguales, mientras que la sobrecarga se aplica en el ámbito de una clase y con firmas diferentes.

[modificador de acceso][static][abstract][final][native][synchronized] TipoDevuelto NombreMetodo [throws excepcion]

Static: Método de clase, compartido por todas las instancias.
Final: No puede ser redefinido.
Native: Métodos que se implementan en otro lenguaje (c o C++).
Synchronized: métodos sincronizados, se usan en concurrencia.
Throws: Indica que el método genera determinadas excepciones.
Constructores: Sirven para construir o inicializar objetos.
Tienen el mismo nombre que la clase.
No devuelven valores.
Pueden admitir parámetros.
Sino se define uno el compilador genera uno por defecto.
Se llaman en el momento de la creación del objeto.
No se hereda.

Orden de construcción de los constructores cuando se hereda:
Constructores de la clase base.
Constructores de los miembros de la clase derivada.
Ejecución de las instrucciones contenidas en el cuerpo del constructor de la clase derivada.
Polimorfismo:
Métodos y Clases abstractas: Los métodos abstractos son declarados pero no implementados. Si existe un método abstracto entonces debemos declarar la clase como abstracta, y al declararla como tal no se pueden crear instancias de ella. Sirven para definir conceptos incompletos, que deben ser completados en las subclases de la clase abstracta.
Interfaces: Son clases que no tienen implementación.
Sirven como tipos de otras clases.
Todos sus métodos son abstractos y todos sus atributos son final.
Una clase puede implementar muchas interfaces.
Implementación de Polimorfismo: El polimorfismo se implementa por medio de las funciones abstractas, en las clases derivadas se declara y se define una funcion que tiene el mismo nombre, el mismo numero de parámetros y del mismo tipo que en la clase base, pero que da lugar a un comportamiento distinto, especifico de los objetos de la clase derivada.
No se pueden crear objetos de una clase abstracta pero si se pueden declarar referencias en las que guardamos el valor devuelto por new al crear objetos de las clases derivadas.

No hay comentarios.: