Bienvenida

martes, 9 de febrero de 2016

TIPOS DE OPERADORES EN JAVA-NETBEANS Y OTROS LENGUAJES DE PROGRAMACIÓN

Introducción
                        Para programar ya sea en java-netbeans u otros lenguajes de programación es necesario tener en cuenta los tipos de operadores con los que se esta programando.

Para lo cual el programador tiene que ser muy minucioso al momento de declarar variables y realizar la programación ya que eso define el tipo de programador que es, además debe mantener un orden al momento de programar.

Los datos se manipulan muchas veces utilizando operaciones con ellos. Los datos se suman, se restan, ... y a veces se realizan operaciones más complejas.

Tipos de Operadores


  • Operadores Aritméticos
                             Son:

Hay que tener en cuenta que el resultado de estos operadores varía notablemente si usamos enteros o  si usamos números de coma flotante.

Por ejemplo:

                              double resultado1, d1=14, d2=5;
                              int resultado2, i1=14, i2=5;

                              resultado1= d1 / d2;
                              resultado2= i1 / i2;

                              resultado1 valdrá 2.8 mientras que resultado2 valdrá 2. Es más incluso:

                               double resultado;
                               int i1=7,i2=2;
                               resultado=i1/i2;                                     //Resultado valdrá 3
                               resultado=(double)i1/(double)i2;         //Resultado valdrá 3.5

            El operador del módulo (%) para calcular el resto de una división entera. Ejemplo:

                                int resultado, i1=14, i2=5;
                                resultado = i1 % i2;                              //El resultado será 4


  • Operadores Condicionales
            Sirven para comparar valores. Siempre devuelven valores booleanos. Son:



Los operadores lógicos (AND, OR y NOT), sirven para evaluar condiciones complejas. NOT sirve para negar una condición. Ejemplo:

                 boolean mayorDeEdad, menorDeEdad;
                 int edad = 21;
                      mayorDeEdad = edad >= 18;               //mayorDeEdad será true
                      menorDeEdad = !mayorDeEdad;       //menorDeEdad será false

El operador && (AND) sirve para evaluar dos expresiones de modo que si ambas son ciertas, el resultado será true sino el resultado será false. Ejemplo:

                           boolean carnetConducir=true;
                           int edad=20;
                           boolean puedeConducir= (edad>=18) && carnetConducir;

                          //Si la edad es de al menos 18 años y carnetConducir es
                         //true, puedeConducir es true

El operador || (OR) sirve también para evaluar dos expresiones. El resultado será true
si al menos uno de las expresiones es true. Ejemplo:

                          boolean nieva =true, llueve=false, graniza=false;

                          boolean malTiempo= nieva || llueve || graniza;


  • Operadores de Bit
         Son aquellos operadores que manipulan los bits de los números y son los siguientes:



  • Operadores de Asignación

Permiten asignar valores a una variable. El fundamental es “=”. Pero sin embargo se pueden usar expresiones más complejas como:

x += 3;

En el ejemplo anterior lo que se hace es sumar 3 a la x (es lo mismo x+=3, que x=x+3). Eso se puede hacer también con todos estos operadores:

                                                                           += -= *= /=
                                                                           &= |= ^= %=
                                                                            >>= <<=

También se pueden concatenar asignaciones:

                                                                          x1 = x2 = x3 = 5;

Otros operadores de asignación son “++” (incremento) y “- -“ (decremento). Ejemplo:

                                                                          x++;           //esto es x=x+1;
                                                                          x--;            //esto es x=x-1;  

Pero hay dos formas de utilizar el incremento y el decremento. Se puede usar por ejemplo 

                                                                           x++ o ++x

La diferencia estriba en el modo en el que se comporta la asignación. Ejemplo:

                                                                           int x=5, y=5, z;
                                                                           z=x++;                     //z vale 5, x vale 6
                                                                           z=++y;                   //z vale 6, y vale 6


  • Operador ?

Este operador (conocido como if de una línea) permite ejecutar una instrucción u otra según el valor de la expresión. Sintaxis:

expresionlogica?valorSiVerdadero:valorSiFalso;

Ejemplo:

paga=(edad>18)?6000:3000;

En este caso si la variable edad es mayor de 18, la paga será de 6000, sino será de 3000. Se evalúa una condición y según es cierta o no se devuelve un valor u otro. Nótese que esta función ha de devolver un valor y no una expresión correcta. Es decir, no funcionaría:

(edad>18)? paga=6000: paga=3000; /ERROR!!!!

  • Orden de Precedencia de los Operadores Java-Netbeans
A veces hay expresiones con operadores que resultan confusas. Por ejemplo en:

resultado = 8 + 4 / 2;

Es difícil saber el resultado. ¿Cuál es? ¿seis o diez? La respuesta es 10 y la razón es que el operador de división siempre precede en el orden de ejecución al de la suma. Es decir, siempre se ejecuta antes la división que la suma. Siempre se pueden usar paréntesis para forzar el orden deseado:

resultado = (8 + 4) / 2;

Ahora no hay duda, el resultado es seis. No obstante el orden de precedencia de los operadores Java es:


En la tabla anterior los operadores con mayor precedencia está en la parte superior, los de menor precedencia en la parte inferior. De izquierda a derecha la precedencia es la misma. Es decir, tiene la misma precedencia el operador de suma que el de resta. Esto último provoca conflictos, por ejemplo en:
resultado = 9 / 3 * 3;

El resultado podría ser uno ó nueve. En este caso el resultado es nueve, porque la división y el producto tienen la misma precedencia; por ello el compilador de Java realiza primero la operación que este más a la izquierda, que en este caso es la división. Una vez más los paréntesis podrían evitar estos conflictos.

Ejemplo de Programacion en Consola de Java-Netbeans

PRÓXIMA PUBLICACIÓN
  • Ejemplos prácticos y sencillos paso a paso en Java-Netbeans incluidos vídeos.

   

COMO INICIAR LA PROGRAMACIÓN EN JAVA

Escritura de Programas y Aplicaciones Java

Codificación del texto:
                                       Todos los códigos fuentes Java se escriben en documentos de texto con extensión .java. Al ser un lenguaje para Internet, la codificación de texto debía permitir a todos los
programadores de cualquier idioma escribir ese código. Eso significa que Java es compatible con la codificación Unicode.

En la práctica significa que los programadores que usen lenguajes distintos del inglés no tendrán problemas para escribir símbolos de su idioma. Y esto se puede extender para nombres de clase, variables, etc.

La codificación Unicode2 usa 16 bits (2 bytes por carácter) e incluye la mayoría de los códigos del mundo.

Notas y Conocimientos  Previos

Los archivos con código fuente en Java deben guardarse con la extensión .java. Como se ha comentado cualquier editor de texto basta para crearle. Algunos detalles y recomendaciones importantes son:
  • En java (como en C) hay diferencia entre mayúsculas y minúsculas.
  • Cada línea de código debe terminar con ; (punto y coma).
  • Los comentarios; si son de una línea debe comenzar con “//” y si ocupan más de una línea          deben         comenzar con “/*” y terminar con “*/”.                                                                                                                                                                                                                                              

                  /*  Comentario

                    de varias líneas */

               //Comentario de una línea.

A veces se marcan bloques de código, los cuales comienza con { y terminan con } El código dentro de esos símbolos se considera interno al bloque.                                                                                                                                                                                                                                         
                       {
                        ...código dentro del bloque
                         }
                            código fuera del bloque



         El primer programa en Java
  
                                                    public class mi_primera_app
                                                    {
                                                       public static void main(String[] args)
                                                    {
                                                       System.out.println(“Hola..!!..¡Bienvenido Mi primer programa!”);
                                                      }
                                                      }

Este código escribe “Hola..!!..¡Bienvenido Mi primer programa!” en la pantalla. El archivo debería llamarse  mi_primera_app  ya que esa es la clase pública. El resto define el método main que es el que se ejecutará al lanzarse la aplicación. Ese método utiliza la instrucción que escribe en pantalla.

Otros Datos Importantes En la Compilación de Programas.

Los comentarios que comienzan con los códigos /** se llaman comentarios de documento y serán utilizados por los programas de generación de documentación javadoc.

Los comentarios javadoc comienzan con el símbolo /** y terminan con */ Cada línea javadoc se inicia con un símbolo de asterisco. Dentro se puede incluir cualquier texto.

Incluso se pueden utilizar códigos HTML para que al generar la documentación se tenga en cuenta el código HTML indicado.

En el código javadoc se pueden usar etiquetas especiales, las cuales comienzan con el símbolo @. Pueden ser:

  • 􀂀 @author. Tras esa palabra se indica el autor del documento.
  • 􀂀 @version. Tras lo cual sigue el número de versión de la aplicación
  • 􀂀 @see. Tras esta palabra se indica una referencia a otro código Java relacionado con éste.
  • 􀂀 @since. Indica desde cuándo esta disponible este código
  • 􀂀 @deprecated. Palabra a la que no sigue ningún otro texto en la línea y que indica que esta              clase o método esta obsoleta u obsoleto.
  • 􀂀 @throws. Indica las excepciones que pueden lanzarse en ese código.
  • 􀂀 @param. Palabra a la que le sigue texto qué describe a los parámetros que requiere el código        para su utilización (el código en este caso es un método de clase). Cada parámetro se coloca       en una etiqueta @param distinta, por lo que puede haber varios                                        @param para el mismo método.
  • 􀂀 @return. Tras esta palabra se describe los valores que devuelve el código (el código en este caso es un método de clase).
El código javadoc hay que colocarle en tres sitios distintos dentro del código java de la aplicación:

1> Al principio del código de la clase (antes de cualquier código Java). En esta zona se colocan comentarios generales sobre la clase o interfaz que se crea mediante el código Java. Dentro de estos comentarios se pueden utilizar las etiquetas: @author, @version, @see, @since y @deprecated.

2> Delante de cada método. Los métodos describen las cosas que puede realizar una clase. Delante de cada método los comentarios javadoc se usan para describir al método en concreto. Además de los comentarios, en esta zonase pueden incluir las etiquetas: @see, @param, @exception, @return,  @since y @deprecated.

3> Delante de cada atributo. Se describe para qué sirve cada atributo en cada clase. Puede poseer las etiquetas: @since y @deprecated.

Ejemplo:

/** Esto es un comentario para probar el javadoc
* este texto aparecerá en el archivo HTML generado.
* <strong>Realizado en agosto 2003</strong>
*
* @author Jorge Sánchez
* @version 1.0
*/
public class prueba1 {
//Este comentario no aparecerá en el javadoc
/** Este método contiene el código ejecutable de la clase
*
* @param args Lista de argumentos de la línea de comandos
* @return void
*/
public static void main(String args[]){
System.out.println("¡Mi segundo programa! ");
}
}

Tras ejecutar la aplicación javadoc, aparece como resultado la página web de la página siguiente.

Variables
Introducción

Las variables son los contenedores de los datos que utiliza un programa. Cada variable ocupa un espacio en la memoria RAM del ordenador para almacenar un dato determinado.
Las variables tienen un nombre (un identificador) que sólo puede contener letras, números y el carácter de subrayado (también vale el símbolo $). El nombre puede contener cualquier carácter Unicode.

Declaración de variables

Antes de poder utilizar una variable, ésta se debe declarar. Lo cual se debe hacer de esta forma:

tipo nombrevariable;

Donde tipo es el tipo de datos que almacenará la variable (texto, números enteros,...) y nombrevariable es el nombre con el que se conocerá la variable. 
Ejemplos:

int dias;
                boolean decision;


También se puede hacer que la variable tome un valor inicial al declarar:

int dias=365;

Y también se puede declarar más de una variable a la vez:

int dias=365, anio=23, semanas;

Al declarar una variable se puede incluso utilizar una expresión:

         int a=13, b=18;
int c=a+b;

Esas dos palabras sinónimas, hacen referencia a la duración de una variable. En el ejemplo:

{
                 int x=12;
}
                                                 System.out.println(x); //Error

Java dará error, porque la variable se usa fuera del bloque en el que se creo. Eso no es posible, porque una variable tiene como ámbito el bloque de código en el que fue creada (salvo que sea una propiedad de un objeto).

Tipos de datos primitivos


Enteros

Los tipos byte, short, int y long sirven para almacenar datos enteros. Los enteros son números sin decimales. Se pueden asignar enteros normales o enteros octales y hexadecimales. Los octales se indican anteponiendo un cero al número, los hexadecimales anteponiendo 0x.

                                                   int numero=16;      //16 decimal
                                                   numero=020;         //20 octal=16 decimal
                                                   numero=0x14;      //10 hexadecimal=16 decimal

Normalmente un número literal se entiende que es de tipo int salvo si al final se le coloca la letra L; se entenderá entonces que es de tipo long.
No se acepta en general asignar variables de distinto tipo. Sí se pueden asignar valores de variables enteras a variables enteras de un tipo superior (por ejemplo asignar un valor int a una variable long). Pero al revés no se puede:

                                                   int i=12;
                                                   byte b=i;            //error de compilación
La solución es hacer un cast. Esta operación permite convertir valores de un tipo a otro.

Se usa así:

                                                   int i=12;
                                                   byte b=(byte) i;            //No hay problema por el (cast).

Hay que tener en cuenta en estos cast que si el valor asignado sobrepasa el rango del elemento, el valor convertido no tendrá ningún sentido:

                                                   int i=1200;
                                                   byte b=(byte) i;            //El valor de b no tiene sentido.

Números en Coma Flotante

Los decimales se almacenan en los tipos float y double. Se les llama de coma flotante por como son almacenados por el ordenador. Los decimales no son almacenados de forma exacta por eso siempre hay un posible error. En los decimales de coma flotante se habla, por tanto de precisión. Es mucho más preciso el tipo double que el tipo float.
A un valor literal (como 1.5 por ejemplo), se le puede indicar con una f al final del número que es float (1.5f por ejemplo) o una d para indicar que es double. Si no se indica nada, un número literal siempre se entiende que es double, por lo que al usar tipos float hay que convertir los literales.
Las valores decimales se pueden representar en notación decimal: 1.345E+3 significaría 1.345·103 o lo que es lo mismo 1345.

Booleanos

Los valores booleanos (o lógicos) sirven para indicar si algo es verdadero (true) o falso (false). En C se puede utilizar cualquier valor lógico como si fuera un número; así verdadero es el valor -1 y falso el 0. Eso no es posible en Java.
Si a un valor booleano no se le da un valor inicial, se toma como valor inicial el valor false. Por otro lado, a diferencia del lenguaje C, no se pueden en Java asignar números a una variable booleana (en C, el valor false se asocia al número 0, y cualquier valor distinto de cero se asocia a true).

Caracteres

Los valores de tipo carácter sirven para almacenar símbolos de escritura (en Java se puede almacenar cualquier código Unicode). Los valores Unicode son los que Java utiliza para los caracteres. Ejemplo:

                                     char letra;
                                     letra=’C’;       //Los caracteres van entre comillas
                                     letra=67;        //El código Unicode de la C es el 67. Esta línea
                                                                 //hace lo mismo que la anterior
También hay una serie de caracteres especiales que van precedidos por el símbolo \, son estos:


Otros caracteres especiales tenemos:


Conversión entre tipos (casting)

Hay veces en las que se deseará realizar algo como:

                             int a;byte b=12;
                               a=b;

La duda está en si esto se puede realizar. La respuesta es que sí. Sí porque un dato byte es más pequeño que uno int y Java le convertirá de forma implícita. Sin embargo en:

                            int a=1;
                            byte b;
                              b=a;

El compilador devolverá error aunque el número 1 sea válido para un dato byte. Para ello hay que hacer un casting. Eso significa poner el tipo deseado entre paréntesis delante de la expresión.
                           int a=1;
                           byte b;
                            b= (byte) a;    //No da error

En el siguiente ejemplo:

                           byte n1=100, n2=100, n3;
                            n3= n1 * n2 /100;

Aunque el resultado es 100, y ese resultado es válido para un tipo byte; lo que ocurrirá en realidad es que ocurrirá un error. Eso es debido a que primero multiplica 100 * 100 y como eso da 10000, no  tiene más remedio el compilador que pasarlo a entero y así quedará aunque se vuelva a dividir. La solución correcta sería:

n3 = (byte) (n1 * n2 / 100);


PRÓXIMOS TEMAS A PUBLICAR:

  • TIPOS DE OPERADORES QUE SE UTILIZAN EN LA PROGRAMACIÓN EN JAVA Y OTROS LENGUAJES.
  • EJEMPLOS SIMPLES Y BÁSICOS UTILIZANDO LA CONSOLA DE JAVA-NETBEANS.

jueves, 4 de febrero de 2016

PROGRAMACIÓN ORIENTADA A OBJETOS (POO) EN JAVA NETBEANS

Introducción

En este capitulo de introducción se muestran los orígenes del lenguaje de programación Java, sus principales características y las diferencias con respecto a C++, lenguaje del que hereda gran parte de la sintaxis.

En la segunda parte del capítulo se presenta en Entorno de Desarrollo Integrado Eclipse, los fundamentos para crear proyectos Java utilizando este Entorno y como se puede enriquecer su funcionalidad mediante la instalación de plug-ins.

Característica de Java

Java es un lenguaje de programación orientado a objetos y de propósito general que toma de otros lenguajes de programación algunas ideas fundamentales, en particular toma de Smalltalk el hecho de que los programas Java se ejecutan sobre una máquina virtual . Y del lenguaje de programación C++ toma su sintaxis.

El uso de la máquina virtual garantiza la independencia de la plataforma en Java. Si disponemos de una máquina virtual para nuestra plataforma, podremos ejecutar el mismo programa escrito en Java sin necesidad de volverlo a compilar.

En el proceso de compilación de un programa en Java, se genera un código intermedio, llamado bytecode, que la maquina virtual interpreta y traduce a llamadas nativas del sistema sobre el que se ejecuta la maquina virtual. As , una maquina virtual para una plataforma Windows 7 de 64 bits, traducir a los bytecodes a código nativo para esta plataforma, y otra maquina virtual para una plataforma Linux de 64 bits traducir a los mismos bytecodes a código nativo para esta otra plataforma. Los bytecodes son los mismos en ambos casos, las maquinas virtuales sobre las que se ejecutan son nativas de la plataforma correspondiente.

Estructuras de Datos en Java

1. Antecedentes

Introducción a la Orientación a Objetos: 

La programación orientada a objetos (POO) es una nueva manera de enfocar la programación. Desde sus comienzos, la programación ha estado gobernada por varias metodologías. En cada punto crítico de la evolución de la programación se creaba un nuevo enfoque para ayudar al programador a manejar programas cada vez más complejos. Los primeros programas se crearon mediante un proceso de cambio de los conmutadores del panel frontal de la computadora. Obviamente, este enfoque solo es adecuado para programas pequeños. A continuación se invento el lenguaje ensamblador que permitió escribir programas más largos. El siguiente avance ocurrió en los años 50 cuando se invento el primer lenguaje de alto nivel (FORTRAN).

Mediante un lenguaje de alto nivel, un programador estaba capacitado para escribir programas que tuvieran una longitud de varios miles de líneas. Sin embargo, el método de programación usado en el comienzo era un enfoque adhoc que no solucionaba mucho. Mientras que esto esta bien para programas relativamente cortos, se convierte en “código espagueti” ilegible y difícil de tratar cuando se aplica a programas más largos. La eliminación del código espagueti se consiguió con la creación de los lenguajes de programación estructurados en los años sesenta. Estos lenguajes incluyen ALGOL y PASCAL. En definitiva, C es un lenguaje estructurado, y casi todos los tipos de programas que se han estado haciendo se podrían llamar programas estructurados.

Los programas estructurados se basan en estructuras de control bien definidas, bloques de código, la ausencia del GOTO, y subrutinas independientes que soportan recursividad y variables locales. La esencia de la programación estructurada es la reducción de un programa a sus elementos constitutivos. Mediante la programación estructurada un programador medio puede crear y mantener programas de una longitud superior a 50,000 líneas.

Aunque la programación estructurada nos ha llevado a excelentes resultados cuando se ha aplicado a programas moderadamente complejos, llega a fallar en algún punto cuando el programa alcanza un cierto tamaño. Para poder escribir programas de mayor complejidad se necesitaba de un nuevo enfoque en la tarea de programación. A partir de este punto nace la programación orientada a objetos (POO). La POO toma las mejores ideas incorporadas en la programación estructurada y las combina con nuevos y potentes conceptos que permiten organizar los programas de forma más efectiva. La POO permite descomponer un problema en subgrupos relacionados. Cada subgrupo pasa a ser un objeto autocontenido que contiene sus propias instrucciones y datos que le relacionan con ese objeto. De esta manera, la complejidad se reduce y el programador puede tratar programas más largos.

Todos los lenguajes de POO comparten tres características: encapsulación, polimorfismo y herencia.

Encapsulación.

La encapsulación es el mecanismo que agrupa el código y los datos que maneja y los mantiene protegidos frente a cualquier interferencia y mal uso. En un lenguaje orientado a objetos, el código y los datos suelen empaquetarse de la misma forma en que se crea una “caja negra” autocontenida. Dentro de la caja son necesarios tanto el código como los datos. Cuando el código y los datos están enlazados de esta manera, se ha creado un objeto. En otras palabras, un objeto es el dispositivo que soporta encapsulación.
En un objeto, los datos y el código, o ambos, pueden ser privados para ese objeto o públicos. Los datos o el código privado solo los conoce o son accesibles por otra parte del objeto. Es decir, una parte del programa que esta fuera del objeto no puede acceder al código o a los datos privados. Cuando los datos o el código son públicos, otras partes del programa pueden acceder a ellos, incluso aunque este definido dentro de un objeto. Normalmente, las partes públicas de un objeto se utilizan para proporcionar una interfaz controlada a las partes privadas del objeto.
Para todos los propósitos, un objeto es una variable de un tipo definido por el usuario. Puede parecer extraño que un objeto que enlaza código y datos se pueda contemplar como una variable. Sin embargo, en programación orientada a objetos, este es precisamente el caso. Cada vez que se define un nuevo objeto, se esta creando un nuevo tipo de dato. Cada instancia específica de este tipo de dato es una variable compuesta.

Polimorfismo.

Polimorfismo (del Griego, cuyo significado es “muchas formas”) es la cualidad que permite que un nombre se utilice para dos o más propósitos relacionados pero técnicamente diferentes. El propósito del polimorfismo aplicado a la POO es permitir poder usar un nombre para especificar una clase general de acciones. Dentro de una clase general de acciones, la acción específica a aplicar está determinada por el tipo de dato. Por ejemplo, en C, que no se basa significativamente en el polimorfismo, la acción de valor absoluto requiere tres funciones distintas: abs(), labs() y fabs(). Estas tres funciones calculan y devuelven el valor absoluto de un entero, un entero largo y un valor real, respectivamente. Sin embargo, en C++, que incorpora polimorfismo, a cada función se puede llamar abs().
El tipo de datos utilizado para llamar a la función determina que versión específica de la función se esta usando, es decir, es posible usar un nombre de función para propósitos muy diferentes. Esto se llama sobrecarga de funciones.
De manera general, el concepto de polimorfismo es la idea de “una interfaz, múltiples métodos”. Esto significa que es posible diseñar una interfaz genérica para un grupo de actividades relacionadas. Sin embargo, la acción específica ejecutada depende de los datos. La ventaja del polimorfismo es que ayuda a reducir la complejidad permitiendo que la misma interfaz se utilice para especificar una clase general de acción. Es trabajo del compilador seleccionar la acción específica que se aplica a cada situación. El programador no necesita hacer esta selección manualmente, solo necesita recordar y utilizar la interfaz general.
El polimorfismo se puede aplicar tanto a funciones como a operadores, prácticamente todos los lenguajes de programación contienen una aplicación limitada de polimorfismo cuando se relaciona con los operadores aritméticos, por ejemplo, en C, el signo + se utiliza par añadir enteros, enteros largos, caracteres y valores reales. En estos casos, el compilador automáticamente sabe que tipo de aritmética debe aplicar, en C++, se puede ampliar este concepto a otros tipos de datos que se definan, este tipo de polimorfismo se llama sobrecarga de operadores.

Herencia.

La herencia es el proceso mediante el cual un objeto puede adquirir las propiedades de otro. Mas en concreto, un objeto puede heredar un conjunto general de propiedades a alas que puede añadir aquellas características que son específicamente suyas. La herencia es importante porque permite que un objeto soporte el concepto de clasificación jerárquica. Mucha información se hace manejable gracias a esta clasificación, por ejemplo, la descripción de una casa. Una casa es parte de una clase general llamada edificio, a su vez, edificio es una parte de la clase mas general estructura, que es parte de la clase aun más general de objetos que se puede llamar obra-hombre.
En cualquier caso, la clase hija hereda todas las cualidades asociadas con la clase padre y le añade sus propias características definitorias. Sin el uso de clasificaciones ordenadas, cada objeto tendría que definir todas las características que se relacionan con él explícitamente.
Sin embargo, mediante el uso de la herencia, es posible describir un objeto estableciendo la clase general (o clases) a las que pertenece, junto con aquellas características específicas que le hacen único.

Tipos de Datos Abstractos

Abstracción: consiste en ignorar los detalles de la manera particular en que está hecha una cosa, quedándonos solamente con su visión general. Tipo de Dato Abstracto (TDA) se define como un conjunto de valores que pueden tomar los datos de ese tipo, junto a las operaciones que los manipulan.
Un TDA es un modelo matemático de estructuras de datos que especifican los tipos de datos almacenados, las operaciones definidas sobre esos datos y los tipos de parámetros de esas operaciones.
                                         TAD = Valores (tipo de dato) + operaciones

Un TDA define lo que cada operación debe hacer, más no como la debe hacer. En un lenguaje de programación como Java un TDA puede ser expresado como una interface, que es una simple lista de declaraciones de métodos.
Un TDA es materializado por una estructura de datos concreta, en Java, es modelada por una clase. Una clase define los datos que serán almacenados y las operaciones soportadas por los objetos que son instancia de la clase. Al contrario de las interfaces, las clases especifican como las operaciones son ejecutadas (implementación).
Ejemplos de tipos de datos abstractos son las Listas, Pilas, Colas, etc., que se discutirán más adelante.

Estructuras de Datos

En programación, una estructura de datos es una forma de organizar un conjunto de datos elementales (un dato elemental es la mínima información que se tiene en el sistema) con el objetivo de facilitar la manipulación de estos datos como un todo y/o individualmente.
Una estructura de datos define la organización e interrelacionamiento de estos, y un conjunto de operaciones que se pueden realizar sobre él. Las operaciones básicas son:
 Alta, adicionar un nuevo valor a la estructura.
 Baja, borrar un valor de la estructura.
 Búsqueda, encontrar un determinado valor en la estructura para se realizar una operación con este valor, en forma SECUENCIAL o BINARIO (siempre y cuando los datos estén ordenados).
Otras operaciones que se pueden realizar son:
 Ordenamiento, de los elementos pertenecientes a la estructura.
 Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas.

Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como las frecuencias y el orden en que se realiza cada operación sobre los datos.

Algunas estructuras de datos utilizadas en programación son:

 Arrays (Arreglos)
o Vectores
o Matrices
 Listas Enlazadas
o Listas simples
o Listas dobles
o Listas Circulares
 Pilas
 Colas
 Árboles
o Árboles binarios
o Árboles Multicamino
 Conjuntos
 Grafos
 Montículos

Acceso directo y secuencial a los datos

 Secuencial. Para acceder a un objeto se debe acceder a los objetos almacenados previamente en el archivo. El acceso secuencial exige elemento a elemento, es necesario una exploración secuencial comenzando desde el primer elemento.

 Directo o Aleatorio. Se accede directamente al objeto, sin recorrer los anteriores. El acceso directo permite procesar o acceder a un elemento determinado haciendo una referencia directamente por su posición en el soporte de almacenamiento.



LA PROGRAMACIÓN Y LOS ALGORITMOS

¿Que es un algoritmo?..

Un algoritmo es una sucesión de pasos ordenados lógicamente para llegar a un resultado correcto y dar solución a un determinado problema.

 Para entender mejor un algoritmo es necesario entenderlo en pseudocodigo.

  El Pseudo-código

Las características del este pseudolenguaje fueron propuestas en 2001 por el responsable de la asignatura Fundamentos de Programación (Horacio Loyarte) de la carrera de Ingeniería Informática de la FICH-UNL.
 Las premisas son:
-.Sintaxis sencilla.
-.Manejo de las estructuras básicas de control.
 -.Solo 3 tipos de datos básicos: numérico, carácter /cadenas de caracteres y lógico (verdadero-falso). -.Estructuras de datos: arreglos.

Forma General de un Algoritmo en Pseudocódigo

Todo algoritmo en pseudocódigo tiene la siguiente estructura general:

INICIO O ENTRADA DE DATOS
 . 
 . 
    PROCESO : (Los datos ingresados son procesados 
para luego convertirse en información.)
 .
 .
 SALIDA DE INFORMACIÓN 

En otros libros o programas pueden encontrar la siguiente estructura:

Proceso SinTitulo
          acción 1;
          acción 1;
               .
               .
               .
          acción n;
     FinProceso

 Ejemplo:

El ejemplo más simple es hacer una Suma, que muestra un pequeño algoritmo para sumar dos números y mostrar el resultado, sirve como ejemplo para observar la estructura básica de un programa. Además de la sintaxis obligatoria, se incluyen comentarios que ayudan a entender el código, y se separan claramente sus tres partes: carga de datos, cálculo, y presentación del resultado.

// este es el ejemplo más simple de esta ayuda, 
// toma dos numeros, los suma y muestra el resultado

Proceso Suma

Definir A,B,C como Reales;

    // para cargar un dato, se le muestra un mensaje al usuario
    // con la instrucción Escribir, y luego se lee el dato en 
    // una variable (A para el primero, B para el segundo) con 
    // la instrucción Leer

    Escribir "Ingrese el primer numero:";
    Leer A;

    Escribir "Ingrese el segundo numero:";
    Leer B;


    // ahora se calcula la suma y se guarda el resultado en la
    // variable C mediante la asignación (<-)
   
    C <- A+B;


    // finalmente, se muestra el resultado, precedido de un 
    // mensaje para avisar al usuario, todo en una sola
    // instrucción Escribir
   
    Escribir "El resultado es: ",C;

FinProceso


 Variables 

Una variable en un algoritmo computacional es una posición de memoria donde se puede almacenar información. 
Por ejemplo, si un programa debe obtener el área de un triángulo, seguramente la base del mismo y su altura se carguen en memoria en dos variables para poder realizar el cálculo.
 El resultado, probablemente también se asigne en una variable luego del cálculo para luego informarlo al usuario. 
Como su nombre lo indica, el valor almacenado en una variable puede ir variando a medida que el programa avanza. 
En un pseudocódigo el concepto es similar. 
Una variable representa un lugar donde guardar cierta información.
 En un algoritmo o programa se hace referencia a una variable mediante un identificador (el nombre de la variable). 
Un identificador debe comenzar con letras, y puede contener solo letras, números y el guión bajo. 
No puede contener ni espacios ni operadores, ni coincidir con una palabra reservada o función del lenguaje, para no generar ambigüedad. 

Ejemplos de identificadores válidos son: A, B, C, Lado1, Total, Nombre_y_Apellido, DireccionCorreo, ... 

En la mayoría de los lenguajes reales los nombres de variables no pueden contener acentos, ni diéresis, ni eñes. 
En algunos lenguajes se puede guardar cualquier información en cualquier variable, mientras en otros las variables solo pueden guardar cierto tipo de información.

 Por ejemplo, si una variable se utiliza para guardar números, no puede utilizarse luego para guardar texto. Este tipo se puede declarar explícitamente con la palabra clave adecuada dependiendo del lenguaje de programación que se este utilizando, o se puede dejar que el intérprete intente deducirlo a partir de los datos que se guardan en la misma y la forma en que se la utiliza en el algoritmo.

 Tipos de Datos Tipos Simples: Numérico, Lógico, Carácter.

Estructuras de Datos: Arreglos.

Definición explícita de variables. 

La instrucción definir permite explicitar el tipo de una o más variables. Esta definición puede ser opcional u obligatoria dependiendo del tipo de lenguaje en el que se este programando.

Una variable debe definirse antes de ser utilizada por primera vez. Los arreglos, se definen utilizando su identificador (sin subíndices ni dimensiones) antes o después de dimensionarlos, y el tipo aplica para todos los elementos del mismo (ya que se trata de una estructura de datos homogénea).

    Los tipos posibles son NUMERO, NUMERICO, REAL, ENTERO, LOGICO, CARACTER, TEXTO, CADENA.

NUMERO, NUMERICO y REAL son sinónimos para el tipo de datos numérico básico, que puede almacenar tanto números reales como enteros. El tipo ENTERO es una especialización que sólo permite almacenar valores enteros; cualquier valor no entero que se lea o asigne en una variable de este tipo será truncado.

    Una variable de tipo LOGICO sólo puede tomar los valores VERDADERO y FALSO, pero cuando se lee una variable ya definida como lógica, el usuario puede ingresar también las abreviaciones V y F, o 0 y 1.

    CARACTER, TEXTO y CADENA son sinónimos para definir variables de tipo carácter. Estas pueden contener cero, uno o más caracteres arbitrarios y no tienen una longitud máxima. Si se declara una variable de este tipo y en una lectura el usuario ingresa un número o un valor lógico, se asignará una cadena que contiene el texto ingresado (ejemplo: "1", "VERDADERO", etc).

Estructuras de Control 

Condicionales

-.Si-Entonces 

-.Selección Múltiple 

Repetitivas

-.Mientras 

-.Repetir 

-.Para

Condicional Si-Entonces 

  La secuencia de instrucciones ejecutadas por la instrucción Si-Entonces-Sino depende del valor de una condición lógica.
      Si <condición> Entonces
            <instrucciones> 
      Sino 
            <instrucciones>
      FinSi 
   Al ejecutarse esta instrucción, se evalúa la condición y se ejecutan las instrucciones que correspondan: las instrucciones que le siguen al Entonces si la condición es verdadera, o las instrucciones que le siguen al Sino si la condición es falsa. La condición debe ser una expresión lógica, que al ser evaluada retorna Verdadero o Falso. 
   La cláusula Entonces debe aparecer siempre, pero la clausula Sino puede no estar. En ese caso, si la condición es falsa no se ejecuta ninguna instrucción y la ejecución del programa continúa con la instrucción siguiente.
 
 El ejemplo Triángulo lee las medidas de los tres lados de un triángulo y utiliza esta estructura para determinar cual es el mayor de los tres, y verificar luego si se trata de un triángulo rectángulo o no.

//    Lee los tres lados de un triangulo rectangulo, determina 
// si corresponden (por Pitargoras) y en caso afirmativo 
// calcula el area

Proceso TrianguloRectangulo


// cargar datos
Definir l1,l2,l3 Como Real;
Escribir "Ingrese el lado 1:";
Leer l1;
Escribir "Ingrese el lado 2:";
Leer l2;
Escribir "Ingrese el lado 3:";
Leer l3;

// encontrar la hipotenusa (mayor lado)
Definir cat1,cat2,hip Como Real;
Si l1>l2 Entonces
cat1<-l2;
Si l1>l3 Entonces
hip<-l1;
cat2<-l3;
Sino
hip<-l3;
cat2<-l1;
FinSi
Sino
cat1<-l1;
Si l2>l3 Entonces
hip<-l2;
cat2<-l3;
Sino
hip<-l3;
cat2<-l2;
FinSi
FinSi

// ver si cumple con Pitagoras
Si hip^2 = cat1^2 + cat2^2 Entonces
// calcualar area
Definir area como real;
area<-(cat1*cat2)/2;
Escribir "El area es: ",area;
Sino
Escribir "No es un triangulo rectangulo.";
FinSi

FinProceso
 

Selección Múltiple (según)


La secuencia de instrucciones ejecutada por una instrucción Segun depende del valor de una variable numérica.
      Segun <variable> Hacer
            <número1>: <instrucciones>
            <número2>,<número3>: <instrucciones>
            <...>
            De Otro Modo: <instrucciones>
      FinSegun

   Esta instrucción permite ejecutar opcionalmente varias acciones posibles, dependiendo del valor almacenado en una variable de tipo numérico. Al ejecutarse, se evalúa el contenido de la variable y se ejecuta la secuencia de instrucciones asociada con dicho valor.
   Cada opción está formada por uno o más números separados por comas, dos puntos y una secuencia de instrucciones. Si una opción incluye varios números, la secuencia de instrucciones asociada se debe ejecutar cuando el valor de la variable es uno de esos números.
   Opcionalmente, se puede agregar una opción final, denominada De Otro Modo, cuya secuencia de instrucciones asociada se ejecutará sólo si el valor almacenado en la variable no coincide con ninguna de las opciones anteriores.

   El ejemplo Menú muestra un programa muy simple que utiliza esta estructura de control para elegir que salida mostrar en pantalla de acuerdo a qué opción el usuario selecciona mediante un menú.

// Muestra como hacer un menú simple con las estructuras Repetir-Hasta Que y Según

Proceso sin_titulo
Definir OP Como Entero;
Repetir
// mostrar menu
Limpiar Pantalla;
Escribir "Menú de recomendaciones";
Escribir "   1. Literatura";
Escribir "   2. Cine";
Escribir "   3. Música";
Escribir "   4. Videojuegos";
Escribir "   5. Salir";
// ingresar una opcion
Escribir "Elija una opción (1-5): ";
Leer OP;
// procesar esa opción
Segun OP Hacer
1:
Escribir "Lecturas recomendables:";
Escribir " + Esperándolo a Tito y otros cuentos de fúbol (Eduardo Sacheri)";
Escribir " + El juego de Ender (Orson Scott Card)";
Escribir " + El sueño de los héroes (Adolfo Bioy Casares)";
2:
Escribir "Películas recomendables:";
Escribir " + Matrix (1999)";
Escribir " + El último samuray (2003)";
Escribir " + Cars (2006)";
3:
Escribir "Discos recomendables:";
Escribir " + Despedazado por mil partes (La Renga, 1996)";
Escribir " + Búfalo (La Mississippi, 2008)";
Escribir " + Gaia (Mägo de Oz, 2003)";
4:
Escribir "Videojuegos clásicos recomendables";
Escribir " + Día del tentáculo (LucasArts, 1993)";
Escribir " + Terminal Velocity (Terminal Reality/3D Realms, 1995)";
Escribir " + Death Rally (Remedy/Apogee, 1996)";
5:
Escribir "Gracias, vuelva prontos";
De otro modo:
Escribir "Opción no válida";
FinSegun
Escribir "Presione enter para continuar";
Esperar Tecla;
Hasta Que OP=5
FinProceso

Estructuras de Control Repetitivas 

-.Lazos Mientras 



  La instrucción Mientras ejecuta una secuencia de instrucciones mientras una condición sea verdadera.

      Mientras <condición> Hacer

            <instrucciones>

      FinMientras

Al ejecutarse esta instrucción, la condición es evaluada. Si la condición resulta verdadera, se ejecuta una vez la secuencia de instrucciones que forman el cuerpo del ciclo. Al finalizar la ejecución del cuerpo del ciclo se vuelve a evaluar la condición y, si es verdadera, la ejecución se repite. Estos pasos se repiten mientras la condición sea verdadera.
   Note que las instrucciones del cuerpo del ciclo pueden no ejecutarse nunca, si al evaluar por primera vez la condición resulta ser falsa.
   Si la condición siempre es verdadera, al ejecutar esta instrucción se produce un ciclo infinito. A fin de evitarlo, las instrucciones del cuerpo del ciclo deben contener alguna instrucción que modifique la o las variables involucradas en la condición, de modo que ésta sea falsificada en algún momento y así finalice la ejecución del ciclo.


   El ejemplo Adivina Número le da al usuario 10 intentos para adivinar un número generado aleatoriamente, utilizando esta estructura para verificar si el usuario acierta el número o si se agotan los intentos.

// Juego simple que pide al usuario que adivine un numero en 10 intentos

Proceso Adivina_Numero

Definir intentos,num_secreto,num_ingresado Como Entero;
intentos<-10;
num_secreto <- azar(100)+1;

Escribir "Adivine el numero (de 1 a 100):";
Leer num_ingresado;
Mientras num_secreto<>num_ingresado Y intentos>1 Hacer
Si num_secreto>num_ingresado Entonces
Escribir "Muy bajo";
Sino
Escribir "Muy alto";
FinSi
intentos <- intentos-1;
Escribir "Le quedan ",intentos," intentos:";
Leer num_ingresado;
FinMientras

Si num_secreto=num_ingresado Entonces
Escribir "Exacto! Usted adivino en ",11-intentos," intentos.";
Sino
Escribir "El numero era: ",num_secreto;
FinSi

FinProceso

-.Lazos Repetir


La instrucción Repetir-Hasta Que ejecuta una secuencia de instrucciones hasta que la condición sea verdadera.

      Repetir 

            <instrucciones> 

      Hasta Que <condición> 

   Al ejecutarse esta instrucción, la secuencia de instrucciones que forma el cuerpo del ciclo se ejecuta una vez y luego se evalúa la condición. Si la condición es falsa, el cuerpo del ciclo se ejecuta nuevamente y se vuelve a evaluar la condición. Esto se repite hasta que la condición sea verdadera. 

   Note que, dado que la condición se evalúa al final, las instrucciones del cuerpo del ciclo serán ejecutadas al menos una vez. 

   Además, a fin de evitar ciclos infinitos, el cuerpo del ciclo debe contener alguna instrucción que modifique la o las variables involucradas en la condición de modo que en algún momento la condición sea verdadera y se finalice la ejecución del ciclo.

El ejemplo Menú muestra un programa muy simple que utiliza esta estructura de control para mostrar un menú repetidamente hasta que el usuario seleccione la opción para salir.

// Muestra como hacer un menú simple con las estructuras Repetir-Hasta Que y Según

Proceso sin_titulo
Definir OP Como Entero;
Repetir
// mostrar menu
Limpiar Pantalla;
Escribir "Menú de recomendaciones";
Escribir "   1. Literatura";
Escribir "   2. Cine";
Escribir "   3. Música";
Escribir "   4. Videojuegos";
Escribir "   5. Salir";
// ingresar una opcion
Escribir "Elija una opción (1-5): ";
Leer OP;
// procesar esa opción
Segun OP Hacer
1:
Escribir "Lecturas recomendables:";
Escribir " + Esperándolo a Tito y otros cuentos de fúbol (Eduardo Sacheri)";
Escribir " + El juego de Ender (Orson Scott Card)";
Escribir " + El sueño de los héroes (Adolfo Bioy Casares)";
2:
Escribir "Películas recomendables:";
Escribir " + Matrix (1999)";
Escribir " + El último samuray (2003)";
Escribir " + Cars (2006)";
3:
Escribir "Discos recomendables:";
Escribir " + Despedazado por mil partes (La Renga, 1996)";
Escribir " + Búfalo (La Mississippi, 2008)";
Escribir " + Gaia (Mägo de Oz, 2003)";
4:
Escribir "Videojuegos clásicos recomendables";
Escribir " + Día del tentáculo (LucasArts, 1993)";
Escribir " + Terminal Velocity (Terminal Reality/3D Realms, 1995)";
Escribir " + Death Rally (Remedy/Apogee, 1996)";
5:
Escribir "Gracias, vuelva prontos";
De otro modo:
Escribir "Opción no válida";
FinSegun
Escribir "Presione enter para continuar";
Esperar Tecla;
Hasta Que OP=5
FinProceso


-.Lazos Para


La instrucción Para ejecuta una secuencia de instrucciones un número determinado de veces. 

      Para <variable> <- <inicial> Hasta <final> Con Paso <paso> Hacer 
            <instrucciones> 
      FinPara 

   Al ingresar al bloque, la variable <variable> recibe el valor <inicial> y se ejecuta la secuencia de instrucciones que forma el cuerpo del ciclo. Luego se incrementa la variable <variable> en <paso> unidades y se evalúa si el valor almacenado en <variable> superó al valor <final>. Si esto es falso se repite hasta que <variable> supere a <final>. Si se omite la cláusula Con Paso <paso>, la variable <variable> se incrementará en 1.

La primer variante consiste en reemplazar el operador de asignación por la palabra clave Desde:
      Para <variable> Desde <inicial> Hasta <final> Con Paso <paso> Hacer ... 
De esta forma, la lectura de la sentencia resulta más obvia. Además, con sintaxis flexible, si no se especifica el paso pero el valor final es menor al inicial, el bucle recorrerá los valores en orden inverso como si el paso fuera -1. La segunda variante solo sirve para recorrer arreglos de una o más dimensiones. Se introduce con la construcción Para Cada seguida de un identificador, la palabra clave De y otro identificador:
      Para Cada <elemento> De <Arreglo> Hacer ... 
El segundo identificador debe corresponder a un arreglo. El primero será el que irá variando en cada iteración. El ciclo realizará tantas iteraciones como elementos contenga el arreglo y en cada uno el primer identificador servirá para referirse al elemento del arreglo en cuestión.

   El ejemplo Promedio utiliza un bucle de este tipo para leer N valores numéricos con los cuales calcula un promedio.

// Calcula el promedio de una lista de N datos

Proceso Promedio

Definir i,N como Entero;
Definir acum,dato,prom como Reales;
Escribir "Ingrese la cantidad de datos:";
Leer n;
acum<-0;
Para i<-1 Hasta n Hacer
Escribir "Ingrese el dato ",i,":";
Leer dato;
acum<-acum+dato;
FinPara
prom<-acum/n;
Escribir "El promedio es: ",prom;
FinProceso


   El ejemplo Para utiliza las tres variantes de este tipo de bucles para recorrer un arreglo.

// Para poder ejecutar correctamente este ejemplo debe tener
// habilitada la sintaxis flexible en su perfil de lenguaje

Proceso sin_titulo


Definir A,i,elemento Como Enteros;
// declara un arreglo de 10 elementos
Dimension A[10];
// recorre los 10 elementos y va asignandoles enteros aleatorios
para cada elemento de A Hacer
// elemento toma el contenido de cada posicion del arreglo
// y si se modifica elemento se modifica el arreglo
elemento <- azar(100);
FinPara
Escribir "Los elementos del arreglo son:";
// recorre los 10 elementos utilizando subindices y los muestra en pantalla
para i desde 0 hasta 9 Hacer
escribir "Posición " i ": " A[i];
FinPara
Escribir ""; // deja una linea en blanco
Escribir "En orden inverso:";
// recorre los 10 elementos en orden inverso y los muestra en una misma linea
para i desde 9 hasta 0 Hacer
escribir sin bajar A[i] " ";
FinPara
FinProceso
  

NOTAS IMPORTANTES

*Los comentarios o explicaciones son los que están después de los slash ( // ).
*Luego estaremos añadiendo informacion pero ya en un lenguaje de programación especifico en este caso java.
* Tambien estaremos conociendo informacion basica de como programar en Visual Studio.