Está en la página 1de 71

Universidad Tecnológica de Tabasco

División de Tecnologías de la Información y Comunicaciones

Manual de la Asignatura de

PR O G R A M A C I ÓN

Objetivo de la Asignatura:
El alumno será capaz de generar una aplicación utilizando el paradigma de orientación a objetos en
un lenguaje de programación para la solución de un problema específico; aplicando buenas prácticas
de programación.

Competencia de la Asignatura:
Implementar aplicaciones de software mediante técnicas de programación y considerando los
requerimientos de la organización para eficientar sus procesos.
U nidadI
Fundamentos de Programación Orientada a Objetos

Objetivo de la Unidad:
El alumno identificará los fundamentos de la programación orientada a objetos para abstraer los
elementos de un escenario.

1.1 Fundamentos de la Programación Orientada a Objetos


Definición de Paradigma
Cada uno de los esquemas formales en que se organizan las palabras nominales y verbales para sus respectivas
flexiones. En el ámbito de la programación paradigma es una técnica de programación.
Paradigma de la Programación Orientada a Objetos
Es un modelo de programación cuya idea principal es mediante descomponer un problema en entidades de
software llamadas objetos. La Programación Orientada a Objetos trata de aproximar la programación a la vida
real.

La POO se centra en la interrelación que existe entre los datos y las acciones.
El paradigma de la orientación a objetos es una forma nueva y diferente de pensar acerca de programar.
Muchas personas tienen problemas al comienzo para saber cómo enfocar un proyecto orientado a objetos.
Una vez que se sabe que todo se supone es un objeto, y tanto como se aprenda a pensar más en un estilo
orientado a objetos se puede comenzar a crear “buenos” diseños que tomen ventaja de todos los beneficios
que la POO puede ofrecer.
Características del POO
1. Identidad: Los datos están cuantificados en entidades discretas y distinguibles llamadas objetos
2. Clasificación: Significa que los objetos con la misma estructura de datos (atributos) y comportamiento
(operaciones) se agrupa para formar una clase
3. Polimorfismo: Significa que una misma operación puede comportarse de modos distintos en distintas
clases
4. Herencia: Compartir atributos y operaciones entre clases tomando como base una relación jerárquica
Definiciones:

• Objeto: En informática, un OBJETO es un conjunto de variables y de los métodos relacionados con esas
variables.
Un poco más sencillo: un objeto contiene en sí mismo la información y los métodos o funciones necesarios
para manipular esa información.
Lo más importante de los objetos es que permiten tener un control total sobre 'quién' o 'qué' puede
acceder a sus miembros, es decir, los objetos pueden tener miembros públicos a los que podrán acceder
otros objetos o miembros privados a los que sólo puede acceder él. Estos miembros pueden ser tanto
variables como funciones.
El gran beneficio de todo esto es la encapsulación, el código fuente de un objeto puede escribirse y
mantenerse de forma independiente a los otros objetos contenidos en la aplicación.

• Clase: Una CLASE es un proyecto, o prototipo, que define las variables y los métodos comunes a un cierto
tipo de objetos
Un poco más sencillo: las clases son las matrices de las que luego se pueden crear múltiples objetos del
mismo tipo. La clase define las variables y los métodos comunes a los objetos de ese tipo, pero luego,
cada objeto tendrá sus propios valores y compartirán las mismas funciones.
Primero deberemos crear una clase antes de poder crear objetos o ejemplares de esa clase.

• Métodos: Son las responsabilidades que debe cumplir la clase. El objetivo de un método es ejecutar las
actividades que tiene encomendada la clase
Es un algoritmo (conjunto de operaciones) que se ejecuta en respuesta a un mensaje; respuestas a
mensajes para satisfacer peticiones.
Un método consiste en el nombre de la operación y sus argumentos. El nombre del método identifica una
operación que se ejecuta.
Un método está determinado por la clase del objeto receptor, todos los objetos de una clase usan el
mismo método en respuesta a mensajes similares.
La interpretación de un mensaje (selección del método ejecutado) depende del receptor y puede variar
con distintos receptores, es decir, puede variar de una clase a otra.

• Atributos: Son las características, cualidades distintivas de cada objeto. Deben ser mínimos para poder
realizar todas las operaciones que requiere la aplicación Ejemplos de objetos del mundo real: 1. CASA
 Atributos: tamaño, precio, cantidad de habitaciones, etc.
 Métodos: comodidad, seguridad, etc.
2. MESA
 Atributos: altura, largo, ancho, etc.
 Métodos: contener elementos.
3. VENTANA:
 Atributos: tamaño, color, etc.
 Métodos: abrirse, cerrarse, etc.

1.2 Características de la Programación Orientada a Objetos


Abstracción: Consiste en captar las características esenciales de un objeto, así como su comportamiento. Por
ejemplo si tomamos a los automóviles, ¿Qué características se pueden abstraer de los automóviles? O lo que
es lo mismo ¿Qué características semejantes tienen todos los automóviles?
Todos tendrán una marca, un modelo, número de chasis, peso, llantas, puertas, ventanas, etc.
Y en cuanto a su comportamiento todos los automóviles podrán acelerar, frenar, retroceder, etc.
En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el
mecanismo por el cual se gestionan las abstracciones.
Herencia: Es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase
puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase
padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los
atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia. Por
ejemplo, imagine que se está haciendo el análisis de un Sistema para una tienda que vende y repara equipos
celulares.
En el gráfico se muestran dos Clases más que posiblemente se necesiten para crear el Sistema. Esas dos Clases
nuevas se construirán a partir de la Clase Celular existente. De esa forma se utilizará el comportamiento de la
Superclase.
En general, se puede tener una gran jerarquía de Clases tal y como se muestra en el siguiente gráfico:

Encapsulamiento: Consiste en unir en la Clase las características y comportamientos, esto es, las variables y
métodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es
evidente que el encapsulamiento se logra gracias a la abstracción y el ocultamiento.
La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que se tendrá a las Clases
como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es
conveniente porque lo que interesa es conocer qué hace la Clase, pero no será necesario saber cómo lo hace.
Polimorfismo: Es una nueva característica aportada por la POO. Esta propiedad indica la posibilidad de definir
varias operaciones con el mismo nombre, diferenciándolas únicamente en los parámetros de entrada.
Dependiendo del objeto que se introduzca como parámetro de entrada, se elegirá automáticamente cuál de
las operaciones se va a realizar.
Por ejemplo, ya se está habituado al operador <<suma>> que está presente en todos los lenguajes de
programación. Sin embargo, los operadores <<suma de fracciones>> y <<suma de números complejos>> no
existen en casi ningún lenguaje de programación.
Los lenguajes POO permiten definir un operador <<suma>> tal que reconozca que tipo de objeto se le está
aplicando, a través de operaciones de objetos. Previamente deberá definir la fracción y el número complejo
como una clase y la operación suma como una operación de una clase.
Definiendo adecuadamente las operaciones suma de fracciones y suma de números imaginarios, el operador
suma devolverá, en el caso que los operandos sean fracciones, una fracción y , en el caso de los números
imaginarios, otros número imaginario.
Es posible extender el concepto e incluso definir operaciones como suma de bases de datos:
U n i d a d II
Ambiente de desarrollo de la POO

Objetivo de la Unidad:
El alumno operará las funciones principales de un entorno de desarrollo previamente seleccionado,
para ejecutar una aplicación.

2.1 Generalidades de la Herramienta de Desarrollo


Un entorno de desarrollo integrado o en inglés Integrated Development Environment ('IDE') es un programa
compuesto por un conjunto de herramientas para un programador.
Puede dedicarse en exclusiva a un sólo lenguaje de programación o bien, poder utilizarse para varios. Un IDE
es un entorno de programación que ha sido empaquetado como un programa de aplicación, es decir, consiste
en un editor de código, un compilador, un depurador y un constructor de interfaz gráfica GUI.
Los IDEs pueden ser aplicaciones por si solas o pueden ser parte de aplicaciones existentes. El lenguaje Visual
Basic por ejemplo puede ser usado dentro de las aplicaciones de Microsoft Office, lo que hace posible escribir
sentencias Visual Basic en forma de macros para Microsoft Word.
Los IDEs proveen un marco de trabajo amigable para la mayoría de los lenguajes de programación tales como
C++, Java, C#, Visual Basic, Object Pascal, Velneo, etc. En algunos lenguajes, un IDE puede funcionar como un
sistema en tiempo de ejecución, en donde se permite utilizar el lenguaje de programación en forma
interactiva, sin necesidad de trabajo orientado a archivos de texto, como es el caso de Smalltalk u Objective-
C.
Es posible que un mismo IDE pueda funcionar con varios lenguajes de programación. Este es el caso de
Eclipse, que mediante pluggins se le puede añadir soporte de lenguajes adicionales

2.2 Características de la Interfaz de desarrollo


El entorno de desarrollo Eclipse
Eclipse es una plataforma de desarrollo open source basada en Java. Es un desarrollo de IBM cuyo código
fuente fue puesto a disposición de los usuarios. En sí mismo Eclipse es un marco y un conjunto de servicios
para construir un entorno de desarrollo a partir de componentes conectados (plug-in).
Hay plug-ins para el desarrollo de Java (JDT Java Development Tools) así como para el desarrollo en C/C++,
COBOL, etc. La versión instalada en el laboratorio incluye el plug-in JDT.
Trabajando con Eclipse
Al ejecutar Eclipse aparece una ventana como la mostrada en la figura.

Eclipse contiene una serie de perspectivas. Cada perspectiva proporciona una serie de funcionalidades para el
desarrollo de un tipo específico de tarea. Por ejemplo la perspectiva Java combina un conjunto de views que
permiten ver información útil cuando se está escribiendo código fuente, mientras que la perspectiva de
depuración contiene vistas que muestran información útil para la depuración de los programas Java. La barra
de herramientas vertical (en la parte izquierda) muestra las perspectivas abiertas y permite pulsando sobre
ellas cambiar de una a otra. La perspectiva activa se muestra en la barra del título en la parte superior de la
ventana.
Creación de un proyecto
Eclipse permite organizar los ficheros en forma de proyecto. Para crear un proyecto Java procederemos del
siguiente modo:
1. Seleccionando en el menú File -> New -> Project o pulsando con el botón derecho del ratón sobre la vista
Navigator en la perspectiva Resource y seleccionando New -> Project .
2. Aparece una ventana en la que se puede seleccionar el tipo de proyecto. En este caso se pulsa sobre Java
en la parte izquierda y Java project en la derecha. Pulsar sobre el botón Next.

3. A continuación se piden los datos sobre el proyecto (nombre y ruta donde se almacenarán los ficheros
asociados al proyecto). Una vez introducidos se pulsa sobre Finish.
4. Eclipse abre automáticamente la perspectiva Java cuando se crea un proyecto Java. Se crea el directorio
especificado con dos ficheros .project y .classpath que contienen información sobre el proyecto. La vista
Navigator de la perspectiva Resource y la vista Package Explorer de la perspectiva Java contienen un
directorio con el nombre del proyecto. Como se comentó anteriormente, se puede pasar de una
perspectiva a otra pulsando sobre los botones de la barra vertical izquierda. Código generado utilizando
el asistente
/*
* Created on
* To change the template forthis generated file goto
* Window>Preferences>Java>Code Generation>Code and Comments
*/
/** Clase *
@author
* Descripcion:
*/
public clas s HolaMundo { public static void main (
String [ ] args ) { }
}

5. Hay una perspectiva más asociada con Java, se puede abrir del siguiente modo: Window -> Open
perspective -> Java browsing. En esta perspectiva aparecen views correspondientes al proyecto, a
paquetes, a clases e interfaces y a los miembros de estas.
Creando clases.
Las clases se pueden crear de dos formas diferentes:
Utilizando un asistente. Pulsamos con el botón derecho sobre el proyecto -> New -> Class .
Aparece una ventana como la que se muestra en la figura. Los campos que nos interesan por ahora son: el
nombre de la clase, el modificador, y si queremos que esta clase tenga un método main(String[] args). Al pulsar
sobre Finish (con los datos que se muestran en la figura se crea un fichero HolaMundo.java con el código
mostrado en el listado (no será exactamente así ya que yo he personalizado el comentario que aparece). Si
exploramos el contenido del directorio c:\tmp\prac1 vemos que además del fichero HolaMundo.java hay otro
fichero HolaMundo.class, este fichero es el que contiene el código compilado a partir de HolaMundo.java
(Eclipse compila el proyecto cada vez que se guarda).

Escribiendo directamente toda la clase: Pulsamos con el botón derecho sobre el proyecto New File. Se abre
una ventana como la que se muestra en la figura donde hay que poner el nombre del fichero. Al pulsar sobre
Finish se crea un fichero vacío con el nombre HolaMundo.java.

No se tiene una preferencia por alguno de los dos métodos expuestos. Aunque, como recomendación, al
principio es conveniente escribir toda la clase para saber lo que se está haciendo y además... ¡en el examen
no habrá ningún asistente!.

El asistente simplemente a creado un esqueleto ahora falta completar el código. Añadimos las líneas
necesarias para completar el programa. El resultado se muestra en la figura.
Ejecutando el programa
Los programas se pueden ejecutar dentro de Eclipse.
Con la perspectiva Java abierta, seleccionar en el menú: Run -> Run...
En la ventana que se abre, pulsar 2 veces sobre Java Application . En el panel Main se rellena la información
tal y como aparece en la figura

Puesto que en el ejemplo propuesto se necesitan argumentos pulsamos sobre el panel Arguments y ponemos
el argumento que vamos a pasar al programa. Un ejemplo se muestra en la figura.

Una vez proporcionada la información necesaria (hay más paneles pero por ahora no es necesario conocerlos)
se pulsa sobre el botón Run .
Este programa simplemente muestra un mensaje por consola. La consola está integrada (es una vista más)
dentro de Eclipse. Así tras ejecutar el programa, en la vista Consola veremos lo que se muestra en la figura.

Cuando el programa no requiere ningún ajuste especial (por ejemplo, no se requiere el paso de argumentos)
se puede hacer de forma más rápida pulsando sobre Run -> Run as -> Java Application .
Hay barras de tareas para el acceso rápido a algunas funciones (entre ellas ejecutar). La figura muestra algunas
de ellas.

Depuración de programas.
Dentro del entorno de desarrollo de Eclipse se pueden depurar programas desarrollados en Java.
Window -> Open perspective -> Debug . Aparecen una serie de vistas similares a las de la figura.
Una vez hemos abierto la perspectiva de depuración podemos parar la ejecución del programa en una
determinada línea (poniendo un breakpoint) e inspeccionar las variables locales.
Para poner un breakpoint, en la vista donde se encuentra el código fuente seleccionamos la línea donde
queremos que se detenga la ejecución y seleccionamos en el menú Run -> Add/remove Breakpoint . Vemos
que se muestra un punto azul en la parte izquierda de la línea. Ahora ya podemos lanzar el depurador.
Seleccionamos en el menú Run -> Debug . La ejecución del programa se detiene en el primer breakpoint. Una
vez el programa está detenido, en una de las vistas podemos ver el valor de las variables o ver los breakpoints
que hemos definido. En la figura se muestra el programa detenido en una línea y se muestra la vista Variables
con el contenido de una variable local.

Una vez inspeccionado el código donde está el problema se puede optar por ejecutar el programa hasta que
termine ( Run -> Resume ) o terminar el programa inmediatamente (Run -> Terminate) Otras herramientas
interesantes.
El editor de Java ofrece correcciones a problemas encontrados mientras se escribe el código y tras compilar.
El editor muestra que existen propuestas para la corrección de un problema o aviso mediante una bombilla
visible en la parte izquierda del editor. Si se pulsa con el botón izquierdo sobre esta bombilla (o también
mediante ( Edit -> Quick Fix ) se muestran las propuestas para el problema en la posición del cursor. Si se
desean importar recursos a un proyecto se puede realizar del siguiente modo: en la vista Navigator se pulsa
sobre el botón derecho y aparece un menú, se selecciona Import y aparece una ventana desde la que se puede
seleccionar el directorio donde están los recursos y cuales se desean incorporar al proyecto. Desde un
proyecto se pueden exportar todos o algunos de los ficheros que lo conforman. Para ello en la vista Navigator
se pulsa sobre el botón derecho y aparece un menú, se selecciona Export y aparece una ventana en la que
podemos indicar cómo se va a exportar (un fichero zip, tal cual aparecen en el proyecto...). La siguiente
ventana sirve para seleccionar los ficheros que se desean exportar y a dónde. Si colocamos el ratón sobre un
método (sin pulsar) se nos muestra la declaración del método (qué devuelve y qué parámetros acepta). Si
colocamos el ratón (sin pulsar) sobre una variable aparece información sobre el tipo de la variable. Al escribir
código podemos pulsar Ctrl + espacio y nos aparece un menú con posibles formas de finalizar la sentencia que
se está escribiendo. Un ejemplo se muestra en la figura.

U n i d a d III
Programación Orientada a Objetos

Objetivo de la Unidad:
El alumno codificará clases empleando el paradigma de la programación orientada a objetos para el
desarrollo de aplicaciones.

3.1 Estructura básica de una Clase


Un programa Java está formado por una o varias clases
Cada clase puede tener sus atributos y métodos
Al menos una de las clases tendrá un método llamado main
Dicho método es el que se comienza a ejecutar
Los métodos tienen una serie de sentencias que se ejecutan en secuencia
Alguna de esas sentencias pueden ser pasos de mensajes a otros objetos (llamadas a sus métodos) La
estructura básica de una clase es:
public|static|private class NombreClase{ /*
COMENTARIO*/
//TIPOS DE VARIABLES INSTANCIABLES, EN CASO QUE HAYAN tipo
var1,var2;
//Definicion de método constructor
public|static|private NombreClase(){
............
............
}
//Definicion de método1 public|static|private
Metodo1(tipo a,tipo b,...){
............
............
}
//Definicion de método2 public|static|private
Metodo2(tipo a,tipo b,...){
............
............
}
}//fin de clase

3.2 Aspectos Léxicos


Tipos de Datos
Además de las referencias a objetos existen 8 tipos de datos primitivos:
Tipo Tamaño (Bytes) Rango de Valores

int 4 -2,147,483,648 a 2,247,483,642

short 2 -32,768 a 32,767

long 8 -9,223,372,036,854,775,808 a 9,223,372,036,854,775,808

byte 1 -128 a 127

float 4 -+3.40282347E+38F (6-7 dígitos decimales)

double 8 -+1.797 ….. +308 (15 dígitos)

char 2 65,536 caracteres (unicode)

boolean 1 true, false

Los tipos primitivos de Java tienen algunas características importantes que se resumen a continuación: El
tipo boolean no es un numérico: sólo admite true o false. No se identifica con el igual o diferente de cero,
como en C/C++.
El tipo char contiene caracteres en código UNICODE (incluye el código ASCII).
byte, short, int y long son enteros que positivos o negativos. En Java no hay enteros unsigned.
Los tipos float y double son valores de punto flotante con 6-7 y 15 cifras decimales equivalentes,
respectivamente.
Existen extensiones de Java 1.5 para aprovechar la arquitectura de los procesadores Intel, que permiten
realizar operaciones de punto flotante con una precisión extendida de 80 bits
Palabras reservadas
Existe una serie de palabras reservadas las cuales tienen un significado especial para Java y por lo tanto no se
pueden utilizar como nombres de variables. Dichas palabras son:
abstract default if package this
boolean do implements private throw
break double import protected throws
byte else instanceof public transient
case extends int return try void
catch final interface short volatile
char finally long static while
class float native super
const* for new null switch
continue goto* synchronized

(*) Son palabras reservadas, pero no se utilizan en la actual implementación del lenguaje Java.

Variables.
Java almacena datos a través de variables y objetos. Una variable almacena solo un dato a la vez, en cambio
un objeto es una instancia de una clase que puede o no contener más de una variable de diferente tipo. Las
variables tienen una existencia y alcance limitados al método en que fueron creadas; es decir la variable
solamente puede ser utilizada dentro del método en que fue creada y existirá mientras el mismo método
exista
Definición e inicialización de variables simples
Una variable se define especificando su tipo y nombre. Estas variables pueden ser de tipos primitivos o
referencias a objetos. Las variables de tipo referencia se inicializan a null, para que tengan un valor es
necesario que crear un objeto con el operador new. Este operador reserva en la memoria espacio para el
objeto incluyendo sus variables y métodos.
La sintaxis para definir una variable es:
<tipo> < nombre_variable>;

ejemplo: int alumnos;

La inicialización de una variable al momento de declararla es opcional, la sintaxis es la siguiente:


<tipo> < nombre_variable> = <valor>; Ejemplos
float dolar=11.30;

Ejemplo de declaración e inicialización de variables


class DeclaraVariables{ public static void
main(String[] args)
{
int entero = 0;
char letra = 'a';
String cadena = null;
double doble = 0;
boolean logica = true;
System.out.println("Entero = "+entero);
System.out.println("La var char contiene al iniciar "+letra);
System.out.println("La var lógica tiene " + logica);
System.out.println("La var doble tiene " + doble);
System.out.println("La referencia a un objeto es " + cadena);
}
}

Identificadores
Los nombres de variables, objetos, clases, etc. son “case sensitive”, esto es, son sensibles a mayúsculas y
minúsculas. De esta forma, casa, Casa y CASA se considera como tres variables distintas entre sí. Las reglas del
lenguaje respecto a la nomenclatura de variables son muy amplias, pero para facilitar la lectura y las tareas
de mantenimiento, comúnmente se siguen ciertas normas:
Los nombres de variables se escriben generalmente con minúsculas, pero si el nombre consta de más de una
palabra se escriben una seguida de la otra sin espacios, usando mayúscula para la marcar el inicio de la
siguiente palabra. Por ejemplo: calcularSueldoDiario, verificarFechaDeExpedicion, abrirVentana,

etc.

Los identificadores no pueden ser palabra reservadas como main, true, false, public, etc.
No deben tener el mismo nombre que otras variables declaradas en el mismo ámbito.
Los nombres de objetos, métodos y variables miembro comienzan con minúscula, ejemplos: main(),

imprimir(), encuentraMayor(), sueldoDiario, diasTrabajados,etc.

Los nombres de clases e interfaces comienzan siempre con mayúscula. Ejemplos: MiClase, Circulo, Graphics,
etc.
Las constantes se escriben con mayúscula. Por ejemplo PI, IVA, etc.
Comentarios
Un comentario es información que el programador agrega al programa con el fin de identificar el programa,
autor, módulo; explicar una parte del programa, proporcionar ayuda para una modificación posterior. Los
comentarios pueden ser de dos tipos:
Bloque de comentarios. El bloque de comentarios está formado por una o más líneas. El inicio del bloque se
marca con /* y el final se marca con */.
Línea de Comentarios. Inician con // y terminan al final de la línea.
Operadores de Java
Java tiene una gran variedad de operadores, casi idénticos a los de C/C++.
Operadores aritméticos: Se dice que son operadores binarios porque requieren de dos operandos. Realizan
las operaciones aritméticas:
Operación Símbolo

suma +

resta -

multiplicación *

división /

división módular %

Operadores de asignación: El operador de asignación es el símbolo igual (=). La forma general de asignación
con este operador es: variable = valor o expresión; Ejemplos: a=3;
x = y + z;

Operadores acumulativos: Los operadores acumulativos realizan la operación considerando como primer
operador el valor a la izquierda de la expresión y como segundo operador el valor que se escriba a la derecha.
El resultado se guarda en la variable de la izquierda; es decir el operador de la izquierda tiene una doble
función: es el primero operando y es la variable donde se guarda el resultado.

Operador Ejemplo

+= x += y equivale a x = x + y;

-= x -= y equivale a x = x - y;

*= x *= y equivale a x = x * y;

/= x /= y equivale a x = x / y;

%= x %= y equivale a x = x % y;

Si x=3; y y=2 al ejecutar x+=y el valor final de x sería 5.


Operadores Unarios (++, --): Los operadores se pueden utilizar de dos formas:
Precediendo a la variable. Primero se incrementa la variable y luego se utiliza en la expresión en la que
aparece.
Siguiendo a la variable. En este caso primero se utiliza la variable en la expresión y luego se incrementa.
Ejemplo de operadores aritméticos, unarios y acumulativos
public class Operadores { public static void
main(String[] args) { int a =
5,b = 10; int j = 1; int c = a
+ b;
System.out.println("Operadores Aritmeticos");
System.out.println(a + "+" +b + " = " + c);
c = a - b;
System.out.println(a + "-" +b + " = " + c);
c = a * b;
System.out.println(a + "*" +b + " = " + c);
c = a / b;
System.out.println(a + "/" +b + " = " + c);
c =b % a;
System.out.println(b + " modulo " + a + " = " + c);
b += 3;
c =b % a;
System.out.println(b + " modulo " + a + " = " + c);
System.out.println("Operadores Unarios");
System.out.println("Valor inicial de a " + a);
System.out.println("Con +a= " + ++a);
System.out.println("Valor inicial de b " + b);
System.out.println("Con b-- = " + b--); }
}

Operador condicional (?): Este operador heredado de C/C++, permite evaluar condiciones sencillas. Su sintaxis
es:
Condición ? acción1 : acción2;

Donde se evalúa Condición si la condición se cumple se ejecuta la acción1 y si no se cumple entonces se ejecuta
la acción2. Es el único operador ternario de Java. Como todo operador que devuelve un valor, puede ser
utilizado en una expresión. Por ejemplo en las líneas:
x = 1 ; y = 5; z = (x<y)? 3: 8; z tendría el
valor 8 porque la condición no se cumple. Ejemplo de
Operador Ternario
public class OperadorTernario{ public static
void main(String Args[]){ int
a=16,b=10, x=0; x=(a>b)? 3:5;
System.out.println("X= " +x);
}
}

Operadores relacionales: Los operadores relacionales son >,<,<=,<=,!=,==.El resultado de estos operadores es
siempre un valor booleano.
Operación Símbolo

> Mayor que

< Menor que

<= Menor o igual que

>= Mayor o igual que

!= Diferente

== Igual

Operadores lógicos:
Operador Nombre Sintaxis Resultado

&& And Op1 && Op2 True si op1 y op2 son True
|| Or Op1 || Op2 True si op1 y op2 son True

! Not !op True si op es False y False si op es True

Operador de concatenación de cadenas (+): El operador más (+) se utiliza también para concatenar cadenas
de caracteres. Por ejemplo:
System.out.println("El total asciende a "+result + " unidades");

Jerarquía de los operadores


El orden en que se realizan las operaciones muchas veces determina el resultado de una expresión. La
siguiente lista muestra el orden en que se ejecutan los distintos operadores en una instrucción:
1 Multiplicativos */%

2 Aditivos +-

3 Relacionales < > <= >=

4 Igualdad == !=

5 AND &&

6 OR ||

7 Condicional ?:

8 Asignación = += -= *= /= %= &= ^= |=

En Java, todos los operadores binarios, excepto los operadores de asignación, se evalúan de izquierda a
derecha. Los operadores de asignación se evalúan de derecha a izquierda, lo que significa que el valor de la
derecha se copia sobre la variable de la izquierda.
Ejercicios:
1. ¿Qué resultados se obtienen al realizar las operaciones siguientes? Si se encuentran errores, corríjalos y
explique porque suceden.

• int a = 10, b = 3, c = 1, d, e;
• float x, y;
• x = a / b;
• c = a < b && c;
• d = a + b++;
• e = ++a – b;
• y = (float)a / b;
2. Escriba las sentencias necesarias para evaluar la siguiente ecuación para valores de:
a = 5, b = -1.7, c = 2, d = 3.5, k = 3 y x = 10.5 ax4
+ bx3 – cx2 + dx + k
3.3 Clases y Objetos
Las clases son lo más simple en Java. Todo en Java forma parte de una Clase, es una clase o describe cómo
funciona una clase. El conocimiento de las clases es fundamental para poder entender los programas en
Java.
Las acciones de los programas java se colocan dentro del bloque de una clase o un objeto. Un objeto es una
instancia a una clase. Todos los métodos se definen dentro del bloque de la clase, java no soporta función eso
variables globales. Así pues, el esqueleto de cualquier aplicación java se basa en la definición de una clase.
La definición de una clase consta de dos partes, la declaración y el cuerpo.
Sintaxis:
DeclaracionClase{
CuerpoClase
}

La declaración de la clase indica al compilador el nombre de la clase, la clase de la que deriva (su superclase),
los privilegios de acceso a la clase (publica, abstracta, final) y si la clase implementa o no, una o varias
interfaces. El nombre de la clase debe ser un identificador valido en Java. Por convención, el nombre de las
clases en Java empieza con una letra mayúscula.
Cada clase Java deriva, directa o indirectamente, de la clase Object. La case padre inmediatamente superior a
la clase que se está declarando se conoce como superclass. Si no se especifica la superclase de la que deriva
una clase, se entiende que deriva directamente de la clase Object.
En la declaración de una clase se utiliza la palabra clave extends para especificar la superclase, de la siguiente
forma:
Class MiClase extends SuperClase{ //cuerpo
de la clase
}

La herencia de los métodos de acceso a una clase no se puede utilizar en java para modificar el control de
acceso asignado a un miembro de la clase padre.
Una clase hereda las variables y métodos de su superclase y también de la superclase de esa clase, etc.; es
decir, de todo el árbol de jerarquía de clases desde la clase que se esta declarando hasta la raíz superior del
árbol: Objetc. En otras palabras, un objeto que es instanciado desde una clase determinada, contiene todas
las variables y métodos de instancia definidos para esta clase y sus antecesores, aunque los métodos pueden
ser modificados en algún lugar.
Una clase puede implementar una o más interfaces, declarándose esto utilizando la palabra clave implements,
seguida de la lista de interfaces que implementa, separadas por coma, por ejemplo:
Class MiClase extends SuperClase
Implements MiInterfaz, TuInterfaz{
//Cuerpo de la Clase
}
}

Las características más importantes que la clase Object cede a sus descendientes son las siguientes:

• Posibilidad de cooperación consigo o con otro objeto


• Posibilidad de conversión automática a String
• Posibilidad de espera sobre una variable de condición
• Posibilidad de notificación a otros objetos del estado de la variable de condición
La sintaxis general de definición de clase se podría extender tal como se muestra en el siguiente esquema, el
cual se debe tomar como referencia y no al pie de la letra:
NombreDeLaClase{
//Declaración de las variables de instancia
//Declaración de las variables de la clase
MetodoDeInstancia(){
//Variables Locales
//Código
}
MetodoDeLaClase(){
//Variables Locales
//Código
}
}

Tipos de Clases
Los tipos de clases que se pueden definir son:
public: Son accesibles desde otra clases, bien sea directamente o por herencia, desde clases declaradas fuera
del paquete que contiene a esas clases públicas, ya que, por defecto, las clases solamente son accesibles por
otras clases declaradas dentro del mismo paquete en que se han declarado. Para acceder desde otros
paquetes, primero tiene que ser importadas. Su sintaxis es:
public class MiClase extends SuperClase{
implements MiInterfaz, TuInterfaz{
//Cuerpo de la Clase
} }

abstract: Una clase abstract tiene al menos un método abstracto. Esta clase no se instancia, sino que se utiliza
como clase base para la herencia.
final: Se declara como la clase que termina una cadena de herencia, es lo contrario a la clase abstracta. Nadie
puede heredar de una clase final.
synchronizable: Especifica que todos los métodos definidos en la clase son sincronizados, es decir, que no se
puede acceder al mismo tiempo a ellos desde distintas tareas; el sistema se encarga de colocar los flags
necesarios para evitarlo. Variables Miembros
Una clase puede contener variables y métodos. Las variables pueden ser tipos primitivos como int, char, etc.
Los métodos son funciones.
Por ejemplo, esto se puede observar en el siguiente segmento de código:
public class MiClase{
int i;
public MiClase(){
i = 10;
}
public void Suma_a_i(int j){
int suma;
suma i + j;
}
}

La clase MiClase contiene una variable (i) y dos métodos: MiClase() que es el constructor de la clase y
Suma_a_i(int j).
La declaración de una variable miembro aparece dentro del cuerpo de la clase, pero fuera del cuerpo de
cualquier método de esa clase. Si se declara dentro de un método, será una variable local del método y no
una variable miembro de la clase.
El tipo de una variable determina los valores que se le pueden asignar y las operaciones que se pueden realizar
con ella.
El nombre de una variable ha de ser un identificador valido en java.
La sintaxis completa de la declaración de una variable miembro de una clase en java es:
[especificador de acceso] [static][final][transient][volatile]
Tipo nombreVariable [ = valor_inicial];

Ámbito de una variable


Los bloques de sentencias compuestas en java se delimitan con dos llaves. Las variables de java solo son
validad desde el punto donde están declaradas hasta el final de la sentencia compuesta que las engloba. Se
pueden anidar estas sentencias compuestas, y cada una puede contener su propio conjunto de declaraciones
de variables locales. Sin embargo, no se puede declarar una variable con el mismo nombre que una de ámbito
exterior.
Variable de Instancia
La declaración de una variable miembro dentro de la definición de una clase sin anteponerle la palabra clave
static, hace que sea una variable de instancia en todos los objetos de la clase. El significado de variable de
instancia seria, más o menos, que cualquier objeto instanciado de esa clase contiene su propia copia de toda
variable de instancia.
En java se accede a las variables de instancia asociadas a un objeto determinado utilizando el nombre del
objeto, el operador punto y el nombre de la variable: miObjeto.miVariableDeInstancia; Variables
Estáticas
La declaración de un dato miembro de una clase usando static, crea una variable de clase o variable estática.
El significado de variable estática es que todas las instancias de la clase contienen las mismas variables de
clase o estáticas, en otras palabras, en un momento determinado se puede querer crear una clase en la que
el valor de una variable de instancia sea el mismo para todos los objetos instanciados a partir de esa clase.
class Documento extends Pagina{
static int versión = 10;
}

Constantes
En Java se utiliza la palabra reservada final para indicar que una variable debe comportarse como si fuera
constante, significando esto que no se permite su modificación una vez que haya sido declarada e inicializada.
class Elipse{
final float PI = 3.141562;

}

Métodos
Los métodos son funciones que pueden ser llamados dentro de la clase o por otras clases. La implementación
de un método consta de dos partes, una declaración y un cuerpo. La declaración en java de un método se
puede expresar esquemáticamente como:
tipoRetorno nombreMetodo( [lista_de_argumentos] ) {
cuerpoMetodo
}

Los métodos pueden tener numerosos atributos a la hora de declararlos, incluyendo el control de acceso, si
es estático o no estático, etc.
La lista de argumentos es opcional, puede limitarse a su minima expresión consistente en dos paréntesis, sin
parámetro alguno en su interior. Los paramentros, o argumentos, se utilizan para pasar información al cuerpo
del método.
La sintaxis de la declaración completa de un método es la siguiente:
especificadorAcceso static abstract final native synchronized
tipoRetorno nombreMetodo(lista_argumentos){ throws
listaExcepciones
especificadorAcceso Determina si otros objetos pueden acceder al método y como pueden hacerlo

static Indica que los métodos pueden ser accedidos sin necesidad de instanciar un objeto del
tipo que determina la clase
abstract Indica que el método no está definido en la clase, sino que se encuentra declarado ahí
para ser definido en una subclase

final Evita que un método pueda ser sobrescrito

native Son métodos escritos en otros lenguajes, java soporta actualmente a C y C++

synchronized Se usa en el soporte de la multitarea

lista_argumentos Es la lista opcional de parámetros a pasar al método

throws listaExcepciones Excepciones que puede generar y manipular el método

Valor de retorno de un método


En java es imprescindible que a la hora de la declaración de un método, se indique el tipo de dato que ha de
devolver. Si no devuelve ningún valor, se indicara el tipo void como retorno.
Todos los tipos primitivos se devuelven por valor y todos los objetos se devuelven por referencia. El retorno
de la referencia a un objeto es la dirección de la posición en memoria dinámica donde se encuentra
almacenado el objeto.
Para devolver un valor se utiliza la palabra reservada return. Esta va seguida de una expresión que será
evaluada para saber el valor de retorno. Esta expresión puede ser compleja o simplemente el nombre de un
objeto, una variable de tipo primitivo o una constante.
Por ejemplo:
//El objeto de esta clase será devuelto por referencia class
miClase{

int varInstancia = 10;


} class
prueba{
int retornoPorValor(){//Método que devuelve por valor
//Devuelve un tipo primitivo por valor
return(5);
}
miClase retornoPorReferencia(){//Método que devuelve por referencia
//Devuelve el objeto por referencia
return(new miClase());
}
public static void main(String args[]){
//Instancia un objeto
prueba obj = new prueba;
System.out.println(“El valor devuelto es:“ + ojb.retornoPorValor());
System.out.println(“Valor de la variable de instancia en el objeto:“
+ obj.retornoPorReferencia().varInstancia); }
}
Nombre del Método
El nombre del método puede ser cualquier identificador legal en java. Java soporta el concepto de sobrecarga
de métodos, es decir, permite que dos métodos compartan el mismo nombre pero con diferentes listas de
argumentos, de forma que el compilador pueda diferenciar claramente cuanto se invoca a uno o a otro en
función de los parámetros que se utilicen en la llamada al método.
Por Ejemplo:
class MiClase{
. . .
void miMetodo(int x, int y){ . . . }
void miMetodo(int x){ . . . }
void miMetodo(int a, float b){ . . . }
//void miMetodo(int x, float y){ . . . }
}

Métodos de Instancia
Cuando se incluye un método a una definición de una clase java sin utilizar la palabra clave static, se está
generando un método de instancia. Aunque cada objeto de la clase no contiene su propia copia de un método
de instancia, el resultado final es como si fuese así, como si cada objeto dispusiese de su propia copia del
método.
Cuando se invoca un método de instancia a través de un objeto, si este método está referenciando a variables
de instancia de la clase, en realidad se están referenciado a variables de instancia específicas del objeto que
se está invocando.
La llamada a los métodos de instancia en java se realiza utilizando el nombre del objeto, el operador punto y
el nombre del método.
miObjeto.miMetodoDeInstancia();

Los métodos de instancia tienen acceso tanto a las variables de instancia como a las variables de la clase.
Objetos
Un objeto es una instancia de una clase. La creación de un objeto se realiza en tres pasos:

• Declaración: Proporcionar un nombre al objeto


• Instanciación: Asignar memoria al objeto
• Inicialización: Opcionalmente se pueden proporcionar valores iniciales a las variables de instancia
del objeto.
La declaración e instanciación de una variable de tipo básico utiliza una sentencia que asigna un nombre a la
variable y reserva memoria para alcanzar su contenido: int miVariable;

Una vez que se tiene declarado un objeto con sus variables y sus métodos, se puede acceder a ellos a fin de
activar la funcionalidad para la que se ha creado. Sin embargo, algún método o variable pueden estar ocultos
y el acceso a ellos resultar imposible.
Para acceder a variables o métodos se especifica el nombre del objeto y el nombre de la variable, o método,
separados por un punto.
El programador de java no necesita preocuparse por devolver la memoria. Eso se realizara automáticamente
de la mano del reciclador de basura o garbage collector.
Ejercicios:
1. Realizar un programa que de cómo resultado los intereses producidos y el capital total acumulado
de una cantidad c, invertida a un interés r durante t días
2. Realizar un programa que dé como resultado las soluciones reales x1 y x2 de una ecuación de segundo
grado, la fórmula es: ax2 + bx + c = 0

3. Realizar un programa que calcule el volumen de una esfera, que viene dado por la fórmula: v =
4/3pi*r3

3.4 Estructuras de Control


En la mayor parte de los lenguajes de programación, las de estructuras son similares en cuanto al concepto,
aunque la sintaxis puede cambiar de un lenguaje a otro. La sintaxis de Java similar a la de C y C++, lo que
significa que para un programador de C y C++ la sintaxis de Java no tiene dificultad.
Instrucción: Una instrucción es una expresión que acaba en punto y coma (;). Se permite incluir varias
instrucciones en una línea, aunque lo habitual es utilizar una línea para cada instrucción. Por ejemplo: i =

0; j = 5; x = i + j; // Línea compuesta de tres instrucciones

Problemas Secuenciales
1. Elaborar un algoritmo que convierta centímetros a pulgadas. (1 pulgada=2.54; Pulg=cm/2.54)
2. Elaborar un algoritmo que convierta pies a pulgadas. (1 pie=12 pulgadas, Pulg=pie*12)
3. Hacer un algoritmo que calcule el área de un triángulo. (Area=(Base*Altura)/2
4. Hacer un algoritmo para encontrar el promedio de 3 exámenes para un estudiante. Debe introducir por
teclado el número de control del estudiante así como sus calificaciones.
5. Suponga que un individuo desea invertir su capital en un banco y desea saber cuánto dinero ganará
después de un mes si el banco paga a razón de 2% mensuales.
6. Un vendedor recibe un sueldo base más un 10% extra por comisión de sus ventas, el vendedor desea
saber cuánto dinero obtendrá por concepto de comisiones que realiza en el mes y el total que recibirá en
el mes tomando en cuenta su sueldo base y comisiones.
7. Una tienda ofrece un descuento del 15% sobre el total de la compra y un cliente desea saber cuánto
deberá pagar finalmente en su compra.
8. Realizar un algoritmo que calcule la edad de una persona.
9. Dada una cantidad de pesos, obtener la equivalencia en dólares, asumiendo que la unidad cambiaría es
un dato desconocido.
10. Calcular el número de pulsaciones que una persona debe tener por cada 10 segundos de ejercicio, si la
fórmula es: num_ pulsaciones=(220-edad)/10
11. Calcular el nuevo salario de un obrero si obtuvo un incremento del 25% sobre salario anterior
12. El dueño de una tienda compra un artículo a un precio determinado. Obtener el precio en que lo debe
vender para obtener una ganancia del 30%.
13. Suponga que un individuo desea invertir su capital en un banco y desea saber cuánto dinero ganara
después de un mes si el banco paga a razón de 2% mensual
14. Un alumno desea saber cuál será su calificación final en la materia de Algoritmos. Dicha calificación se
compone de los siguientes porcentajes:
 55% del promedio de sus tres calificaciones parciales.
 30% de la calificación del examen final.

 15% de la calificación de un trabajo final


15. Leer un número y escribir el valor absoluto del mismo.
16. La presión, el volumen y la temperatura de una masa de aire se relacionan por la fórmula: 
Masa = (presión * volumen)/(0.37 * (temperatura + 460))
17. En un hospital existen tres áreas: Ginecología, Pediatría, Traumatología. El presupuesto anual del hospital
se reparte conforme a la siguiente tabla:
Área Porcentaje del presupuesto

Ginecología 40%

Traumatología 30%

Pediatría 30%

Obtener la cantidad de dinero que recibirá cada área, para cualquier monto presupuestal.
18. Todos los lunes, miércoles y viernes, una persona corre la misma ruta y cronometra los tiempos obtenidos.
Determinar el tiempo promedio que la persona tarda en recorrer la ruta en una semana cualquiera.
19. Tres personas deciden invertir su dinero para fundar una empresa. Cada una de ellas invierte una cantidad
distinta. Obtener el porcentaje que cada quien invierte con respecto a la cantidad total invertida.
20. Un alumno desea saber cuál será su promedio general en las dos materias más difíciles que cursa y cuál
será el promedio que obtendrá en cada una de ellas. Estas materias se evalúan como se muestra a
continuación :
La calificación de Matemáticas se obtiene de la siguiente manera:
 Examen 90%
 Promedio de tareas 10%
 En esta materia se pidió un total de tres tareas.
La calificación de Física se obtiene de la siguiente manera:
 Examen 80%
 Promedio de tareas 20%
En esta materia se pidió un total de dos tareas

Condición simple
Se tienen dos tipos de estructuras condicionales, estas son:

• if - else
• switch - case
Condición Simple if
Esta estructura permite ejecutar un conjunto de instrucciones en función del valor que tenga la expresión de
comparación (se ejecuta si la expresión de comparación tiene valor true). Tiene la forma siguiente:
if (Condición){ instrucciones;
}

Las llaves no son necesarias si sólo hay una instrucciones dentro del if
La estructura if tiene una parte opcional que se ejecutará cuando la condición no se cumple (false).
if (Condición{ instrucciones1;
} else { instrucciones2;

Ejemplo del uso de la Estructura if


import java.io.*; import java.util.Random;
public class EstructuraIf{ public static void
main(String[] args) {
InputStreamReader teclado = new InputStreamReader(System.in);
BufferedReader lector = new BufferedReader(teclado);
String auxiliar=new String();
Random azar=new Random();
int aleatorio = azar.nextInt(1000); int
usuario=0;
System.out.println("Escribe un numero");
try{
auxiliar = lector.readLine();
Integer objetoEntero=new Integer(auxiliar);
usuario=objetoEntero.intValue();
}
catch (IOException excep) {
System.out.println("Error");
}
if (aleatorio>usuario)
System.out.println(aleatorio + " es mayor que " + usuario);
else
System.out.println(usuario + " es mayor que " + aleatorio); }
}

Ejemplo de If Anidados
import java.util.Random; public class
EstructuraIfAnidado{ public static void
main(String[] args) {
Random azar=new Random();
int a=azar.nextInt(10);
int b=azar.nextInt(10);
int c=azar.nextInt(10);
System.out.println("Los lados del triangulo son a = " + a + " b = "
+ b + " c = " + c);
if (a == b && b == c)
System.out.println("Es un Triangulo Equilatero");
else if(a != b && b != c)
System.out.println("Es un Trianguo Escaleno");
else
System.out.println("Es un Triangulo Isosceles");
}
}

Condición Múltiple switch - case


Switch case es una alternativa a un conjunto de if-else anidados cuando se evalúa la misma condición con
distintos valores. Su forma general es la siguiente:
switch (expresión) { case valor1:
instrucciones1; break; case valor2:
instrucciones 2; break; case
valor3: instrucciones 3; break;
case valor4: instrucciones 4; break;
default: instrucciones 7;
}

No se pueden establecer rangos o condiciones sino que se debe comparar con valores concretos.
Si ningún caso se cumple entonces se ejecuta el case default, el cual es opcional. Ejemplo
del uso de la Estructura Switch - Case
import java.io.*;
public class EstructuraSwitchCase{ public
static void main(String args[]){
InputStreamReader teclado = new InputStreamReader(System.in);
BufferedReader lector = new BufferedReader(teclado);
String auxiliar=new String();
int opc=0;
System.out.println("1) Saludo ");
System.out.println("2) Numeros");
System.out.println("3) Salida");
System.out.println("Opcion ");
try{
auxiliar = lector.readLine();
Integer objetoEntero=new Integer(auxiliar);
opc = objetoEntero.intValue();
}
catch (IOException excep) {
System.out.println("Error ");
}
switch( opc){
case 1: System.out.println("Bajo Construccion");
break;
case 2: System.out.println("Bajo Construccion");
break;
case 3: System.out.println(" Adios ");
break;
default: System.out.println(" Opcion Invalida");
}
}
}

Problemas Condicionales
1. Elaborar un algoritmo que pida el nombre de un alumno y sus tres calificaciones, que determine el
promedio. Si el promedio es mayor o igual a 7 que imprima su nombre, su promedio y que el alumno esta
aprobado y si no que imprima que esta reprobado.
2. Elaborar un algoritmo que lea el valor de dos variables A y B, y que determine si ambos son iguales, si son
iguales que imprima que ambos son iguales, si no que determine e imprima el mayor de los dos.
3. Elaborar un algoritmo que determine e imprima si un numero leído desde el teclado es positivo, negativo
o cero.
4. Elaborar un algoritmo que lea tres numero enteros, si el primer número es menor que cero, que
determine e imprima la suma de los tres y en caso contrario el producto de los tres.
5. Un hombre desea saber cuánto dinero se genera por concepto de intereses sobre la cantidad que tiene
en inversión en el banco, sabiendo que les pagan por los intereses 13% del monto mensuales. El decidirá
reinvertir los intereses siempre y cuando estos excedan a $ 7,000.00 y en ese caso desea saber cuánto
dinero tendrá finalmente en su cuenta
6. En un almacén se hace un 20% de descuento a los clientes cuya compra supere los $ 1,000.00 pesos. ¿Cuál
será la cantidad que pagara una persona por su compra
7. Un obrero necesita calcular su salario semanal, el cual se obtiene de la siguiente manera:
 Si trabaja 40 horas o menos se le paga $ 50.00 pesos por hora.
 Si trabaja más de 40 horas se le paga $ 50.00 pesos por cada una de las primeras 40 horas y $ 80.00
pesos por cada hora extra.

8. Una persona enferma, que pesa 70 kg. Se encuentra en reposo y desea saber cuántas calorías consume
su cuerpo durante todo el tiempo que realice una misma actividad. Las actividades que tiene permitido
realizar son únicamente dormir o estar sentado en reposo. Los datos que tiene son que estando dormido
consume 1.08 calorías por minuto y estando sentado en reposo consume 1.66 calorías por minuto.
9. Hacer un algoritmo que imprima el nombre de un artículo, clave, precio original y su precio con descuento.
El descuento lo hace en base a la clave, si la clave es 01 el descuento es del 10% y si la clave es 02 el
descuento es del 20%. (Solo existen dos claves)
10. Hacer un algoritmo que calcule el total a pagar por la compra de camisas. Si se compran tres camisas o
mas se aplica un descuento del 20% sobre el total de la compra y si son menos de tres camisas un
descuento del 10%.
11. Calcular el total que una persona debe pagar en una llantera, si el precio de cada llanta es de $ 800.00
pesos, si se compran menos de 5 llantas y de $ 700.00 pesos si se compran 5 o más.
12. En un supermercado se hace una promoción mediante la cual el cliente obtiene un descuento
dependiendo de un número que escoge al azar. Si el numero escogido es menor que 74 el descuento es
del 15% sobre el total de la compra, si es mayor o igual a 74 el descuento es del 20%. Obtener cuando
dinero se le descuenta.
13. Calcular el número de pulsaciones que debe tener una persona por cada 10 segundos de ejercicio
aeróbico; la formula que se aplica
 Cuando el sexo es femenino es: Num_pulsaciones = (220-edad)/10
 Cuando el sexo es masculino es: Num_pulsaciones = (210-edad)/10
14. Una compañía de seguros está abriendo un departamento de finanzas y estableció un programa para
captar clientes, que consiste en lo siguiente:
 Si el monto por el que se efectúa la fianza es menor que $5,000 pesos la cuota a pagar será por el 3%
del monto.
 Si el monto es mayor que $ 5,000 la cuota a pagar será el 2% del monto.
La afianzadora desea determinar cuál será la cuota que debe pagar un cliente.
15. Una empresa quiere hacer una compra de varias piezas de la misma clase a una fábrica de refacciones. La
empresa, dependiendo si el monto total de la compra, decidirá qué hacer para pagar al fabricante.
 Si el monto total de la compra excede de $25,000.00 la empresa tendrá la capacidad de invertir de
su propio dinero un 55% del monto de la compra, pedir prestado al banco un 30% y el resto lo pagara
solicitando un crédito al fabricante.
 Si el monto total de la compra no excede de $25, 000 la empresa tendrá capacidad de invertir de su
propio dinero un 70% y el restante 30% lo pagara solicitando crédito al fabricante.
El fabricante cobra por concepto de intereses un 20% sobre la cantidad que se le pague a crédito.
16. En una escuela la colegiatura de los alumnos se determina a través de un programa que se ha establecido
para estimular a los alumnos, el cual consiste en lo siguiente:
 Si el promedio obtenido por un alumno es mayor o igual que 9, se le hará un descuento del 30% sobre
la colegiatura y no se le cobrara IVA;
 Si el promedio obtenido es menor que 9 deberá pagar la colegiatura completa, la cual incluye el 10%
de IVA.
Obtener cuanto debe pagar un alumno.
17. Una empresa de bienes raíces ofrece casas de interés social, bajo las siguientes condiciones:
 Si los ingresos del comprador son menores de $8,000 el enganche será del 15% del costo de la casa
y el resto se distribuirá en pagos mensuales, apagar en diez años.
 Si los ingresos del comprador son de $8,000 o más el enganche será del 30% del costo de la casa y el
resto se distribuirá en pagos mensuales apagar en 7 años.
La empresa quiere obtener cuanto debe pagar un comprador por concepto de enganche y cuanto por cada
pago parcial.
18. El gobierno ha establecido el programa SAR (Sistema de Ahorro para el Retiro) que consiste en que los
dueños de la empresa deben obligatoriamente depositar en una cuenta bancaria un porcentaje del salario
de los trabajadores; adicionalmente los trabajadores pueden solicitar a la empresa que deposite
directamente una cuota fija o un porcentaje de su salario en la cuenta del SAR, la cual le será descontada
de su pago.
Un trabajador que ha decidido aportar a su cuenta del SAR desea saber la cantidad total de dinero que
estará depositado a esa cuenta cada mes, y el pago mensual que recibirá.
19. Una persona desea iniciar un negocio, para lo cual piensa verificar cuánto dinero le prestara el banco por
hipotecar su casa. Tiene una cuenta bancaria, pero no quiere disponer de ella a menos que el monto por
hipotecar su casa sea muy pequeño.
 Si el monto de la hipoteca es menor que $10,000 entonces invertirá el 50% de la inversión total y un
socio invertirá el otro 50%.
 Si el monto de la hipoteca es de $ 10 000 o más, entonces invertirá el monto total de la hipoteca y el
resto del dinero que se necesite para cubrir la inversión total se repartirá a partes iguales entre el
socio y el.
20. El gobierno del estado de México desea reforestar un bosque que mide determinado número de
hectáreas. Si la superficie del terreno excede al millón de metros cuadrados, entonces decidirá sembrar
de la siguiente manera:
Porcentaje de la superficie del bosque Tipo de árbol

70% Pino

20% Oyamel

10% Cedro

Si la superficie del terreno es menor o igual a un millón de metros cuadrados, entonces decidirá sembrar
de la siguiente manera:
Porcentaje de la superficie del bosque Tipo de árbol

50% Pino

30% Oyamel

20% Cedro
El gobierno desea saber el número de pinos, oyameles y cedros que tendrá que sembrar en el bosque, si
se sabe que en 10 metros cuadrados caben 8 pinos, en 15 metros cuadrados caben 15 oyameles y en 18
metros cuadrados caben 10 cedros. También se sabe que una hectárea equivale a 10 mil metros
cuadrados.
21. Una fábrica ha sido sometida a un programa de control de contaminación para lo cual se efectúa una
revisión de los puntos IMECA generados por la fábrica. El programa de control de contaminación consiste
en medir los puntos IMECA que emite la fabrica en cinco días de una semana y si el promedio
es superior a los 170 puntos entonces tendrá la sanción de parar su producción por una semana y una
multa del 50% de las ganancias diarias cuando no se detiene la producción. Si el promedio obtenido de
puntos IMECA es de 170 o menor entonces no tendrá ni sanción ni multa. El dueño de la fábrica desea
saber cuánto dinero perderá después de ser sometido a la revisión.
22. Una persona se encuentra con un problema de comprar un automóvil o un terreno, los cuales cuestan
exactamente 10 mismo. Sabe que mientras el automóvil se devalúa, con el terreno sucede lo contrario.
Esta persona comprara el automóvil si al cabo de tres años la devaluación de este no es mayor que la
mitad del incremento del valor del terreno. Ayúdale a esta persona a determinar si debe o no comprar el
automóvil.
23. Leer 2 números si son iguales que los multiplique, si el primero es mayor que el segundo que los reste y
si no que los sume.
24. Leer tres números enteros diferentes e imprimir el número mayor de los tres.
25. Determinar la cantidad de dinero que recibirá un trabajador por concepto de las horas extras trabajadas
en una empresa, sabiendo que cuando las horas de trabajo exceden de 40, el resto se consideran horas
extras y que estas se pagan al doble de una hora normal cuando no exceden de 8; si las horas extras
exceden de 8 se pagan las primeras 8 al doble de lo que se pagan las horas normales y el resto al triple.
26. Calcular la utilidad que un trabajador recibe en el reparto anual de utilidades si este se le asigna como un
porcentaje de su salario mensual que depende de su antigüedad en la empresa de acuerdo con la
siguiente tabla:
Tiempo Utilidad

Menos de 1 año 5 % del salario

1 año o más y menos de 2 años 7% del salario

2 años o más y menos de 5 años 10% del salario

5 años o más y menos de 10 años 15% del salario

10 años o mas 20% del salario

27. En una tienda de descuento se efectúa una promoción en la cual se hace un descuento sobre el valor de
la compra total según el color de la bolita que el cliente saque al pagar en caja. Si la bolita es de color
blanco no se le hará descuento alguno, si es verde se le hará un 10% de descuento, si es amarilla un 25%,
si es azul un 50% y si es roja un 100%. Determinar la cantidad final que el cliente deberá pagar por su
compra. se sabe que solo hay bolitas de los colores mencionados.
28. El IMSS requiere clasificar a las personas que se jubilaran en el año de 1997. Existen tres tipos de
jubilaciones: por edad, por antigüedad joven y por antigüedad adulta. Las personas adscritas a la
jubilación por edad deben tener 60 años o más y una antigüedad en su empleo de menos de 25 años. Las
personas adscritas a la jubilación por antigüedad joven deben tener menos de 60 años y una antigüedad
en su empleo de 25 años o más. Las personas adscritas a la jubilación por antigüedad adulta deben tener
60 años o más y una antigüedad en su empleo de 25 años o más. Determinar en qué tipo de jubilación,
quedara adscrita una persona.
29. En una fábrica de computadoras se planea ofrecer a los clientes un descuento que dependerá del número
de computadoras que compre. Si las computadoras son menos de cinco se les dará un 10% de descuento
sobre el total de la compra; si el número de computadoras es mayor o igual a cinco pero menos de diez
se le otorga un 20% de descuento; y si son 10 o más se les da un 40% de descuento. El precio de cada
computadora es de $11,000
30. En una llantera se ha establecido una promoción de las llantas marca "Ponchadas", dicha promoción
consiste en lo siguiente: Si se compran menos de cinco llantas el precio es de $300 cada una, de $250 si
se compran de cinco a 10 y de $200 si se compran más de 10. Obtener la cantidad de dinero que una
persona tiene que pagar por cada una de las llantas que compra y la que tiene que pagar por el total de
la compra.
31. En un juego de preguntas a las que se responde "Si" o "No" gana quien responda correctamente las tres
preguntas. Si se responde mal a cualquiera de ellas ya no se pregunta la siguiente y termina el juego. Las
preguntas son:
 ¿Colon descubrió América?

 ¿La independencia de México fue en el año 1810?


 ¿The Doors fue un grupo de rock Americano?
32. Un proveedor de estéreos ofrece un descuento del 10% sobre el precio sin IVA, de algún aparato si este
cuesta $2000 o más. Además, independientemente de esto, ofrece un 5% de descuento si la marca es
"NOSY". Determinar cuánto pagara, con IVA incluido, un cliente cualquiera por la compra de su aparato.
33. Una frutería ofrece las manzanas con descuento según la siguiente tabla:
NUM. DE KILOS COMPRADOS % DESCUENTO

0 –2 0%

2.01-5 10%

5.01 –10 15%

10.01 en adelante 20%

Determinar cuánto pagara una persona que compre manzanas es esa frutería.
34. El dueño de una empresa desea planificar las decisiones financieras que tomara en el siguiente año. La
manera de planificarlas depende de lo siguiente:
Si actualmente su capital se encuentra con saldo negativo, pedirá un préstamo bancario para que su
nuevo saldo sea de $10 000. Si su capital tiene actualmente un saldo positivo pedirá un préstamo bancario
para tener un nuevo saldo de $20000, pero si su capital tiene actualmente un saldo superior a los $20
000 no pedirá ningún préstamo.
Posteriormente repartirá su presupuesto de la siguiente manera, $5 000 para equipo de computo, $2
000 para mobiliario y el resto la mitad será para la compra de insumos y la otra para otorgar incentivos
al personal. Desplegar que cantidades se destinaran para la compra de insumos e incentivos al personal
y, en caso de que fuera necesario, a cuánto ascendería la cantidad que se pediría al banco.
35. Tomando como base los resultados obtenidos en un laboratorio de análisis clínicos, un medico determina
si una persona tiene anemia O no, lo cual depende de su nivel de hemoglobina en la sangre, de su edad y
de su sexo. Si el nivel de hemoglobina que tiene una persona es menor que el rango que le corresponde,
se determina su resultado como positivo y en caso contrario como negativo. La tabla en la que el médico
se basa para obtener el resultado es la siguiente:
EDAD NIVEL HEMOGLOBINA

0-1 mes 13 -26 g%

>1 y<= 6 meses 10 -18 g%

>6 y<= 12 meses 11 -15 g%


>1 y<= 5 años 11.5 -15 g%

>5 y<= 10 años 12.6- 15.5 g%

>10 y<= 15 años 13 15.5 g%

mujeres > 15 años 12 16 g%

hombres > 15 años 14 18 g%

36. Una institución educativa estableció un programa para estimular a los alumnos con buen rendimiento
académico y que consiste en lo siguiente:
 Si el promedio es de 9.5 o más y el alumno es de preparatoria, entonces este podrá cursar 55
unidades y se le hará un 25% de descuento.
 Si el promedio es mayor o igual a 9 pero menor que 9.5 y el alumno es de preparatoria, entonces
este podrá cursar 50 unidades y se le hará un 10% de descuento.
 Si el promedio es mayor que 7 y menor que 9 y el alumno es de preparatoria, este podrá cursar 50
unidades y no tendrá ningún descuento.
 Si el promedio es de 7 o menor, el numero de materias reprobadas es de 0 a 3 y el alumno es de
preparatoria, entonces podrá cursar 45 unidades y no tendrá descuento.
 Si el promedio es de 7 o menor, el numero de materias reprobadas es de 4 o más y el alumno es de
preparatoria, entonces podrá cursar 40 unidades y no tendrá ningún descuento.
 Si el promedio es mayor o igual a 9.5 y el alumno es de profesional, entonces podrá cursar 55
unidades y se le hará un 20% de descuento.
 Si el promedio es menor de 9.5 y el alumno es de profesional, entonces podrá cursar 55 unidades y
no tendrá descuento.
Obtener el total que tendrá que pagar un alumno si la colegiatura para alumnos de profesional es de $300
por cada cinco unidades y para alumnos de preparatoria es de $180 por cada cinco unidades.

Ciclo for
Al igual que for, evalúa la condición antes de cada iteración si esta se cumple ejecuta las instrucciones en caso
contrario el ciclo termina. La forma general del Ciclo for es la siguiente:
for (inicialización; expresión; cambio) { instrucciones;

} Donde:
Inicialización: el valor inicial que se le da a la variable de control. Puede haber más de una variable de control.
Expresión: Es una condición que determina el final del ciclo, puede estar formada por más de una expresión
unidas con operadores lógicos.
Cambio: Es la variación positiva o negativa que tendrán la(s) variable(s) de control.
Ejemplo de la Estructura Iterativa for
El siguiente ejemplo calcula y muestra el factorial de un número entero proporcionado por el usuario.
import java.io.*; public
class EstructuraFor{
public static void main(String[] args) {
InputStreamReader teclado = new InputStreamReader(System.in);
BufferedReader lector = new BufferedReader(teclado);
String auxiliar=new String(); int
numero=1;
System.out.println("Escribe un numero");
try{
auxiliar = lector.readLine();
Integer objetoEntero=new Integer(auxiliar);
numero=objetoEntero.intValue();
}
catch (IOException excep) {
System.out.println("Error");
}
long factorial=1;
for (int i=numero; i>1; i--)
factorial*=i;
System.out.println("El factorial de "+ numero + " es " + factorial);
}
}

Problemas for
1. Calcular el promedio de un alumno que tiene 7 calificaciones en la materia de Diseño Estructurado de
Algoritmos
2. Leer 10 números y obtener su cubo y su cuarta
3. Leer 10 números e imprimir solamente los números positivos
4. Leer 20 números e imprimir cuantos son positivos, cuantos negativos y cuantos neutros.
5. Leer 15 números negativos y convertirlos a positivos e imprimir dichos números.
6. Suponga que se tiene un conjunto de calificaciones de un grupo de 40 alumnos. Realizar un algoritmo
para calcular la calificación media y la calificación más baja de todo el grupo.
7. Calcular e imprimir la tabla de multiplicar de un número cualquiera. Imprimir el multiplicando, el
multiplicador y el producto.
8. Una persona debe realizar un muestreo con 50 personas para determinar el promedio de peso de los
niños, jóvenes, adultos y adultos mayores que existen en su zona habitacional. Se determinan las
categorías con base en la siguiente tabla:
CATEGORÍA EDAD

Niños 0 –12
Jóvenes 13- 29

Adultos 30 –59

Adultos mayores 60 en adelante

9. Al cerrar un expendio de naranjas, 15 clientes que aun no han pagado recibirán un 15% de descuento si
compran más de 10 kilos. Determinar cuánto pagara cada cliente y cuanto percibirá la tienda por esas
compras.
10. En un centro de verificación de automóviles se desea saber el promedio de puntos contaminantes de los
primeros 25 automóviles que lleguen. Asimismo se desea saber los puntos contaminantes del carro que
menos contamino y del que más contamino.
11. Un entrenador le ha propuesto a un atleta recorrer una ruta de cinco kilómetros durante 10 días, para
determinar si es apto para la prueba de 5 Kilómetros o debe buscar otra especialidad. Para considerarlo
apto debe cumplir por lo menos una de las siguientes condiciones:
 Que en ninguna de las pruebas haga un tiempo mayor a 16 minutos.
 Que su promedio de tiempos sea menor o igual a 15 minutos.
12. Un Zoólogo pretende determinar el porcentaje de animales que hay en las siguientes tres categorías de
edades: de 0 al 2 años, de más de 2 años y menos de 5 y de 5 o más años. El zoológico todavía no está
seguro del animal que va a estudiar. Si se decide por elefantes solo tomara una muestra de 20 de ellos; si
se decide por las jirafas, tomara 15 muestras, y si son chimpancés tomara 40

Ciclo while
En el ciclo while la condición se evalúa siempre antes de ejecutar las instrucciones. Si la condición se cumple
se ejecuta el bloque; si la condición es falsa el ciclo termina. En este ciclo puede ocurrir que la condición de
entrada no se cumpla y las instrucciones no se ejecuten ni una sola vez; debido a esto al ciclo while se le
conoce también como ciclo por centinela.
while (condición) {
instruccion1;
instrucción2;
instrucción3; ...
instrucción
}

Ejemplo de la Estructura Iterativa while


El siguiente programa genera la serie ULAM, esta serie sostiene que a partir de cualquier número entero
positivo se puede obtener el número 1 de acuerdo a los siguientes criterios:

• Si el número es par se divide entre 2.


• Si el número es impar se multiplica por 3 y se le suma 1.
import java.io.*; public
class EstructuraWhile{
public static void main(String[] args) {
InputStreamReader teclado = new InputStreamReader(System.in);
BufferedReader lector = new BufferedReader(teclado);
String auxiliar=new String(); int
numero=1;
System.out.println("Escribe un numero");
try{
auxiliar = lector.readLine();
Integer objetoEntero=new Integer(auxiliar);
numero=objetoEntero.intValue();
}
catch (IOException excep) {
System.out.println("Error");
}
while (numero>1) {
if ( numero%2==0)
numero/=2;
else
numero=numero*3+1;
System.out.println(numero);
}
}
}

Problemas while
1. Una compañía de seguros tiene contratados a n vendedores. Cada uno hace tres ventas a la semana. Su
política de pagos es que un vendedor recibe un sueldo base, y un 10% extra por comisiones de sus ventas.
El gerente de su compañía desea saber cuánto dinero obtendrá en la semana cada vendedor por concepto
de comisiones por las tres ventas realizadas, y cuanto tomando en cuenta su sueldo base y sus comisiones.
2. En una empresa se requiere calcular el salario semanal de cada uno de los n obreros que laboran en ella.
El salario se obtiene de la sig. forma : Si el obrero trabaja 40 horas o menos se le paga $20 por hora Si
trabaja más de 40 horas se le paga $20 por cada una de las primeras 40 horas y $25 por cada hora extra .
3. Determinar cuántos hombres y cuantas mujeres se encuentran en un grupo de n personas, suponiendo
que los datos son extraídos alumno por alumno.
4. El Depto. de Seguridad Publica y Transito del D.F. desea saber, de los n autos que entran a la ciudad de
México, cuantos entran con calcomanía de cada color. Conociendo el último dígito de la placa de cada
automóvil se puede determinar el color de la calcomanía utilizando la siguiente relación:
DÍGITO COLOR

1o2 amarilla
3o4 Rosa

5o6 Roja

7o8 verde

9o0 Azul

5. Obtener el promedio de calificaciones de un grupo de n alumnos.


6. Una persona desea invertir su dinero en un banco, el cual le otorga un 2% de interés. Cuál será la cantidad
de dinero que esta persona tendrá al cabo de un año si la ganancia de cada mes es reinvertida?
7. Calcular el promedio de edades de hombres, mujeres y de todo un grupo de alumnos.
8. Encontrar el menor valor de un conjunto de n números dados.
9. Encontrar el mayor valor de un conjunto de n números dados.
10. En un supermercado un cajero captura los precios de los artículos que los clientes compran e indica a cada
cliente cual es el monto de lo que deben pagar. Al final del día le indica a su supervisor cuanto fue lo que
cobro en total a todos los clientes que pasaron por su caja.
11. Cinco miembros de un club contra la obesidad desean saber cuánto han bajado o subido de peso desde
la última vez que se reunieron. Para esto se debe realizar un ritual de pesaje en donde cada uno se pesa
en diez básculas distintas para así tener el promedio más exacto de su peso. Si existe diferencia positiva
entre este promedio de peso y el peso de la última vez que se reunieron, significa que subieron de peso.
Pero si la diferencia es negativa, significa que bajaron. Lo que el problema requiere es que por cada
persona se imprima un letrero que diga: "SUBIO" o "BAJO" y la cantidad de kilos que subió o bajo de peso.
12. Se desea obtener el promedio de 9 grupos que están en un mismo año escolar; siendo que cada grupo
puede tener n alumnos que cada alumno puede llevar m materias y que en todas las materias se
promedian tres calificaciones para obtener el promedio de la materia. Lo que se desea desplegar es el
promedio de los grupos, el promedio de cada grupo y el promedio de cada alumno

Ciclo do-while
Es similar al Ciclo while pero con la particularidad de que la evaluación de la condición se hace al final del ciclo,
por lo que está garantizado que las instrucciones se ejecutan al menos la primera vez. do - while ejecuta las
instrucciones luego se evalúa la condición: si resulta verdadera se vuelven a ejecutar las instrucciones; si la
condición es falsa entonces finaliza el ciclo. Este ciclo se utiliza con frecuencia para la implementación de un
menú.
do { instrucción1;
instrucción2;
...
instrucciónN;
} while (Expresión);

Ejemplo de la Estructura Iterativa do-while


import java.io.*; import java.util.Random;
public class EstructuraDoWhile{ public
static void main(String[] args) {
InputStreamReader teclado = new InputStreamReader(System.in);
BufferedReader lector = new BufferedReader(teclado);
String auxiliar=new String();
Random azar=new Random();
int maquina=azar.nextInt(1000);
int usuario=1, intentos=0;
do{
System.out.println("Escribe un numero");
try{
auxiliar = lector.readLine();
Integer objetoEntero=new Integer(auxiliar);
usuario=objetoEntero.intValue();
}
catch (IOException excep) {
System.out.println("Error");
}
intentos++;
if (usuario!=maquina)
if( usuario> maquina)
System.out.println("El numero de la maquina es menor");
else
System.out.println("El numero de la maquina es mayor");
}while(usuario!=maquina);
System.out.println("Adivinaste en " + intentos + " intentos");
}
}

Problemas do … while
1. En una tienda de descuento las personas que van a pagar el importe de su compra llegan a la caja y sacan
una bolita de color, que les dirá que descuento tendrán sobre el total de su compra. Determinar la
cantidad que pagara cada cliente desde que la tienda abre hasta que cierra. Se sabe que si el color de la
bolita es roja el cliente obtendrá un 40% de descuento; si es amarilla un 25% y si es blanca no obtendrá
descuento.
2. En un supermercado un ama de casa pone en su carrito los artículos que va tomando de los estantes. La
señora quiere asegurarse de que el cajero le cobre bien lo que ella ha comprado, por lo que cada vez que
toma un articulo anota su precio junto con la cantidad de artículos iguales que ha tomado y determina
cuánto dinero gastara en ese artículo; a esto le suma lo que ira gastando en los demás artículos, hasta
que decide que ya tomo todo lo que necesitaba. Ayúdale a esta señora a obtener el total de sus compras.
3. Un teatro otorga descuentos según la edad del cliente. determinar la cantidad de dinero que el teatro
deja de percibir por cada una de las categorías. Tomar en cuenta que los niños menores de 5 años no
pueden entrar al teatro y que existe un precio único en los asientos. Los descuentos se hacen tomando
en cuenta el siguiente cuadro:
Edad Descuento

Categoría 1 5 –14 35 %

Categoría 2 15- 19 25 %

Categoría 3 20- 45 10 %

Categoría 4 46 –65 25 %

Categoría 5 66 en adelante 35 %

4. La presión, volumen y temperatura de una masa de aire se relacionan por la formula:


masa= presión * volumen .
0.37 * (temperatura + 460)
Calcular el promedio de masa de aire de los neumáticos de n vehículos que están en compostura en un
servicio de alineación y balanceo. Los vehículos pueden ser motocicletas o automóviles.
5. Determinar la cantidad semanal de dinero que recibirá cada uno de los n obreros de una empresa. Se
sabe que cuando las horas que trabajo un obrero exceden de 40, el resto se convierte en horas extras que
se pagan al doble de una hora normal, cuando no exceden de 8; cuando las horas extras exceden de 8 se
pagan las primeras 8 al doble de lo que se paga por una hora normal y el resto al triple.
6. En una granja se requiere saber alguna información para determinar el precio de venta por cada kilo de
huevo. Es importante determinar el promedio de calidad de las n gallinas que hay en la granja. La calidad
de cada gallina se obtiene según la fórmula :
calidad = (peso de la gallina * altura de la gallina) / # de huevos que pone
Finalmente para fijar el precio del kilo de huevo, se toma como base la siguiente tabla:
PRECIO TOTAL DE CALIDAD PESO POR KILO DE HUEVO

mayor O igual que 15 1.2 * promedio de calidad

mayor que 8 y menor que 15 1.00 * promedio de calidad

menor o igual que 8 0.80 * promedio de calidad

7. En la Cámara de Diputados se levanta una encuesta con todos los integrantes con el fin de determinar
qué porcentaje de los n diputados está a favor del Tratado de Libre Comercio, que porcentaje está en
contra y que porcentaje se abstiene de opinar.
8. Una persona que va de compras a la tienda "Enano, S.A.", decide llevar un control sobre lo que va
comprando, para saber la cantidad de dinero que tendrá que pagar al llegar a la caja. La tienda tiene una
promoción del 20% de descuento sobre aquellos artículos cuya etiqueta sea roja. Determinar la cantidad
de dinero que esta persona deberá pagar.
9. Un censador recopila ciertos datos aplicando encuestas para el último Censo Nacional de Población y
Vivienda. Desea obtener de todas las personas que alcance a encuestar en un día, que porcentaje tiene
estudios de primaria, secundaria, carrera técnica, estudios profesionales y estudios de posgrado.
10. Un jefe de casilla desea determinar cuántas personas de cada una de las secciones que componen su zona
asisten el día de las votaciones. Las secciones son: norte, sur y centro. También desea determinar cuál es
la sección con mayor número de votantes.
11. Un negocio, de copias tiene un límite, de producción, diaria de 10 000 copia si el tipo de impresión es
offset y de 50000 Si el tipo es estándar. SI hay una solicitud de un empleado tiene que verificar que las
copias pendientes hasta el momento y las copias solicitadas no excedan del límite de producción. Si el
límite de producción se excediera el trabajo solicitado no podría ser aceptado. El empleado necesita llevar
un buen control de las copias solicitadas hasta el momento para decidir en forma, rápida si los trabajos
que se soliciten en el día se deben aceptar o no.
12. Calcular la suma siguiente: 100 + 98 + 96 + 94 + ...+ 0 en este orden
13. Leer 50 calificaciones de un grupo de alumnos. Calcule y escriba el porcentaje de reprobados. Tomando
en cuenta que la calificación mínima aprobatoria es de 70.
14. Leer por cada alumno de Diseño estructurado de algoritmos su número de control y su calificación en
cada una de las 5 unidades de la materia. Al final que escriba el numero de control del alumno que obtuvo
mayor promedio. Suponga que los alumnos tienen diferentes promedios.
15. El profesor de una materia desea conocer la cantidad de sus alumnos que no tienen derecho al examen
de nivelación. Diseñe un algoritmo que lea las calificaciones obtenidas en las 5 unidades por cada uno de
los 40 alumnos y escriba la cantidad de ellos que no tienen derecho al examen de nivelación.
16. Leer los 250,000 votos otorgados a los 3 candidatos a gobernador e imprimir el número del candidato
ganador y su cantidad de votos.
Suponga que tiene usted una tienda y desea registrar las ventas en su computadora. Diseñe un algoritmo
que lea por cada cliente, el monto total de su compra. Al final del día que escriba la cantidad total de
ventas y el número de clientes atendidos

3.5 Encapsulamiento
¿Qué es el encapsulamiento?
En el contexto del lenguaje de programación, la encapsulamiento es usada para encerrar en una clase los
atributos y métodos que lógicamente pertenezcan a la misma característica. La clase control el acceso a estos
atributos encerrados proporcionando métodos públicos para actuar sobre las variables encerradas. El
encapsulamiento provee de un número de ventajas:

• Porque el acceso ofrecido a través de una interface, los componentes pueden mantenerse seguros de
interferencias y mal uso.

• Mientras la interfaz no es modificada, los componentes pueden ser cambiados sin afectar a los usuarios
de la interfaz.

• La encapsulamiento facilita el rehusó de objetos. El usuario no está afectando por cualquier cambio a los
componentes del objeto.
Para el software de computadora, una encapsulación es un componente de software. La integridad del
componente de software como una encapsulación es dependiente de aspectos del lenguaje de computadora
en el que se implementa el componente.
Encapsulación es un concepto importante para el desarrollo de soluciones del problema que son menos
susceptibles a los errores. Un problema es particionado en un número de componentes. Cada componente es
encapsulado para interactuar recíprocamente con los otros componentes únicos de manera cuidadosamente
prescribidas, como definidas por su interface.
En un problema orientado a objetos que resuelve la unidad de encapsulación es el objeto. Los objetos son
abstracciones encapsuladas.
Combinación de principios
La encapsulación es la combinación de los principios de ingeniería de software de modularidad, localización,
y ocultamiento de información. Cada una de estas es muy importante para el desarrollo de un sistema
eficiente, formal y sostenible.

• Modularidad: El propósito determinado es particionar requerimientos, el diseño, y software en


colecciones o grupos de complejidad y tamaño apropiado, uniforme con las metas de ingeniería de
software. Se usa para construir componentes más grandes y operaciones más pequeñas en el diseño
orientado a objetos que cuando se usan métodos funcionales debido a que:
o Los módulos: Son creados para abstracciones del objeto más que abstracciones funcionales
o Las operaciones: Se deben asignarse y encapsularse dentro del objeto y clase.
• Localización: El propósito determinado es particionar requerimientos, el diseño y software así que los
recursos lógicamente ligados son físicamente agrupados para aumentar la cohesión y para decrecer el
acoplamiento. Es más importante localizar una abstracción completa que crear un módulo pequeño.

• Ocultamiento de Información: Es la consideración del ocultamiento de información a fin de promover la


abstracción, soporte al desarrollo ascendente/descendente, protege contra la corrupción accidental, y
promociona el logro de metas de ingeniería de software. Los recursos de un componente deberían
ocultarse a menos que específicamente se necesiten por otro componente. Los datos globales comunes
no son usados, pero más bien los atributos se ocultan dentro de objetos y las clases. Cada componente
debería dividirse en 2 partes desarrolladas separadamente: la especificación y el cuerpo.
Ejemplo de una frutería
Considera el ejemplo de una frutería de autoservicio, la fruta es libremente tomada por los clientes ellos no
necesitan preguntar al comerciante para obtener la fruta, porque la característica es de autoservicio, el
comerciante no tiene control sobre quien toma la fruta. En este ejemplo de autoservicio la fruta puede ser
pensada que se tiene acceso al público.
Si la característica de autoservicio de la frutería es eliminada, entonces los consumidores deben utilizar al
comerciante para obtener fruta. La fruta en este ejemplo puede ser pensado como un acceso privado.
Puede solo ser accesados a través de métodos de clase en este caso el comerciante.
Ejemplo del banco
Considera un banco. El cual guarda todos los depósitos de dinero en una bóveda. Piensa en esto como si fueran
los datos. El banco tiene procedimientos para accesar al dinero del cliente guardado en la bóveda. Llama a
estos el procedimiento de depósito y el procedimiento de retiro. Asuma que el banco no hace cumplir los
procedimientos pero sus clientes siguen confiando. Depositarías tus ahorros en tal banco donde los clientes
pueden desobedecer los procedimientos (en otra palabras crear sus propios procedimientos) y ayudarse a
tomar el contenido de la bóveda. Esto es un escenario no encapsulado y representa la falta de habilidad de
lenguajes procedurales para restringir que procedimientos son permitidos para operar sobre los datos.
En contraste, considera lo que realmente sucede en un banco. El procedimiento de depósito y el
procedimiento de retiro son operados por los propios empleados del banco, llamado cajero del banco. Se
tiene acceso restringido a los métodos de depósito y retiro los cuales son operados por los empleados del
banco a nombre de los clientes. Esto es un escenario encapsulado similar al que se ofrece en los lenguajes
orientados a objetos a través del elemento sintáctico conocido como la declaración de la clase.
Mecanismos de encapsulamiento de la Tecnología Java
El lenguaje de programación de Java ofrece la encapsulamiento a través de los siguientes mecanismos:

El mecanismo de paquete
El lenguaje de programación de Java ofrece el mecanismo de paquete como un camino para agrupar
clases relacionadas. Puede indicar que la clase de un archivo fuente pertenecen a un paquete particular
usando la declaración package. Por ejemplo:
// Class Employee of the Finance department for t the
// ABC company package
abc.financeDept;
public class Employee {
...
}
La declaración package, debe estar al comienzo del archivo fuente. Puede precederlo con un espacio y
comentarios pero nada más. Solo la declaración de un paquete es permitida, y este gobierna
completamente el archivo fuente.
Si la declaración package falta, entonces se dice que pertenece al paquete por defecto.

El constructor de clase
El constructor de la clase es el mecanismo que une el código y los datos que este manipula, y mantiene a
ambos seguros de la interferencia y mal uso. Además para proteger los datos de un objeto de una
modificación inapropiada, el usuario forzará a accesar el dato a través de un método que permite a una
clase ser reutilizada más fácilmente asegurando que los efectos requeridos sean correctamente
manejados.
Encapsulamiento usando el mecanismo de paquete
Una clase para que sea visible fuera de su paquete, debe ser declarada con el modificador public. Si no declaras
una clase con el modificador public, puedes usar el mecanismo de paquete para ocultar o encapsular la clase
de todas las clases que no pertenecen al mismo paquete.
Desde una perspectiva de encapsulamiento, una clase pertenece o no a un paquete.
El primer paso en la encapsulamiento para las clases es crear una clase que agrupe variables y métodos que
operen sobre las variables. El segundo paso es restringir el acceso por otras clases a las variables y métodos
de esta clase. Esto es logrado usando las siguientes palabras modificadoras de control de acceso:

• El modificador private
• Default Access
• El modificador protected
• El public Keyword
Criterio de accesibilidad
modificador Misma clase Mismo paquete Subclase Universo

public Si Si Si Si

protecte Si Si Si

default Si Si

private Si

Código de encapsulamiento
En el siguiente ejemplo todos los métodos de la clase Account tienen acceso público, haciéndolo accesible
desde cualquier clase de un paquete. Sin embargo, las dos variables name y amount tienen acceso privado.
Ellas solo pueden ser accesados directamente por la clase en la cual son definidas (la clase Acount). Cualquier
otra clase (independientemente de la relación de la subclase o su paquete) puede solo accesar estas variables
a través de métodos públicos que provee la clase Account.
public class Account { private
String name; private double
amount; public Account(String
owner) { name = owner;
}
public String getName() { return
name;
}
public void deposit(double sum) {
if (sum > 0) { amount =
amount + sum;
} }
public void withdraw(double sum) {
if (sum > 0) { amount =
amount - sum;
} }
public double balance() { return
amount;
}
}

3.6 Herencia
Composición
En anteriores ejemplos se ha visto que una clase tiene datos miembro que son instancias de otras clases. Por
ejemplo:
class Circulo {
Punto centro; int
radio; float
superficie() {
return 3.14 * radio * radio;
}
}

Esta técnica en la que una clase se compone o contiene instancias de otras clases se denomina composición.
Es una técnica muy habitual cuando se diseñan clases. En el ejemplo diríamos que un Círculo tiene un Punto
(centro) y un radio.
Herencia
Pero además de esta técnica de composición es posible pensar en casos en los que una clase es una extensión
de otra. Es decir una clase es como otra y además tiene algún tipo de característica propia que la distingue.
Por ejemplo podríamos pensar en la clase Empleado y definirla como:
class Empleado { String nombre;
int numEmpleado , sueldo; static
private int contador = 0;
Empleado(String nombre, int sueldo) {
this.nombre = nombre; this.sueldo
= sueldo; numEmpleado =
++contador;
}
public void aumentarSueldo(int porcentaje) {
sueldo += (int)(sueldo * aumento / 100);
}
public String toString() {
return "Num empleado "+numEmpleado+" Nombre: "+nombre+“ Sueldo:"+sueldo;
}
}

En el ejemplo el Empleado se caracteriza por un nombre (String) y por un número de empleado y sueldo
(enteros). La clase define un constructor que asigna los valores de nombre y sueldo y calcula el número de
empleado a partir de un contador (variable estática que siempre irá aumentando), y dos métodos, uno para
calcular el nuevo sueldo cuando se produce un aumento de sueldo (método aumentarSueldo) y un segundo
que devuelve una representación de los datos del empleado en un String.(método toString).
Con esta representación podemos pensar en otra clase que reúna todas las características de Empleado y
añada alguna propia. Por ejemplo, la clase Ejecutivo. A los objetos de esta clase se les podría aplicar todos los
datos y métodos de la clase Empleado y añadir algunos, como por ejemplo el hecho de que un Ejecutivo tiene
un presupuesto.
Así diríamos que la clase Ejecutivo extiende o hereda la clase Empleado. Esto en Java se hace con la clausula
extends que se incorpora en la definición de la clase, de la siguiente forma:
class Ejecutivo extends Empleado {
int presupuesto;
void asignarPresupuesto(int p) {
presupuesto = p;
}
}

Con esta definición un Ejecutivo es un Empleado que además tiene algún rasgo distintivo propio. El cuerpo de
la clase Ejecutivo incorpora sólo los miembros que son específicos de esta clase, pero implícitamente tiene
todo lo que tiene la clase Empleado.
A Empleado se le llama clase base o superclase y a Ejecutivo clase derivada o subclase.
Los objetos de las clases derivadas se crean igual que los de la clase base y pueden acceder tanto sus datos y
métodos como a los de la clase base. Por ejemplo:
Ejecutivo jefe = new Ejecutivo( "Armando Mucho", 1000);
jefe.asignarPresupuesto(1500); jefe.aumentarSueldo(5);

Atención!: Un Ejecutivo ES un Empleado, pero lo contrario no es cierto. Si escribimos:


Empleado curri = new Empleado ( "Esteban Comex Plota" , 100) ;
curri.asignarPresupuesto(5000); // error
Se producirá un error de compilación pues en la clase Empleado no existe ningún método llamado
asignarPresupuesto.
Redefinición de métodos. El uso de super.
Además se podría pensar en redefinir algunos métodos de la clase base pero haciendo que métodos con el
mismo nombre y características se comporten de forma distinta. Por ejemplo podríamos pensar en rediseñar
el método toString de la clase Empleado añadiendo las características propias de la clase Ejecutivo. Así se
podría poner:
class Ejecutivo extends Empleado {
int presupuesto;
void asignarPresupuesto(int p) {
presupuesto = p;
}
public String toString() { String
s = super.toString(); s = s + "
Presupuesto: " + presupuesto; return
s;
}
}

De esta forma cuando se invoque jefe.toString() se usará el método toString de la clase Ejecutivo en lugar del
existente en la clase Empleado.
Observese en el ejemplo el uso de super, que representa referencia interna implícita a la clase base
(superclase). Mediante super.toString() se invoca el método toString de la clase Empleado
Inicialización de clases derivadas
Cuando se crea un objeto de una clase derivada se crea implicitamente un objeto de la clase base que se
inicializa con su constructor correspondiente. Si en la creación del objeto se usa el constructor no-args,
entonces se produce una llamada implicita al constructor no-args para la clase base. Pero si se usan otros
constructores es necesario invocarlos explicitamente.
En nuestro ejemplo dado que la clase método define un constructor, necesitaremos también un constructor
para la clase Ejecutivo, que podemos completar así:
class Ejecutivo extends Empleado {
int presupuesto;
Ejecutivo (String n, int s) {
super(n,s);
}
void asignarPresupuesto(int p) {
presupuesto = p;
}
public String toString() { String
s = super.toString(); s = s + "
Presupuesto: " + presupuesto; return
s;
}
}

Observese que el constructor de Ejecutivo invoca directamente al constructor de Empleado mediante


super(argumentos). En caso de resultar necesaria la invocación al constructor de la superclase debe ser la
primera sentencia del constructor de la subclase.
El modificador de acceso protected
El modificador de acceso protected es una combinación de los accesos que proporcionan los modificadores
public y private. protected proporciona acceso público para las clases derivadas y acceso privado (prohibido)
para el resto de clases.
Por ejemplo, si en la clase Empleado definimos:
class Empleado {
protected int sueldo;
. . .
}

Entonces desde la clase Ejecutivo se puede acceder al dato miembro sueldo, mientras que si se declara private
no.
Up-casting y Down-casting

Siguiendo con el ejemplo de los apartados anteriores, dado que un Ejecutivo ES un Empleado se puede escribir
la sentencia:
Empleado emp = new Ejecutivo("Máximo Dueño" , 2000);

Aquí se crea un objeto de la clase Ejecutivo que se asigna a una referencia de tipo Empleado. Esto es posible
y no da error ni al compilar ni al ejecutar porque Ejecutivo es una clase derivada de Empleado. A esta operación
en que un objeto de una clase derivada se asigna a una referencia cuyo tipo es alguna de las superclases se
denomina 'upcasting'.
Cuando se realiza este tipo de operaciones, hay que tener cuidado porque para la referencia emp no existen
los miembros de la clase Ejecutivo, aunque la referencia apunte a un objeto de este tipo. Así, las expresiones:
emp.aumentarSueldo(3); // 1. ok. aumentarSueldo es de Empleado
emp.asignarPresupuesto(1500); // 2. error de compilación

En la primera expresión no hay error porque el método aumentarSueldo está definido en la clase Empleado.
En la segunda expresión se produce un error de compilación porque el método asignarPresupuesto no

existe para la clase Empleado.

Por último, la situación para el método toString es algo más compleja. Si se invoca el método:
emp.toString(); // se invoca el metodo toString de Ejecutivo

El método que resultará llamado es el de la clase Ejecutivo. toString existe tanto para Empleado como para
Ejecutivo, por lo que el compilador Java no determina en el momento de la compilación que método va a
usarse. Sintácticamente la expresión es correcta. El compilador retrasa la decisión de invocar a un método o
a otro al momento de la ejecución. Esta técnica se conoce con el nombre de dinamic binding o late binding.
En el momento de la ejecución la JVM comprueba el contenido de la referencia emp. Si apunta a un objeto de
la clase Empleado invocará al método toString de esta clase. Si apunta a un objeto Ejecutivo invocará por el
contrario al método toString de Ejecutivo.
Operador cast
Si se desea acceder a los métodos de la clase derivada teniendo una referencia de una clase base, como en el
ejemplo del apartado anterior hay que convertir explicitamente la referencia de un tipo a otro. Esto se hace
con el operador de cast de la siguiente forma:
Empleado emp = new Ejecutivo("Máximo Dueño" , 2000);
Ejecutivo ej = (Ejecutivo)emp; // se convierte la referencia de tipo
ej.asignarPresupuesto(1500);

La expresión de la segunda línea convierte la referencia de tipo Empleado asignándola a una referencia de tipo
Ejecutivo. Para el compilador es correcto porque Ejecutivo es una clase derivada de Empleado. En tiempo de
ejecución la JVM convertirá la referencia si efectivamente emp apunta a un objeto de la clase Ejecutivo. Si se
intenta:
Empleado emp = new Empleado("Javier Todudas" , 2000);
Ejecutivo ej = (Ejecutivo)emp;

No dará problemas al compilar, pero al ejecutar se producirá un error porque la referencia emp apunta a un
objeto de clase Empleado y no a uno de clas Ejecutivo.
La clase Object
En Java existe una clase base que es la raíz de la jerarquía y de la cual heredan todas aunque no se diga
explicitamente mediante la clausula extends. Esta clase base se llama Object y contiene algunos métodos
básicos. La mayor parte de ellos no hacen nada pero pueden ser redefinidos por las clases derivadas para
implementar comportamientos específicos. Los métodos declarados por la clase Object son los siguientes:
public class Object {
public final Class getClass() { . . . }
public String toString() { . . . } public
boolean equals(Object obj) { . . . }
public int hashCode() { . . . }
protected Object clone() throws CloneNotSupportedException { . . . } public final
void wait() throws IllegalMonitorStateException, InterruptedException { . .
. }
public final void wait(long millis) throws
IllegalMonitorStateException, nterruptedException {. . .}
public final void wait(long millis, int nanos) throws IllegalMonitorStateException,
InterruptedException { . . . }
public final void notify() throws IllegalMonitorStateException { . . . }
public final void notifyAll() throws IllegalMonitorStateException { . . . }
protected void finalize() throws Throwable { . . . }
}
Las cláusulas final y throws se verán más adelante. Como puede verse toString es un método de Object, que
puede ser redefinido en las clases derivadas. Los métodos wait, notify y notifyAll tienen que ver con la gestión
de threads de la JVM. El método finalize ya se ha comentado al hablar del recolector de basura. Para una
descripción exahustiva de los métodos de Object se puede consultar la documentación de la API del JDK.
La cláusula final
En ocasiones es conveniente que un método no sea redefinido en una clase derivada o incluso que una clase
completa no pueda ser extendida. Para esto está la cláusula final, que tiene significados levemente distintos
según se aplique a un dato miembro, a un método o a una clase.
Para una clase, final significa que la clase no puede extenderse. Es, por tanto el punto final de la cadena de
clases derivadas. Por ejemplo si se quisiera impedir la extensión de la clase Ejecutivo, se pondría:
final class Ejecutivo {
. . . }

Para un método, final significa que no puede redefinirse en una clase derivada. Por ejemplo si declaramos:
class Empleado {
. . .
public final void aumentarSueldo(int porcentaje) {
. . .
}
. . .
}

Entonces la clase Ejecutivo, clase derivada de Empleado no podría reescribir el método aumentarSueldo, y por
tanto cambiar su comportamiento.
Para un dato miembro, final significa también que no puede ser redefinido en una clase derivada, como para
los métodos, pero además significa que su valor no puede ser cambiado en ningún sitio; es decir el modificador
final sirve también para definir valores constantes. Por ejemplo:
class Circulo {
. . .
public final static float PI = 3.141592;
. . .
}

En el ejemplo se define el valor de PI como de tipo float, estático (es igual para todas las instancias), constante
(modificador final) y de acceso público.
Herencia simple
Java incorpora un mecanismo de herencia simple. Es decir, una clase sólo puede tener una superclase directa
de la cual hereda todos los datos y métodos. Puede existir una cadena de clases derivadas en que la clase A
herede de B y B herede de C, pero no es posible escribir algo como: class A extends B , C .... // error

Este mecanismo de herencia múltiple no existe en Java.


Java implanta otro mecanismo que resulta parecido al de herencia múltiple que es el de las interfaces que se
verá más adelante.

3.7 Polimorfismo
La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. En programación
orientada a objetos el polimorfismo se refiere a la posibilidad de definir clases diferentes que tienen métodos
o atributos denominados de forma idéntica, pero que se comportan de manera distinta.
Por ejemplo, podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase
Animal tiene el método abstracto mover que se implementa de forma distinta en cada una de las subclases
(peces y aves se mueven de forma distinta).
Como se mencionó anteriormente, el concepto de polimorfismo se puede aplicar tanto a funciones como a
tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son
aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los
tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo
no está especificado.

Clasificación
Se puede clasificar el polimorfismo en dos grandes clases:

• Polimorfismo dinámico (o polimorfismo paramétrico) es aquél en el que el código no incluye ningún tipo
de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de
datos compatible.

• Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el
polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados. El
polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como programación
genérica.
También se clasifica en herencia por redefinición de métodos abstractos y por método sobrecargado. El
segundo hace referencia al mismo método con diferentes parámetros.
Otra clasificación agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez sobrecarga de operadores
y coerción, Universal (inclusión o controlado por la herencia, paramétrico o genericidad).
Ejemplo de polimorfismo
En este ejemplo haremos uso del lenguaje C++ para mostrar el polimorfismo. También se hará uso de las
funciones virtuales puras de este lenguaje, aunque para que el polimorfismo funcione no es necesario que las
funciones sean virtuales puras, es decir, perfectamente el código de la clase "superior" (en nuestro caso
Empleado) podría tener código
class Empleado { protected:
static const unsigned int SUELDO_BASE = 700;
// Supuesto sueldo base para todos public:
/* OTROS MÉTODOS */
virtual unsigned int sueldo() = 0;
};
class Director : public Empleado { public:
/* OTROS MÉTODOS */
unsigned int sueldo() { return SUELDO_BASE*100; }
};
class Ventas : public Empleado { private:
unsigned int ventas_realizadas;
// Contador de ventas realizadas por el vendedor public:
/* OTROS MÉTODOS */ unsigned int sueldo() {
return SUELDO_BASE + ventas_realizadas*60; }
};
class Mantenimiento : public Empleado { public:
/* OTROS MÉTODOS */ unsigned
int sueldo() { return
SUELDO_BASE + 300;
}
};
class Becario : public Empleado { private:
bool jornada_completa;
// Indica si el becario trabaja a jornada completa
public:
/* OTROS MÉTODOS */
unsigned int sueldo() {
if (jornada_completa)
return SUELDO_BASE/2;
else
return SUELDO_BASE/4;
}
};
/* AHORA HAREMOS USO DE LAS CLASES */ int
main() {
Empleado* e[4]; // Punteros a Empleado
Director d;
Ventas v; // Estas dos las declararemos como objetos normales en la pila
e[0] = &d;
// Asignamos a un puntero a Empleado la dirección de un objeto del tipo
Director e[1] = &v; // Lo mismo con Ventas e[2] = new Mantenimiento(); e[3]
= new Becario(); unsigned int sueldo = 0; for (int i = 0; i < 4; ++i) sueldo
+= e[i]->sueldo();
cout<<"Este mes vamos a gastar " << sueldo << " dinero en sueldos" << endl;
}

Polimorfismo desde una interfaz


Aunque el polimorfismo es el mismo se aplique donde se aplique, el modo en que se aplica desde una interfaz
puede resultar un poco más oscuro y difícil de entender. Se expone un sencillo ejemplo (en VB-NET)
comentado para entender como funciona aplicado desde una interfaz, primero se escribe el código y luego se
comenta el funcionamiento. Nota: para no enturbiar el código en exceso, todo lo que no se declara privado
se sobreentiende público.
' Declaramos una interfaz llamada IOperar y declaramos una función llamada Operar '
que implementarán las clases deseadas:
Interface IOperar
Function Operar(valor1 as integer, valor2 as integer) as long
End Interface
'Declaramos una clase que trabaja más alejada del usuario y que contendría 'funciones
comunes para las siguiente clase, si no fueran idénticas irían en la
'interfaz, pero al caso de mostrar el polimorfismo se suponen idénticas:
Class Operacion
Function Calcular(clasellamante as Object) as Long
'aquí iría el código común a todas las operaciones.... que llaman a
'esa función por ejemplo recoger los 2 valores de la operación,
'chequear que están en el rango deseado, etc., se supone que la
'función inputValor recoge un valor de algún
sitio valor1 as integer = inputValor() valor2
as integer = inputValor() op as New IOperar =
clasellamante
Return op.Operar(valor1,valor2)
'AQUÍ es donde se utiliza el polimorfismo.
End Function
End Class
'Declaramos 2 clases: Sumar y Resta que implementan la interfaz y que llaman a la
'clase Operacion:
Class Sumar
Implements IOperar
Private Function Operar(valor1 as Integer, valor2 as Integer) as
Long Implements IOperar.Operar
Return valor1 + valor2
End Function
Function Calcular() as Long op
as New operacion
Return op.Calcular(Me)
'Se está llamando a la función Calcular de la clase Operación
End Function
End Class
' segunda clase....
Class Restar
Implements IOperar
Private Function Operar(valor1 as Integer, valor2 as Integer) as Long
Implements IOperar.Operar
Return valor1 - valor2 End
Function
Function Calcular() as Long op
as New operacion
return op.Calcular(Me) 'Se está llamando a la función Calcular de 'la
clase Operación
End Function
End Class

Analicemos ahora el código para entender el polimorfismo expuesto en la interfaz: La interfaz expone un
método que puede ser implementado por las diferentes clases, normalmente relacionadas entre sí. Las clases
Sumar y Restar implementan la interfaz pero el método de la interfaz lo declaramos privado para evitar ser
accedido libremente y además tienen un método llamado Calcular que llama a la clase Operación donde
tenemos otro método con el mismo nombre. Es esta clase última la que realiza el polimorfismo y debe fijarse
como es a través de una instancia de la interfaz que llama al método operar. La interfaz sabe a qué método
de qué clase llamar desde el momento que asignamos un valor a la variable OP en el método Calcular de la
clase Operación, que a sé vez recibió la referencia del método Calcular desde la clase que la llama, sea está
cual sea se identifica a sí misma, mediante la referencia Me ó This según el lenguaje empleado. Debe notarse
que la instancia de la interfaz accede a sus métodos aunque en sus clases se hayan declarado privadas.
Polimorfismo de sobrecarga
El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad
similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases
secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener
la función "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que
estamos trabajando si todo lo que deseamos es verlo en la pantalla.
Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varían de
acuerdo a los parámetros que se les aplican. Así es posible, por ejemplo, agregar el operador + y hacer que se
comporte de manera distinta cuando está haciendo referencia a una operación entre dos números enteros
(suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenación).
Polimorfismo paramétrico
El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero
usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente
el método correcto a aplicar en función del tipo de datos pasados en el parámetro.
Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de addition() efectuando una suma de
valores.

• El método int addition(int,int) devolvería la suma de dos números enteros.


• float addition(float, float) devolvería la suma de dos flotantes.
• char addition(char, char) daría por resultado la suma de dos caracteres definidos por el autor, etc. Una
signature es el nombre y tipo (estático) que se da a los argumentos de una función. Por esto, una firma
de método determina qué elemento se va a llamar.
Polimorfismo de subtipado
La habilidad para redefinir un método en clases que se hereda de una clase base se llama especialización. Por
lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo
de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos,
enmascarándolos con una interfaz común (siendo esta la clase básica).
Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y peón, cada uno heredando el
objeto pieza.
El método movimiento podría, usando polimorfismo de subtipado, hacer el movimiento correspondiente de
acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener
que verse conectado con cada tipo de pieza en particular.
Diferencias entre polimorfismo y sobrecarga

• El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante ventajoso aplicado desde las
interfaces, ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes (imaginemos
que deseamos añadir una clase Multiplicar), basta con recompilar todo el código que incluye los nuevos
tipos añadidos. Si se hubiera recurrido a la sobrecarga durante el diseño exigiría retocar la clase
anteriormente creada al añadir la nueva operación Multiplicar, lo que además podría suponer revisar todo
el código donde se instancia a la clase.

• La sobrecarga se da siempre dentro de una sola clase, mientras que el polimorfismo se da entre clases
distintas.
Un método está sobrecargado si dentro de una clase existen dos o más declaraciones de dicho método con el
mismo nombre pero con parámetros distintos, por lo que no hay que confundirlo con polimorfismo
U n i d a d IV
Arreglos
Objetivo de la Unidad:
El alumno implementará arreglos, para manejar conjuntos de elementos

4.1 Definición de Arreglos


Un arreglo en Java es un grupo de posiciones de memoria contiguas, todas las cuales tienen el mismo nombre
y el mismo tipo.
Un arreglo es un agregado homogéneo ya que combina un conjunto de datos del mismo tipo.
Los arreglos ocupan espacio en memoria. En java se usa el operador new para asignar espacio de
almacenamiento al número de elementos requerido por cada arreglo.
Un arreglo empieza en 0, es decir, la primer localidad del arreglo es la localidad 0. Ejemplo
int a[ ] = new int a[6];
Por tanto, si un arreglo tiene n componentes, la última localidad está dada por n-1.

Para referirnos a una posición o elemento en particular del arreglo, especificamos el nombre del arreglo y el
número de posición de ese elemento en el arreglo. Ejemplo
a[i] = 0; a[0][3]=
9;

Los arreglos en Java son dinámicos, pero no extensibles, lo cual significa que deben ser creados con el tamaño
que tendrán hasta el final de su vida.
Algunas de sus características más importantes de los arrays son las siguientes:
1. Los arrays se crean con el operador new seguido del tipo y número de elementos.
2. Se puede acceder al número de elementos de un array con la variable miembro implícita length (por
ejemplo, vect.length).
3. Se accede a los elementos de un array con los corchetes [] y un índice que varía de length-1.
4. Se pueden crear arrays de objetos de cualquier tipo. En principio un array de objetos es un array de
referencias que hay que completar llamando al operador new.
5. Los elementos de un array se inicializan al valor por defecto del tipo correspondiente (cero para valores
numéricos, el carácter nulo para char, false para boolean, null para Strings y para referencias).
6. Como todos los objetos, los arrays se pasan como argumentos a los métdodos por referencia.
7. Se pueden crear arrays anónimos (por ejemplo, crear un nuevo array como argumento actual en la
llamada a un método).
Inicialización de arrays
1. Los arrays se pueden inicializar con valores entre llaves {...} separados por comas.
2. También los arrays de objetos se pueden inicializar con varias llamadas a new dentro de unas llaves {...}.
3. Si se igualan dos referencias a un array no se copia el array, sino que se tiene un array con dos nombres,
apuntando al mismo y único objeto.
4. Creación de una referencia a un array. Son posibles dos formas:
double[] x; // preferible double
x[];

5. Creación del array con el operador new: x = new double[100];

6. Las dos etapas 4 y 5 se pueden unir en una sola: double[] x = new double[100];

Descubre el error
A continuación se presentan una serie de códigos los cuales pueden poseer alguna clase de error, puedes
identificarlos y corregirlos???
int v = new int[10]; v[i]=i+5;
for(int i=0; i<10, i++); int
[][] mat = new int();
int [] b = {{1, 2, 3}, {4, 5, 6}, };// esta coma es permitida

Problemas con Arreglos


En todos los casos, A es el nombre de la variable declarada:
1. Declaración de un arreglo de 50 enteros
2. Declaración de un arreglo de 100 caracteres
3. Declaración e inicialización de un arreglo de 10 enteros
4. Inicialización parcial: El resto se inicializa en cero
5. Declaración e inicialización de un arreglo de 10 caracteres
6. Asignando un valor a la sexta posición de un arreglo de enteros
7. Imprimiendo un arreglo de 100 enteros mediante un ciclo for
8. Leyendo del usuario el contenido de un arreglo de 20 enteros, mediante un ciclo for

En todos los casos, matriz es el nombre de la variable declarada:


1. Declaración de una matriz de 50 filas de 20 enteros
2. Declaración e inicialización de una matriz
3. Asignando un valor a la primera posición de la segunda
4. Imprimiendo una matriz de 100x50 enteros mediante un ciclo for
5. Imprimiendo una matriz de NxN enteros mediante un ciclo for

4.2 Manejo de arreglos


Un arreglo se declara de la siguiente forma:
<tipo>[] <nombre>;

O sea, para declarar, por ejemplo, un arreglo de números enteros utilizaremos la siguiente sentencia: int[]

arrInt;

Es importante notar que el arreglo aún no ha sido creado, sino meramente declarado. Para crear el arreglo
(reservar su memoria e inicializarlo) deberemos recurrir al operador new: arrInt = new int[10];

Este comportamiento debe comprenderse de esta forma: en Java todo es un objeto, y los objetos deben ser
creados mediante el operador new. El caso de los arreglos no es diferente, el tipo de datos del arreglo (int[]
en este caso) es una clase y cada una de sus instancias debe ser creada explícitamente, el tamaño puede
pensarse como un parámetro al constructor de la clase.
A partir de este momento podemos utilizar arrInt como un arreglo de cualquier otro lenguaje.
Una de las características que hacen de Java un entorno de programación seguro, y que se relaciona con el
manejo de los arreglos es que el lenguaje no permite la indexación de arreglos fuera de rango, o sea, una
asignación de este tipo generará una excepción:
ArrInt[25] = 1;

Otra forma de declararlos es la siguiente:


Unidimensionales:
tipo nombre_array[]=new tipo[nº]; tipo
nombre_array[]={valores};
Bidimensionales:
tipo nombre_array[][]=new tipo[nº][nº]; tipo
nombre_array[][]={valores};

Ejemplo: Se sabe que la velocidad de un proyectil está dada por la ecuación, en forma vectorial: V= ai+ bj+ ck.
Diseñe una aplicación que sea capaz de leer los valores de las constantes a, b y c. y muestre la magnitud y
dirección de dicho proyectil.
import javax.swing.*; public
class Proyectil{
public static void main (String args []){
String leer;
double magnitud, direccion, sum;
double vector[]=new double[3];
int ban=1;
while(ban==1)//miestras hayan datos a procesar
{
//leemos el valor de las constantes
leer=JOptionPane.showInputDialog("Ingrese el valor de a:");
vector[0]=Double.parseDouble(leer);
leer=JOptionPane.showInputDialog("Ingrese el valor de b:");
vector[1]=Double.parseDouble(leer);
leer=JOptionPane.showInputDialog("Ingrese el valor de c:");
vector[2]=Double.parseDouble(leer);
//calculamos la magnitud la cual es la raíz cuadrada de la
//suma de las componentes al cuadrado
sum=(vector[0]*vector[0])+(vector[1]*vector[1])
+(vector[2]*vector[2]);
magnitud=Math.sqrt(sum);
//La dirección viene dada por la tangente inversa del cociente
//de las componentes x,y
direccion=Math.atan(vector[1]/vector[0]);
JOptionPane.showMessageDialog(null, "El valor de la magnitud
es: "+magnitud+"\n y con un angulo direccional de:
"+direccion+" Radianes");
leer=JOptionPane.showInputDialog("¿Hay más datos a procesar?
\n\nSi=1 y No=0");
ban=Integer.parseInt(leer);
}//del while
}//del main
}//de la clase

Ejemplo: Se tienen las notas de 5 exámenes de 10 alumnos, y se desea promediar la nota final de cada uno de
ellos. Diseñe una aplicación que solucione este problema.
import javax.swing.*; public
class MatrizNotas{
public static void main (String args []) {
int f,c;
double suma, promedio;
double notas [][]=new double[10][5];
String leer;
for(f=0; f<10; f++)//las filas
{
suma=0;
for(c=0; c<5; c++)
{
leer=JOptionPane.showInputDialog("Ingrese la nota:
"+c+" del alumno: "+f);
notas[f][c]=Double.parseDouble(leer);
while(notas[f][c]>10 || notas [f][c]<0) {
leer=JOptionPane.showInputDialog("Ingrese la
nota: "+c+" del alumno: "+f);
notas[f][c]=Double.parseDouble(leer);
}
suma=suma+notas[f][c];
}
promedio=suma/5;
JOptionPane.showMessageDialog(null, "El alumno, tiene un
promedio de: "+promedio);
}
}
}

Después de haber declarado la variable arreglo, el siguiente paso es crear un arreglo de objetos y asignarlo a
esa variable. Las formas de hacerlo son:
A través del operador new
Inicializando directamente el contenido del arreglo Ejemplos:
String [ ] nombreJugadores = new String [10]; int
[ ] temps = new int [99];

Todas las posiciones se inicializan automáticamente (0 para arreglos numéricos, false para booleanos, ‘\0’ para
arreglos de carácter y null para objetos)
También se puede crear e inicializar un arreglo al mismo tiempo. Encierre los elementos del arreglo entre
llaves, separándolos con comas:
String [ ] chiles = { “jalapeno”, “de árbol”, “serrano”, “habanero”};

Al crear elementos con valores iniciales, el arreglo es del mismo tamaño que la cantidad de elementos que ha
incluido en las llaves.
Ejemplo:
class ArregloNombres
{
String[] nombres = { "Dennis", "Grace", "Bjarne", "James"};
String[] apellidos = new String[nombres.length]; void
imprime()
{ int
i = 0;
System.out.println(nombres[i] + " " + apellidos[i]);
i++;
System.out.println(nombres[i] + " " + apellidos[i]);
i++;
System.out.println(nombres[i] + " " + apellidos[i]);
i++;
System.out.println(nombres[i] + " " + apellidos[i]);
}
public static void main (String arguments[])
{
ArregloNombres a = new ArregloNombres();
a.imprime();
System.out.println("-----");
a.apellidos[0] = "Ritchie";
a.apellidos[1] = "Hopper";
a.apellidos[2] = "Stroustrup";
a.apellidos[3] = "Gosling";
a.imprime();
}
}

El tamaño de un arreglo se almacena en la variable length, que puede ser accesada a través del operador . y
el nombre del arreglo: nombreArreglo.length

Modificar la clase anterior para que tenga una mejor estructura de control. Investigar quiénes son las personas
que aparecen mencionadas.
Arreglos bidimensionales
Ejemplo:
/**
* Demuestra el uso de un arreglo bidimensional
* Crea las tablas de multiplicar del 0 al 10 y las imprime
*/
public class Tablas
{
public static void main (String [] args)
{
final int MAXT = 11;
int [] [] tabla = new int [MAXT][MAXT];
//Se inicializan los valores de tabla
for (int i = 0; i < MAXT; i++) for (int
j = 0; j < MAXT; j++) tabla
[i][j] = i*j;
//Se imprime tabla
System.out.println ("Las tablas de multiplicar del 0 al 10 son:\n");
for (int i = 0; i < MAXT; i++)
{
for (int j = 0; j < MAXT; j++)
System.out.print (tabla [i][j] + "\t");
System.out.println ();
}
}
}
Ejercicios con Arreglos
1. Programa que contenga un arreglo de 10 elementos y que le asigne los valores desde el teclado y que
muestre los valores.
2. Que contenga un arreglo de 10 elementos asignando los valores desde el teclado y que solo los acepte si
son números pares.
3. Hacer un programa que tenga un arreglo de 5 elementos ingresados por el usuario y nos diga cual es el
mayor y cual el menor.
4. Hacer un programa que tenga un arreglo de 10 elementos dados por el usuario, después de ingresar los
10 elementos pedirle al usuario un número y que nos diga cuantas veces se repite dentro del arreglo.
5. Elaborar un programa que dada una cadena la copie a otra.

6. Hacer un programa que dadas dos cadenas las compare y nos diga si estas son iguales o diferentes.
7. Ingresar una cadena y que nos indique su tamaño.
8. Copiar una cadena a otra pero invertida
9. Indicar si el siguiente código es correcto o no, justificando debidamente:
char a[] = "hola"; char b[] =
"mundo"; if(a==b) printf("Son
iguales."); else printf("Son
distintas.");

U nidad V
Manejo de Excepciones

Objetivo de la Unidad:
El alumno controlará errores en tiempo de ejecución a través de excepciones para generar programas
robustos

5.1 Concepto y tipos de excepciones


Concepto de Excepciones
Cuando ocurren errores es importante que un programa sea capaz de reaccionar al evento (capturarlo), por ejemplo:

• Notificar al usuario de un error

• Guardar el trabajo hecho

• Volver a un estado seguro anterior

• Terminar limpiamente el programa Ejemplos de Errores:


• Error en la entrada de datos

• Error en un dispositivo

• Error en el código
Una excepción corresponde a un evento que interrumpe el flujo normal de la sentencia de instrucciones de ese programa;
en otras palabras, una excepción es una condición anormal que surge en una secuencia de código durante su ejecución.
Cuando ocurre tal tipo de evento en un método, se lanza (throw) una excepción, creando un objeto especial que se pasa
al runtime para manejar la excepción.
El runtime busca en el stack el método que maneje el tipo de excepción.
Si se encuentra se captura la excepción invocando al manejador de excepciones (catch) Si
no se encuentra termina el programa.

Ventajas de Excepciones
Separa el código de manejo de errores del código normal, lo cual hace más legible los programas
Propaga errores a través de los métodos que se encuentran activos en el stack, para que se transfiera el control en el
anidamiento de invocaciones al lugar adecuado para su manejo
Permite agrupar errores y diferenciar errores, ya que una excepción es una clase que se puede derivar

Ejemplo de Anidamiento de Excepciones

Tipos de Excepciones
Existen dos tipos de Excepciones:

• No verificadas (unchecked): Excepciones derivadas de la clase Error y RuntimeException. Son excepciones muy
frecuentes relacionadas con errores de programación. Se pueden llamar excepciones implícitas. Java durante la
ejecución de un programa verifica y lanza automáticamente las excepciones que derivan de RuntimeException. El
programador no necesita establecer los bloques try/catch para controlar este tipo de excepciones.

• Verificadas (checked): Otras clases de excepciones (IOException). Se considera una excepción de comprobación. La
plataforma Java requiere que todas las excepciones de este tipo sean capturadas, generando un error en tiempo de
compilación si no se hace así. También este tipo de excepciones se pueden relanzar, pero ha de ser dentro del ámbito
del método en que se produce; es decir, si el método no captura la excepción en un bloque try – catch, debe
especificar que puede lanzarla, debe hacer que pase a formar parte de su interfaz pública, porque los métodos que
lo llamen deben conocer las excepciones que han de capturar para tomar las medidas oportunas. Este tipo de
excepciones descienden de la clase Throwable.

Jerarquía de las Excepciones


En java toda excepción se deriva de la clase Throwable Existen
dos subclases:

• Error: Representa un error interno o agotamiento de recursos en el sistema runtime de Java

• Exception: Representa un error en el programa. Tiene dos subclases o IOException o

RuntimeException

Subclases de Exception
RuntimeException se bede a un error de programación.

• Mal uso de cast

• Acceso a arreglo fuera de limite

• Acceso con puntero nulo


IOException son para algún otro problema:

• Leer mas alla del final del archivo

• Abrir un URL mal formada Etc.


5.2 Manejo de excepciones
Un método advierte al compilador sobre excepciones que no puede manipular lanzándola con throws
Por ejemplo: public String leerLinea() throws IOException

Un método debe declarar todas las excepciones verificadas (checked), si no las declara todas, el compilador
reclamara. Al declarar una clase de excepciones, entonces puede lanzar cualquier excepción de alguna
subclase. Aquellas excepciones que son cargadas (catch) no salen del método y no deberían ser declaradas.
Clausula para el manejo de excepciones try
Es el bloque de código donde se prevé que se genere una excepción. Es como decir “intenta esta sentencia y
mira si se produce una excepción”. El bloque try tiene que ir seguido, al menos, por una clausula catch o una
clausula finally.
La sintaxis general del bloque try consiste en la palabra clave try y una o más sentencias entre llaves:
try{
//Sentencias Java
}

Puede haber más de una sentencia que genere excepciones, en cuyo caso habrá que proporcionar un bloque
try para cada una de ellas. Algunas sentencias, en especial aquellas que invocan a otros métodos, pueden
lanzar, potencialmente, muchos tipos diferentes de excepciones, por lo que un bloque try consistente en una
solo sentencia requeriría varios controladores de excepción.
También se pude dar el caso contrario, en que todas las sentencias, o varias de estas, que puedan lanzar
excepciones se encuentren en un único bloque try, con lo que habría que asociar multiples controladores a
ese bloque. Aquí la experiencia del programador es la que cuenta y es el mismo el que debe decidir que opción
tomar en cada caso.
Los controladores de excepciones deben colocarse inmediatamente después del bloque try. Si se produce una
excepción dentro del bloque try, esa excepción será manejada por el controlador que está asociado con el
bloque try.
Clausula para el manejo de excepciones catch
Es el código que se ejecuta cuando se produce la excepción. Es como decir “controlo cualquier excepción que
coincida con mi argumento”. No hay código alguno entre un bloque try y un bloque catch, ni entre bloques
catch. La sintaxis general de la sentencia catch en java es la siguiente:
catch (UnTipoThrowable nombreVariable){
//Sentencias java
}

El argumento de la sentencia declara el tipo de excepción que el controlador, el bloque catch, va a manejar.
En este bloque hay que asegurarse de colocar código que no genere excepciones. Se pueden colocar
sentencias catch sucesivas, cada una controlando una excepción diferente. No se debería intentar capturar
todas las excepciones con una sola clausula como esta:
catch (Excepcion e){

}

Esto representaría un uso demasiado general, podrían llegar muchas más excepciones de las esperadas. En
este caso es mejor dejar que la excepción se propague hacia arriba y dar un mensaje de error al usuario. Se
puede controlar grupos de excepciones, es decir, se pueden controlar, a través de argumentos, excepciones
semejantes. Por ejemplo:
class Limites extends Exception{ } class
demasiadoCalor extends Limites { } class
demasiadoFrio extends Limites { } class
demasiadoRapido extends Limites { } class
demasiadoCansado extends Limites { }
… try{ if
(temp > 40)
throw (new demasiadoCalor()); if(dormir
< 8)
throw(new demasiadoCansado());
}
catch(Limites lim){
if(lim instanceof demasiadoCalor){
System.out.println(“Capturada excesivo calor”); return;
}
If(lim instanceof demasiadoCansado){
System.out.println(“Capturada excesivo cansancio”); return;
} }
finally
System.out.println(“En la clausula finally”);

La clausula catch comprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay
alguno que coincida, se ejecuta el bloque. El operador instanceof se utiliza para identificar exactamente cuál
ha sido la identidad de la excepción.
Cuando se colocan varios controladores de excepción, es decir, varias sentencias catch, el orden en que
aparecen en el programa es importante, especialmente si alguno de los controladores engloba a otros en el
árbol de jerarquía. Se deben colocar primero los controladores que manejen las excepciones más alejadas en
el árbol de jerarquía, porque de otro modo, estas excepciones podrían no llegar a tratarse si son capturadas
por un controlador mas general colocado anteriormente.
Clausula para el manejo de excepciones finally
Es el bloque de código que se ejecuta siempre, haya o no excepción. Hay una cierta controversia entre su
utilidad, pero, por ejemplo, podría servir para utilizarse de bitácora (log) o hacer un seguimiento de lo que
está pasando, porque como se ejecuta siempre, puede dejar grabado si se produce excepciones y si el
programa se ha recuperado de ellas o no.
Este bloque finally puede ser útil cuando no hay ninguna excepciones. Es un trozo de código que se ejecuta
independientemente de lo que se haga en el bloque try.
A la hora de tratar una excepción se plantea el problema de que acciones se van a tomar. En la mayoría de los
casos, bastará con presentar una indicación de error al usuario y un mensaje avisándolo de que se h producido
un error y que decida si quiere o no continuar con la ejecución del programa.
Por ejemplo, se podría disponer de un diálogo como el que se presenta a continuación:
public class DialogoError extends Dialog{
DialogoError(Frame padre){ super(padre,
true); setLayout(new BorderLayout());
//Presentamos un panel con continuar o salir
Panel p = new Panel();
p.add(new Button(“¿Continuar?”);
p.add(new Button(“Salir”);
add(“Center”, new Label(“Se ha producido un error… ¿Continuar?”); add(“South”,
p);
}
public boolean action(Event evt, Object obj){
if(“Salir”.equals(obj)){ dispose();
System.exit(1);
} return
false;
}
}

Y la invocación, desde algún lugar en que se suponga que se generaran errores, podría ser como sigue:
try{
//Código peligroso
}
catch (AlgunaExcepcion e){
VentanaError = new DialogoError(this);
VentanaError.show();
}

Clausula para el manejo de excepciones throw


La sentencia throw se utiliza para lanzar explícitamente una excepción. En primer lugar se debe obtener un
descriptor de un objeto Throwable, bien mediante un parámetro en una clausula catch o bien creándolo
mediante el operador new. La forma general de la sentencia throw es: throw ObjetoThrowable;

El flujo de la ejecución se detiene inmediatamente después de la sentencia throw, y nunca se llega a la


sentencia siguiente. Se inspecciona el bloque try que la engloba más cercano para ver si tiene la clausula catch
cuyo tipo coincide con el del objeto o instancia Throwable. Si se encuentra, el control se transfiere a esa
sentencia, si no, se inspeccionará el siguiente bloque try que la engloba, y así sucesivamente, hasta que el
gestor de excepciones mas externo detiene el programa.
Clausula para el manejo de excepciones throws
En algunos casos, si un método genera una excepción que el programa no maneja, se debe declarar dicha
excepción en la claúsula throws. La forma general de throws es:
valorRetorno nombreMetodo (parámetros) throws excepción1, …., excepciónN{
//código del método
}

Las excepciones que derivan de Error o RuntimeException no necesitan ser especificados en una lista throws.
Todos los otros tipos de excepciones necesitan ser declarados, o se producen errores en tiempo de
compilación. Por ejemplo, en la entrada por teclado se puede generar una excepcion IOException, la cual no
puede manejarse en el programa.
class UseThrows{
static char prompt(String str) throws java.io.IOException{
System.out.println(str+ ": "); return (char)
System.in.read();
}
}
public class PruebaUseThrows{ public
static void main(String args[]){ char
ch; try{
ch=UseThrows.prompt("Escriba una letra");
}
catch( java.io.IOException exc){
System.out.println("Excepcion de entrada-Salida");
ch='X'; }
} // main
} //clase

5.3 Creación y lanzamiento de excepciones


Creación de Excepciones
Se puede lanzar excepciones propias, extendiendo la clase System.exception . Por ejemplo, considerese un
programa cliente/servidor. El código cliente se intenta conectar al servidor, y durante 5 segundos se espera a
que conteste el servidor. Si el servidor no responde, el servidor lanzaría la excepción de time-out:
class ServerTimeOutException extends Exception {}
public void conectame( String nombreServidor ) throws Exception {
int exito; int puerto = 80;
exito = open( nombreServidor,puerto ); if(
exito == -1 )
throw ServerTimeOutException;
}

Si se quieren capturar las propias excepciones, se deberá utilizar la sentencia try:


public void encuentraServidor() {
... try {
conectame( servidorDefecto );
}
catch( ServerTimeOutException e ) {
g.drawString("Time-out del Servidor, intentando alternativa",5,5 );
conectame( servidorAlterno );
}
...
}

Cualquier método que lance una excepción también debe capturarla, o declararla como parte de la interface
del método. Cabe preguntarse entonces, el porqué de lanzar una excepción si hay que capturarla en el mismo
método. La respuesta es que las excepciones no simplifican el trabajo del control de errores. Tienen la ventaja
de que se puede tener muy localizado el control de errores y no tenemos que controlar millones de valores
de retorno, pero no van más allá.

También podría gustarte