Estructuras Repetitivas en Java Jorge
Estructuras Repetitivas en Java Jorge
Estructuras Repetitivas en Java Jorge
que deben hacerse mientras una cierta condicin sea vlida, esto significa que dichas instrucciones pueden ejecutarse 0 o n veces. Una estructura repetitiva est compuesta de una instruccin de repeticin, la condicin y el bloque de instrucciones que deber ejecutarse mientras la condicin se cumpla. Java ofrece tres tipos de estructuras repetitivas, las cuales se presentarn en este captulo. INSTRUCCIN WHILE Es una de las instrucciones repetitivas ms utilizadas en los diferentes lenguajes de programacin, prcticamente todos la implementan. La forma en la cual funciona es equivalente a mencionar, en una conversacin casual, algo como: Mientras ests estudiando en la universidad, debers llegar a casa antes de las 11 p.m. Es claro que mientras la persona no termine el semestre que est cursando es su obligacin estar en la casa, a ms tardar, a las 11 de la noche. Mientras el equipo siga ganando y no se presenten faltas por disciplina, se les seguir entregando el premio. Para seguir obteniendo el premio, es necesario que el equipo siga ganando y no se presenten faltas contra la disciplina. Mientras consigues completar la plata para comprar un televisor para ti, o encuentras una promocin, debers seguir viendo televisin con nosotros. Aqu es claro que mientras no se cumpla una, o ambas, condiciones la persona deber ver televisin con la familia. En java estas situaciones se manejan a travs de la instruccin while (condicin), cuya sintaxis se presenta a continuacin: while (condicin) { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute mientras la condicin se cumpla. */ } Del anterior bloque, se deben hacer las siguientes consideraciones: while es indispensable en el encabezado del bloque. ndicin, o sea no es posible dejar los parntesis vacos. La condicin se maneja igual que en las estructuras selectivas, es decir puede ser simple o estar compuesta de varias condiciones unidas a travs de operadores y (& - &&) u o (| - ||). 2 dicin no se cumple la primera vez que se llega al while, las instrucciones contenidas en l no se ejecutarn ni una vez. instrucciones que estn sujetas al cumplimiento de la condicin. Si es una instruccin no son necesarias, si son varias si lo son, pero es recomendable utilizarlas siempre. Sea que se utilicen o no llaves, debe ser claro que las instrucciones dentro del while forman un bloque de cdigo, as que si se definen variables dentro de este bloque, dejaran de existir una vez se salga de l.
Estructura repetitiva while Hasta ahora hemos empleado estructuras SECUENCIALES y CONDICIONALES. Existe otro tipo de estructuras tan importantes como las anteriores que son las estructuras REPETITIVAS. Una estructura repetitiva permite ejecutar una instruccin o un conjunto de instrucciones varias veces. Una ejecucin repetitiva de sentencias se caracteriza por: - La o las sentencias que se repiten. - El test o prueba de condicin antes de cada repeticin, que motivar que se repitan o no las sentencias. Estructura repetitiva while. Representacin grfica de la estructura while:
No debemos confundir la representacin grfica de la estructura repetitiva while (Mientras) con la estructura condicional if (Si) Funcionamiento: En primer lugar se verifica la condicin, si la misma resulta verdadera se ejecutan las operaciones que indicamos por la rama del Verdadero. A la rama del verdadero la graficamos en la parte inferior de la condicin. Una lnea al final
del bloque de repeticin la conecta con la parte superior de la estructura repetitiva. En caso que la condicin sea Falsa contina por la rama del Falso y sale de la estructura repetitiva para continuar con la ejecucin del algoritmo. El bloque se repite MIENTRAS la condicin sea Verdadera. Importante: Si la condicin siempre retorna verdadero estamos en presencia de un ciclo repetitivo infinito. Dicha situacin es un error de programacin, nunca finalizar el programa. Problema 1: Realizar un programa que imprima en pantalla los nmeros del 1 al 100. Sin conocer las estructuras repetitivas podemos resolver el problema empleando una estructura secuencial. Inicializamos una variable con el valor 1, luego imprimimos la variable, incrementamos nuevamente la variable y as sucesivamente. Diagrama de flujo:
Si continuamos con el diagrama no nos alcanzaran las prximas 5 pginas para finalizarlo. Emplear una estructura secuencial para resolver este problema produce un diagrama de flujo y un programa en Java muy largo. Ahora veamos la solucin empleando una estructura repetitiva while:
Es muy importante analizar este diagrama: La primera operacin inicializa la variable x en 1, seguidamente comienza la estructura repetitiva while y disponemos la siguiente condicin ( x <= 100), se lee MIENTRAS la variable x sea menor o igual a 100. Al ejecutarse la condicin retorna VERDADERO porque el contenido de x (1) es menor o igual a 100. Al ser la condicin verdadera se ejecuta el bloque de instrucciones que contiene la estructura while. El bloque de instrucciones contiene una salida y una operacin. Se imprime el contenido de x, y seguidamente se incrementa la variable x en uno. La operacin x=x + 1 se lee como "en la variable x se guarda el contenido de x ms 1". Es decir, si x contiene 1 luego de ejecutarse esta operacin se almacenar en x un 2. Al finalizar el bloque de instrucciones que contiene la estructura repetitiva se verifica nuevamente la condicin de la estructura repetitiva y se repite el proceso explicado anteriormente. Mientras la condicin retorne verdadero se ejecuta el bloque de instrucciones; al retornar falso la verificacin de la condicin se sale de la estructura repetitiva y continua el algoritmo, en este caso finaliza el programa. Lo ms difcil es la definicin de la condicin de la estructura while y qu bloque de instrucciones se van a repetir. Observar que si, por ejemplo, disponemos la condicin x >=100 ( si x es mayor o igual a 100) no provoca ningn error sintctico pero estamos en presencia de un error lgico porque al evaluarse por primera vez la condicin retorna falso y no se ejecuta el bloque de instrucciones que queramos repetir 100 veces.
No existe una RECETA para definir una condicin de una estructura repetitiva, sino que se logra con una prctica continua solucionando problemas. Una vez planteado el diagrama debemos verificar si el mismo es una solucin vlida al problema (en este caso se debe imprimir los nmeros del 1 al 100 en pantalla), para ello podemos hacer un seguimiento del flujo del diagrama y los valores que toman las variables a lo largo de la ejecucin: x 1 2 3 4 . . 100 101 Cuando x vale 101 la condicin de la estructura repetitiva retorna falso, en este caso finaliza el diagrama. Importante: Podemos observar que el bloque repetitivo puede no ejecutarse ninguna vez si la condicin retorna falso la primera vez. La variable x debe estar inicializada con algn valor antes que se ejecute la operacin x=x + 1 en caso de no estar inicializada aparece un error de compilacin. Programa: public class EstructuraRepetitivaWhile1 { public static void main(String[] ar) { int x; x=1; while (x<=100) { System.out.print(x); System.out.print(" - "); x = x + 1; } } } Importante:Como podemos observar no hemos creado un objeto de la clase Scanner. Esto debido a que en este programa no hay que ingresar datos por teclado. Para las salidas utilizamos la funcin print, que se encuentra creada por defecto en cualquier programa que codifiquemos en Java. Recordemos que un problema no estar 100% solucionado si no hacemos el programa en Java que muestre los resultados buscados. Probemos algunas modificaciones de este programa y veamos que cambios se deberan hacer para: 1 - Imprimir los nmeros del 1 al 500. 2 - Imprimir los nmeros del 50 al 100. 3 - Imprimir los nmeros del -50 al 0. 4 - Imprimir los nmeros del 2 al 100 pero de 2 en 2 (2,4,6,8 ....100). Respuestas: 1 - Debemos cambiar la condicin del while con x<=500. 2 - Debemos inicializar x con el valor 50.
3 - Inicializar x con el valor -50 y fijar la condicin x<=0. 4 - Inicializar a x con el valor 2 y dentro del bloque repetitivo incrementar a x en 2 ( x = x + 2 ). Problema 2: Escribir un programa que solicite la carga de un valor positivo y nos muestre desde 1 hasta el valor ingresado de uno en uno. Ejemplo: Si ingresamos 30 se debe mostrar en pantalla los nmeros del 1 al 30. Es de FUNDAMENTAL importancia analizar los diagramas de flujo y la posterior codificacin en Java de los siguientes problemas, en varios problemas se presentan otras situaciones no vistas en el ejercicio anterior. Diagrama de flujo:
Podemos observar que se ingresa por teclado la variable n. El operador puede cargar cualquier valor. Si el operador carga 10 el bloque repetitivo se ejecutar 10 veces, ya que la condicin es
Mientras x<=n , es decir mientras x sea menor o igual a 10; pues x comienza en uno y se incrementa en uno cada vez que se ejecuta el bloque repetitivo. A la prueba del diagrama la podemos realizar dndole valores a las variables; por ejemplo, si ingresamos 5 el seguimiento es el siguiente: n x 5 1 (Se imprime el contenido de x) 2 " " 3 " " 4 " " 5 " " 6 (Sale del while porque 6 no es menor o igual a 5) Programa: import java.util.Scanner; public class EstructuraRepetitivaWhile2 { public static void main(String[] ar) { Scanner teclado=new Scanner(System.in); int n,x; System.out.print("Ingrese el valor final:"); n=teclado.nextInt(); x=1; while (x<=n) { System.out.print(x); System.out.print(" - "); x = x + 1; } } } Los nombres de las variables n y x pueden ser palabras o letras (como en este caso) La variable x recibe el nombre de CONTADOR. Un contador es un tipo especial de variable que se incrementa o decrementa con valores constantes durante la ejecucin del programa. El contador x nos indica en cada momento la cantidad de valores impresos en pantalla. Problema 3: Desarrollar un programa que permita la carga de 10 valores por teclado y nos muestre posteriormente la suma de los valores ingresados y su promedio. Diagrama de flujo:
En este problema, a semejanza de los anteriores, llevamos un CONTADOR llamado x que nos sirve para contar las vueltas que debe repetir el while.
Tambin aparece el concepto de ACUMULADOR (un acumulador es un tipo especial de variable que se incrementa o decrementa con valores variables durante la ejecucin del programa) Hemos dado el nombre de suma a nuestro acumulador. Cada ciclo que se repita la estructura repetitiva, la variable suma se incrementa con el contenido ingresado en la variable valor. La prueba del diagrama se realiza dndole valores a las variables: valor suma x promedio 0 0 (Antes de entrar a la estructura repetitiva estos son los valores). 5 5 1 16 21 2 7 28 3 10 38 4 2 40 5 20 60 6 5 65 7 5 70 8 10 80 9 2 82 10 8 90 11 9 Este es un seguimiento del diagrama planteado. Los nmeros que toma la variable valor depender de qu cifras cargue el operador durante la ejecucin del programa. El promedio se calcula al salir de la estructura repetitiva (es decir primero sumamos los 10 valores ingresados y luego los dividimos por 10) Hay que tener en cuenta que cuando en la variable valor se carga el primer valor (en este ejemplo 5) al cargarse el segundo valor (16) el valor anterior 5 se pierde, por ello la necesidad de ir almacenando en la variable suma los valores ingresados. Programa: import java.util.Scanner; public class EstructuraRepetitivaWhile3 { public static void main(String[] ar) { Scanner teclado=new Scanner(System.in); int x,suma,valor,promedio; x=1; suma=0; while (x<=10) { System.out.print("Ingrese un valor:"); valor=teclado.nextInt(); suma=suma+valor; x=x+1; } promedio=suma/10; System.out.print("La suma de los 10 valores es:");
System.out.println(suma); System.out.print("El promedio es:"); System.out.print(promedio); } } Problema 4: Una planta que fabrica perfiles de hierro posee un lote de n piezas. Confeccionar un programa que pida ingresar por teclado la cantidad de piezas a procesar y luego ingrese la longitud de cada perfil; sabiendo que la pieza cuya longitud est comprendida en el rango de 1,20 y 1,30 son aptas. Imprimir por pantalla la cantidad de piezas aptas que hay en el lote. Diagrama de flujo:
Podemos observar que dentro de una estructura repetitiva puede haber estructuras condicionales (inclusive puede haber otras estructuras repetitivas que veremos ms adelante) En este problema hay que cargar inicialmente la cantidad de piezas a ingresar ( n ), seguidamente se cargan n valores de largos de piezas. Cada vez que ingresamos un largo de pieza (largo) verificamos si es una medida correcta
(debe estar entre 1.20 y 1.30 el largo para que sea correcta), en caso de ser correcta la CONTAMOS (incrementamos la variable cantidad en 1) Al contador cantidad lo inicializamos en cero porque inicialmente no se ha cargado ningn largo de medida. Cuando salimos de la estructura repetitiva porque se han cargado n largos de piezas mostramos por pantalla el contador cantidad (que representa la cantidad de piezas aptas) En este problema tenemos dos CONTADORES: x (Cuenta la cantidad de piezas cargadas hasta el momento) cantidad (Cuenta los perfiles de hierro aptos) Programa: import java.util.Scanner; public class EstructuraRepetitivaWhile4 { public static void main(String[] ar) { Scanner teclado=new Scanner(System.in); int x,cantidad,n; float largo; x=1; cantidad=0; System.out.print("Cuantas piezar procesar:"); n=teclado.nextInt(); while (x<=n) { System.out.print("Ingrese la medida de la pieza:"); largo=teclado.nextFloat(); if (largo>=1.20 && largo<=1.30) { cantidad = cantidad +1; } x=x + 1; } System.out.print("La cantidad de piezas aptas son:"); System.out.print(cantidad); } } Problemas propuestos Ha llegado la parte fundamental, que es el momento donde uno desarrolla individualmente un algoritmo para la resolucin de problemas. El tiempo a dedicar a esta seccin EJERCICIOS PROPUESTOS debe ser mucho mayor que el empleado a la seccin de EJERCICIOS RESUELTOS. La experiencia dice que debemos dedicar el 80% del tiempo a la resolucin individual de problemas y el otro 20% al anlisis y codificacin de problemas ya resueltos por otras personas. Es de vital importancia para llegar a ser un buen PROGRAMADOR poder resolver problemas en forma individual. 1. Escribir un programa que solicite ingresar 10 notas de alumnos y nos informe cuntos tienen notas mayores o iguales a 7 y cuntos menores.
2. Se ingresan un conjunto de n alturas de personas por teclado. Mostrar la altura promedio de las personas. 3. En una empresa trabajan n empleados cuyos sueldos oscilan entre $100 y $500, realizar un programa que lea los sueldos que cobra cada empleado e informe cuntos empleados cobran entre $100 y $300 y cuntos cobran ms de $300. Adems el programa deber informar el importe que gasta la empresa en sueldos al personal. 4. Realizar un programa que imprima 25 trminos de la serie 11 - 22 - 33 - 44, etc. (No se ingresan valores por teclado) 5. Mostrar los mltiplos de 8 hasta el valor 500. Debe aparecer en pantalla 8 - 16 - 24, etc. 6. Realizar un programa que permita cargar dos listas de 15 valores cada una. Informar con un mensaje cual de las dos listas tiene un valor acumulado mayor (mensajes "Lista 1 mayor", "Lista 2 mayor", "Listas iguales") Tener en cuenta que puede haber dos o ms estructuras repetitivas en un algoritmo. 7. Desarrollar un programa que permita cargar n nmeros enteros y luego nos informe cuntos valores fueron pares y cuntos impares. Emplear el operador % en la condicin de la estructura condicional: if (valor%2==0) //Si el if da verdadero luego es par.
1 3 Estructuras Repetitivas 3.1 El concepto. Se denominan estructuras repetitivas a las estructuras que permiten incluir dentro de ellas un grupo de instrucciones que deben hacerse mientras una cierta condicin sea vlida, esto significa que dichas instrucciones pueden ejecutarse 0 o n veces. Una estructura repetitiva est compuesta de una instruccin de repeticin, la condicin y el bloque de instrucciones que deber ejecutarse mientras la condicin se cumpla. Java ofrece tres tipos de estructuras repetitivas, las cuales se presentarn en este captulo. 3.2 Instruccin while (condicin). Es una de las instrucciones repetitivas ms utilizadas en los diferentes lenguajes de programacin, prcticamente todos la implementan. La forma en la cual funciona es equivalente a mencionar, en una conversacin casual, algo como:
Mientras ests estudiando en la universidad, debers llegar a casa antes de las 11 p.m. Es claro que mientras la persona no termine el semestre que est cursando es su obligacin estar en la casa, a ms tardar, a las 11 de la noche. Mientras el equipo siga ganando y no se presenten faltas por disciplina, se les seguir entregando el premio. Para seguir obteniendo el premio, es necesario que el equipo siga ganando y no se presenten faltas contra la disciplina. Mientras consigues completar la plata para comprar un televisor para ti, o encuentras una promocin, debers seguir viendo televisin con nosotros. Aqu es claro que mientras no se cumpla una, o ambas, condiciones la persona deber ver televisin con la familia. En java estas situaciones se manejan a travs de la instruccin while (condicin), cuya sintaxis se presenta a continuacin: while (condicin) { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute mientras la condicin se cumpla. */ } Del anterior bloque, se deben hacer las siguientes consideraciones: while es indispensable en el encabezado del bloque. posible dejar los parntesis vacos. La condicin se maneja igual que en las estructuras selectivas, es decir puede ser simple o estar compuesta de varias condiciones unidas a travs de operadores y (& - &&) u o (| - ||). 2 while, las instrucciones contenidas en l no se ejecutarn ni una vez. instrucciones que estn sujetas al cumplimiento de la condicin. Si es una instruccin no son necesarias, si son varias si lo son, pero es recomendable utilizarlas siempre. Sea que se utilicen o no llaves, debe ser claro que las instrucciones dentro del while forman un bloque de cdigo, as que si se definen variables dentro de este bloque, dejaran de existir una vez se salga de l. Ejercicio Resuelto: Problema: Suponga que se desea elaborar un programa que calcule e imprima los valores de la serie de Fibonnacci, menores al nmero cincuenta. Anlisis: Salidas. repetitiva. Entradas. // Observe este es un caso en el cual no se requiere pedir nada ! Procedimiento.
Cdigo en java: import java.util.*; public class Fibonacci { public static void main(String args[]) { generarNmeros(); } public static void generarNmeros(){ 3 int anterior = 0, temporal = 0; int siguienteTrmino = 1; System.out.println(anterior); while (siguienteTrmino < 50) { System.out.println(siguienteTrmino); temporal = siguienteTrmino; siguienteTrmino += anterior; anterior = temporal; } } } Ejercicios Resueltos: Problema: Suponga que se desea elaborar un programa que calcule e imprima los valores de la serie de Fibonnacci, menores que cincuenta. Los nmeros pares deben ir marcados con un asterisco. Anlisis: Salidas. acompaado de un asterisco. Esta salida es repetitiva. Entradas. Procedimiento.
alor de retorno:
Cdigo en java: import java.util.*; public class FibonacciConParesResaltados { 4 public static void main(String args[]) { generarNmeros(); } public static void generarNmeros(){ int anterior = 0, temporal = 0; int siguienteTrmino = 1; char signo = '*'; System.out.println(anterior+" "+signo); while (siguienteTrmino < 50) { signo = (siguienteTrmino % 2 == 0) ? '*' : ' '; System.out.println(siguienteTrmino+" "+signo); temporal = siguienteTrmino; siguienteTrmino += anterior; anterior = temporal; } } } Problema: Se necesita saber el valor total de los libros que hay en una librera, se sabe que el valor de un libro se calcula multiplicando el nmero de pginas por 100. Si la edicin no es nacional o el libro fue editado este ao se le aplica un recargo, al valor obtenido, del 10%. No se sabe cuntos libros hay en la librera. Anlisis: Salidas. bros. Esta salida es nica. Entradas
bro.
Cdigo en java: import java.util.Scanner.*; public class ValorDelLibro { public static void main (String arg[] ) { gestinLibros(); } public static void gestinLibros(){ Scanner lector = new Scanner(System.in); char respuesta = 's';
double valorTotal = 0; while ((respuesta == 's') || (respuesta == 'S')){ double valor = 0; System.out.println("Digite la cantidad de pginas"); int nmeroDePginas = lector.nextInt (); System.out.println("Digite (1) si es edicin nacional \n(2) si es extranjera"); int nacional = lector.nextInt (); System.out.println("Digite (1) si es edicin de este ao \n(2) si es de otro ao"); int ao = lector.nextInt (); valor = calcularBase(nmeroDePginas); if ((nacional == 2) || (ao == 1)) { valor += recargo(valor); } valorTotal += valorDelLibro; System.out.println(" Hay ms libros ?"); respuesta =lector.nexLine ().charAt(0); } System.out.println ("El valor total de los libros es "+valorTotal); } public static double calcularBase(int pginas){ return pginas * 100; } public static double recargo(double base){ return base* 0.1; } } 6 Problema: Se necesita sumar los nmeros pares entre un valor cualquiera, digitado por el usuario, y 100. Anlisis: Salidas. Entradas Procedimiento.
Cdigo en java: import java.util.Scanner.*; public class Pares { public static void main(String args[]) { sumar(); } public static void sumar(){ Scanner lector = new Scanner(System.in); System.out.println("Digite el nmero con el que se inicia la suma: "); int topeInferior = lector.nextInt(); if (topeInferior %2 == 1){ topeInferior++; } double acumulador = 0; while (topeInferior <= 100) { acumulador += topeInferior; topeInferior += 2; } if (acumulador > 0) { System.out.println("La suma dio: " + acumulador); 7 } else { System.out.println("El tope inferior fue mayor que 100!"); } } } Ejercicios Propuestos. 1. Se le ha pedido que haga un programa que permita calcular el combinatorio de dos nmeros naturales, siempre y cuando el primero sea mayor o igual al segundo. La forma de calcular el combinatorio de dos nmeros naturales es: nmeroUnoCnmeroDos = nmeroUno! / ((nmeroUno-nmeroDos)! * nmeroDos!) Tenga en cuenta: El factorial de un nmero se calcula multiplicando desde 1 hasta el nmero, incluido. Por ejemplo: 3! = 1 * 2 * 3 = 6 factorial de cero es 1, por definicin. Anlisis: Salidas. Entradas. Procedimiento. 8
Cdigo en java: 2. Se le ha encomendado la labor de elaborar un programa que le permita a un nio estudiar las tablas de multiplicar. Las condiciones que se le han puesto son:
debe mostrar el resultado correcto. 3. En un teatro se ha decidido que la entrada sea controlada por una mquina, y a usted se le ha pedido que haga el programa que diga si una persona puede ingresar o no. Al iniciar labores se debe indicar cul es la censura de la pelcula (para todos, mayores de 12 aos o mayores de 18 aos), adems el valor de la entrada. Una persona puede ingresar si no han entrado ms de 30 personas, que es la capacidad mxima del teatro, si la persona tiene la edad requerida y si la boleta que compr cumple con el valor de la entrada. Entran personas hasta que se llene el teatro o hasta que la edad de la persona sea cero. Al terminar la mquina debe mostrar un mensaje que indique cuntas personas ingresaron y cul fue la edad promedio de los espectadores. 9 3.3 Instruccin do while (condicin). Esta instruccin indica que un bloque de instrucciones debe ejecutarse mnimo una vez y mientras que la condicin siga siendo vlida. Equivaldra a comentar en una conversacin casual algo como: Ponle tantas capas de pintura a esa pared como sea necesario para que desaparezca ese color. Es claro que debe aplicarse como mnimo una capa de pintura y despus de eso, tantas como se requiera para que el antiguo color desaparezca. l comer pasteles hasta que se acaben o encuentre el premiado. Aqu se indica que se comer al menos un pastel, y se detendr si es el premiado, o si termina con todos los pasteles existentes. En java se cuenta con la instruccin do while (condicin), cuya sintaxis se presenta a continuacin: do { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute, al menos una vez, y siga ejecutndose mientras la condicin se cumpla. */ } while (condicin); Del anterior bloque, se deben hacer las siguientes consideraciones: do es indispensable en el encabezado del bloque. instrucciones que se quiera incluir en la instruccin. Sigue siendo vlido el que las instrucciones contenidas en esta instruccin conforman un bloque de cdigo, y su comportamiento es idntico a los casos ya mencionados. while, e inmediatamente despus de la ltima de las instrucciones que conforman el bloque a repetir. Aqu tambin se requiere condicin, o sea no es posible dejar los parntesis vacos. La condicin se maneja exactamente igual que en los casos anteriores. en el bloque se ejecutarn una vez, puesto que la condicin se verifica DESPUS de la primera ejecucin del bloque. Ejercicios Resueltos: Problema: Se necesita un programa que muestre, por pantalla, los primeros 100 nmeros pares. Adems se necesita que cumpla con el siguiente formato:
de par es mltiplo de cuatro, al lado del nmero debe aparecer la palabra 'cuatro'. Los bloques de cdigo, en java, estn delimitados por las llaves, as que si se define una variable dentro del bloque de cdigo demarcado por la instruccin do while (condicin), esta variable NO puede utilizarse en la condicin, pues la condicin se encuentra por fuera del bloque de cdigo. 10 , al lado del nmero debe aparecer la palabra 'ambos'. Anlisis: Salidas. Entradas Procedimiento. mtodo main: +main(String[ ]):void salidas:
tros:
ntradas:
entre 5 es 0 cuatro
Cdigo en java: import java.util.Scanner.*; public class ParesConMensaje { public static void main(String arg[]) { 11 numeros(); } public static numeros(){ int contador = 1; int nuevoPar; do { nuevoPar = contador++ * 2; String mensaje = asignaMensaje(nuevoPar); System.out.println(nuevoPar + " " + mensaje); } while (contador < 100); } public static String asignaMensaje(int par){ if (par % 4 == 0 && par % 5 == 0) { return ambos; if (par % 4 == 0) { return cuatro; if (par % 5 == 0) { return cinco; return ; } } Problema: Se necesita un programa que genere nmeros en forma aleatoria. Los nmeros deben estar entre 1 y 10. El usuario jugar a adivinar el nmero, y cuando lo logre, el programa deber decirle cuntos intentos necesit. Anlisis: Salidas: Entradas Procedimiento.
mero.
12 Cdigo en java: import java.util.Scanner.*; import java.util.*; public class Adivine { public static void main(java.lang.String[] args) { // Las dos siguientes instrucciones permiten obtener un nmero en forma aleatoria. Random generador = new Random(); int nmero = generador.nextInt(10000); nmero %= 10; nmero++; jugar(nmero); } public static void jugar(int nmero){ int contador = 0, nuevoNmero; do { contador++; System.out.println("Digita un nmero entre 1 y 10"); nuevoNmero = lector.nextInt(); if (nuevoNmero = nmero) { System.out.println("Lo lograste, al " + contador + " intento"); } } while (nmero != nuevoNmero); } } Problema: Se necesita un programa que defina si una palabra es palndromo1 o no. Anlisis: Salidas. la palabra es o no palndromo. Entradas Procedimiento.
es palndromo
1 Palabra o frase que se lee igual de izquierda a derecha, que de derecha a izquierda. Segn el Diccionario de la Lengua Espaola. Vigsima segunda edicin. 13 = longitud de la palabra 1.
contadorDos
contadorDos ) Cdigo en java: import java.util.Scanner.*; public class Palndromo { public static void main(java.lang.String[] args) { Scanner lector = new Scanner(System.in); System.out.println("Digite la palabra a evaluar: "); String palabra = lector.nexLine(); boolean es = palndromo(palabra); if (es) { System.out.println(La palabra es palndromo); } else { System.out.println(La palabra NO es palndromo); } public static boolean palndromo(String palabra){ int contadorUno = 0; // debe investigar que hace length() !! int contadorDos = palabra.length() - 1; boolean palndromo = true; do { // debe investigar que hacer charAt(valor entero) ! if (palabra.charAt(contadorUno) != palabra.charAt(contadorDos)) { System.out.println("No es palndromo"); palndromo = false; } contadorUno++; contadorDos--; } while (contadorUno < contadorDos && palndromo);
return true; } } Ejercicios Propuestos: 1. Haga un programa que le permita guardar en un arreglo de n posiciones los factoriales de los n primeros nmeros primos. 14 Anlisis: Salidas. Entradas. Procedimiento. Cdigo en java: 15 2. Un equipo de ftbol est en problemas, as que sus dueos han decidido que seguirn sostenindolo si el promedio de las calificaciones de sus jugadores, despus de cada partido es superior a 6, y le han contratado para que elabore un programa que pida las calificaciones individuales y devuelva el promedio de ellas. Recuerde que juegan once jugadores y que puede haber hasta tres cambios, as que mnimo debe pedir once calificaciones y mximo 14. 3. Los dueos del mismo equipo de ftbol le han pedido un nuevo programa, que les permita decidir si un jugador sigue en el equipo o no. Al terminar cada torneo se evala el desempeo de los jugadores teniendo en cuenta el promedio de sus calificaciones en los partidos que jug, el nmero de tarjetas amarillas y rojas que recibi y la cantidad de partidos en que jug como titular. Y los requisitos para que contine en el equipo son: calificaciones debe ser superior a 5.5
equipo. acin se digitar partido a partido. 3.4 Instruccin for (inicializacin ; condicin ; incremento). Esta instruccin es ligeramente diferente a las otras, en el sentido de que no se limita a dar una condicin, sino que permite dar un valor inicial, y una forma de incremento, con lo cual se simplifica la programacin. Dado que combina tres acciones en un solo paso, no es fcil pensar en una situacin de la vida real que pueda ser asociada a ella. Empieza con la tabla del uno, sigue hasta la del 10, aprendiendo cada da una. Aqu se da el punto de partida, debe empezar con la tabla del uno, y seguir estudiando hasta que se sepa todas hasta la del 10, adems es claro que cada da debe aprender la del siguiente nmero. En java se cuenta con la instruccin for(inicializacin ; condicin ; incremento), cuya sintaxis se presenta a continuacin: for (inicializacin ; condicin ; incremento) { /** En este espacio debe ir el bloque de cdigo que se requiere se ejecute mientras la condicin se cumpla. */ } Del anterior bloque, se deben hacer las siguientes consideraciones: for es indispensable en el encabezado del bloque. puede trabajar con cualquiera de los tipos de datos numricos, incluidos los
reales. Adems puede hacerse la definicin de la variable y su inicializacin o puede slo hacerse la inicializacin. Es decir que los siguientes bloques de cdigo son correctos: for (int contador = 0 ; ... ; ... ) { 16 ... } double contador; ... for (contador = 0 ; ... ; ... ) { ... } pueden definirse e inicializarse tantas como se requiera, la nica restriccin es que a todas debe hacrseles lo mismo: o todas se declaran, del mismo tipo, e inicializan o todas se han declarado previamente, y pueden ser de tipos diferentes, y slo se inicializan. Es decir que los siguientes bloques de cdigo son correctos: for (int contador = 0, nmero = 8 ; ... ; ... ) { /** ni contador, ni nmero pueden haber sido declaradas por fuera de este bloque, pues generar error diciendo que esas variables ya existen.*/ ... } double contador; int nmero; ... for (contador = 0, nmero = 8 ; ... ; ... ) { ... } condicin puede estar asociada a la variable o variables que se manejaron en la parte de la inicializacin. Sin embargo esto NO es necesario. En otras palabras la condicin puede estar construida a partir de valores completamente independientes a los trabajados en la parte de inicializacin. Igualmente la condicin puede ser simple o compleja, o sea puede ser una condicin, o varias unidas con los operadores y (& &&) y o (| ||) Es decir que los siguientes bloques de cdigo son correctos: e la inicializacin; boolean cierto = true; ... for (; cierto ; ...) { // seguir en el ciclo mientras la variable cierto no cambie de valor. ... } condicin :
boolean cierto = true; 17 ... for (int contador = 0 ; cierto ; ...) { ... } for (int contador = 0 ; contador < 10 ; ...) { ... } debe tenerse en cuenta que los valores que se incrementen pueden estar relacionados con los dos bloques anteriores, pero que NO tienen que estarlo. Es decir que los siguientes bloques de cdigo son correctos: boolean cierto = true; double nmero = 0; ... for (int contador = 0 ; cierto ; nmero += 2 ) { ... } boolean cierto = true; ... for (int contador = 0 ; cierto ; contador++ ) { ... } la condicin: double contador; ... for (contador = 0 ; contador < 10 ; contador++ ) { ... } for, y su bloque de cdigo asociado, se realiza lo que aparezca en la parte de inicializacin, despus se evala la condicin y se pasa a ejecutar las instrucciones contenidas en el bloque de cdigo. Una vez se ha concluido la ejecucin del bloque, se ejecuta lo que corresponde a la parte del incremento e inmediatamente despus se evala, de nuevo, la condicin. Se contina as mientras la condicin se siga cumpliendo. As podemos concluir que la inicializacin se ejecuta una sola vez, la revisin de la condicin y el incremento se continan realizando mientras la condicin siga siendo cierta. for, al evaluar la condicin esta no se cumple, las instrucciones contenidas en l no se ejecutarn ni una vez. se quiera incluir en l. 18 concepto de bloque de cdigo, es decir que las variables definidas en este bloque, sern desconocidas fuera de l, incluidas las que sean definidas en la parte de inicializacin.
dos con punto y coma, son opcionales tal como se ha visto hasta ahora. O sea que es posible dejar que los parntesis contengan nicamente los signos de punto y coma, que si son obligatorios. Es decir que la siguiente sintaxis es correcta: for (; ;) { ... } Ejercicios Resueltos. Problema: Se necesita un programa que genere un nmero, en forma aleatoria, entre 1 y 10. El usuario jugar a adivinarlo, pero slo tiene 5 oportunidades, ni una ms. Anlisis: Salidas. indique y muestre cuntos intentos hizo; de lo contrario un mensaje que muestre que perdi. Entradas Procedimiento.
radas:
tador+ intento.
19 Cdigo en java: import java.util.Scanner.*; import java.util.*; public class Adivine { public static void main(java.lang.String[] args) { Random generador = new Random(); int nmero = generador.nextInt(10000);
nmero %= 10; nmero++; jugar(nmero); } public static void jugar(int nmero){ Scanner lector = new Scanner(System.in); boolean encontr = false; int contador, nuevoNmero; for (contador = 0;(contador < 5 && !encontr); contador++) { System.out.println("Digita un nmero entre 1 y 10"); nuevoNmero = lector.nextInt(); if (nuevoNmero == nmero) { System.out.println("Lo lograste, al " + (contador + 1) + " intento"); encontr = true; } } if (!encontr) { System.out.println(" Perdiste !.\nEl nmero era: "+nmero); } } } Problema: El cuadrado de un nmero se obtiene al sumar tantos nmeros impares como indique el nmero. La suma debe empezar con el uno (1). As: El cuadrado de 1 : 1=1 El cuadrado de 2 : 1+3=4 El cuadrado de 3: 1+3+5=9 Se debe desarrollar un programa que utilice este mtodo para calcular el cuadrado de cualquier nmero entero que el usuario digite. Anlisis: Salidas. Entradas nmero. Procedimiento.
20 -1.
en dos . Cdigo en java: import java.util.Scanner.*; public class Cuadrado { public static void main(String[] args) { Scanner lector = new Scanner(System.in); System.out.println("A qu nmero desea encontrarle el cuadrado?"); int nmero; int unNmero = lector.nextInt(); if (unNmero < 0) { unNmero *= -1; } cuadrado(unNmero); } public static void cuadrado (int nmero) { int acumulador, impar, contador; for (contador=1, acumulador=0, impar=1; contador<=nmero; contador++, impar+= 2) { acumulador += impar; } System.out.println("El cuadrado de " + unNmero + " es: " + acumulador); } } Ejercicios Propuestos: 1. Se le ha pedido que elabore un programa que pida cadenas de caracteres hasta que ocurra alguna de estas cosas:
tildes; por ejemplo, dbale arroz a la zorra el abad, debe convertirse en dabale arroz a la zorra el abad y esta cadena es la que debe evaluarse. 2. Se le ha pedido que elabore un programa que genere una serie conformada por cuatro nmeros diferentes, comprendidos entre uno y cincuenta. Un usuario intentar adivinarlos y tendr seis oportunidades para cada nmero, pero si hace los seis intentos y no acierta el nmero, el programa debe terminar e informarle que perdi. Los nmeros de la serie deben ser generados por su programa en forma aleatoria, y no es necesario que el usuario los adivine en orden. 21 3.5 Matrices. Cuando se present el tema de arreglos, captulo uno seccin 11, se dijo que este era un tipo de datos que poda contener otros datos, organizados mediante una
estructura dada. Al revisar esta definicin se afirma que los datos que es posible almacenar en arreglos pueden pertenecer a cualquiera de los grupos de datos que maneja el lenguaje, independiente de que se trate de valores o de datos referenciados. Hasta el momento se ha trabajado con arreglos que contienen valores pertenecientes a los tipos bsicos; con datos pertenecientes a String, que es uno de los dos tipos de datos referenciados que se conocen; pero no se ha intentado trabajar un arreglo pidindole que contenga el otro tipo de dato referenciado: los arreglos. Java permite que un arreglo contenga otros arreglos, y si todos estos arreglos tienen la misma longitud, entonces se comporta como una matriz. As que si, por ejemplo, se quisiera definir una matriz de dimensiones 5x4 (5 filas, 4 columnas), que contenga valores enteros; en realidad se definira un arreglo de 5 posiciones, cada una de las cuales contendr un arreglo de enteros de 4 posiciones, y el cdigo requerido para ello sera: int[ ][ ] matriz = new int[5][4]; lo cual permitira obtener algo similar a esto: 0000 0000 0000 0000 0000 Para hacer referencia a una casilla debe darse el nombre de la matriz, el nmero de la fila, entre corchetes, y el nmero de la columna, tambin entre corchetes; esto es as bien sea que se quiera asignar un valor a la casilla u obtener el valor contenido en ella. Por ejemplo, si en la matriz del ejemplo anterior, se quisiera asignar 1 a la casilla que ocupa la fila 0 y la columna 1, el cdigo requerido para ello sera: matriz[0][1] = 1; y si a una variable entera se le quisiera asignar el valor contenido en la casilla que est en la fila 3, columna 0, sera: int variable = matriz[3][0] = 1; 22 Ejercicio Resuelto. Problema: Se necesita un programa que defina una matriz de enteros, que tenga cinco filas y cuatro columnas, despus se quiere que quede llena con los nmeros del 0 al 9, y si es necesario volver a empezar, haga. Es decir algo as: 0123 4567 8901 2345 6789 Anlisis: Salidas. Entradas Procedimiento.
iz:
uno en uno
ma indicada
23
ambiar de lnea Cdigo en java: import java.util.Scanner.*; public class LlenarMatriz { public static void main(java.lang.String[] args) { llenarMatriz(); } public static void llenarMatriz(){ int matriz[][] = new int[5][4]; int contador = 0; for (int fila = 0; fila < 5; fila++) { for (int columna = 0; columna < 4; columna++) { matriz[fila][columna] = contador++; if (contador == 10) { contador = 0; } } } mostrarMatriz(matriz); }
public static void mostrarMatriz(int[][] matriz){ for (int fila = 0; fila < 5; fila++) { for (int columna = 0; columna < 4; columna++) { System.out.print(matriz[fila][columna] + " "); } System.out.println(" "); } } } Ejercicios Propuestos: 1. Qu salida produce el siguiente cdigo? import java.util.*; public class Matriz { public static void main(java.lang.String[] args) { Scanner lector = new Scanner(System.in); int matriz[][] = new int[5][5]; for (int fila = 0; fila < 5; fila++){ for (int columna = 0; columna < 5; columna++){ matriz[fila][columna] = fila*columna; if (matriz[fila][columna] < 10) { System.out.print (" "+matriz[fila][columna]+" "); } else { System.out.print (" "+matriz[fila][columna]+" "); } } System.out.println(); } } } Salida. 24 2. Se requiere una clase ejecutable, en java, que permita crear una matriz de dimensiones filas x columnas, donde filas y columnas son valores enteros dados por el usuario; y que llene cada casilla con el producto de la fila por la columna que dicha casilla ocupa. 3. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, es decir el nmero de las filas es igual al nmero de las columnas, y la llene de acuerdo al siguiente patrn: 00000 10000 23000 45600 7 8 9 10 0 4. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, y la llene de acuerdo al siguiente patrn: 00001 00020 00300 04000 50000 5. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, y la
llene de acuerdo al siguiente patrn: 10203 04050 60708 0 9 0 10 0 11 0 12 0 13 6. Elaborar una clase ejecutable, en java, la cual permita crear una matriz cuadrada, y la llene de acuerdo al siguiente patrn: 12345 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 21 22 23 24 25 7. Dada una matriz de dimensiones filas x columnas, verificar si la matriz es simtrica2. 8. Dada una matriz cuadrada, de dimensiones digitadas por el usuario, elaborar una clase ejecutable, en java, que intercambie las diagonales. 2 Una matriz es simtrica si se cumplen las siguientes condiciones: a) filas = columnas b) Matriz(fila,columna) = Matriz(columna,fila) para 0 <= fila < filas y 0 <= columna < columnas
Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la estructura while. Pero hay otra estructura repetitiva cuyo planteo es ms sencillo en ciertas situaciones. En general, la estructura for se usa en aquellas situaciones en las cuales CONOCEMOS la cantidad de veces que queremos que se ejecute el bloque de instrucciones. Ejemplo: cargar 10 nmeros, ingresar 5 notas de alumnos, etc. Conocemos de antemano la cantidad de veces que queremos que el bloque se repita. Veremos, sin embargo, que en el lenguaje Java la estructura for puede usarse en cualquier situacin repetitiva, porque en ltima instancia no es otra cosa que una estructura while generalizada. Representacin grfica:
En su forma ms tpica y bsica, esta estructura requiere una variable entera que cumple la funcin de un CONTADOR de vueltas. En la seccin indicada como "inicializacin contador", se suele colocar el nombre de la variable que har de contador, asignndole a dicha variable un valor inicial. En la seccin de "condicin" se coloca la condicin que deber ser verdadera para que el ciclo contine (en caso de un falso, el ciclo se detendr). Y finalmente, en la seccin de "incremento contador" se coloca una instruccin que permite modificar el valor de la variable que hace de contador (para permitir que alguna vez la condicin sea falsa) Cuando el ciclo comienza, antes de dar la primera vuelta, la variable del for toma el valor indicado en la seccin de de "inicializacin contador". Inmediatamente se verifica, en forma automtica, si la condicin es verdadera. En caso de serlo se ejecuta el bloque de operaciones del ciclo, y al finalizar el mismo se ejecuta la instruccin que se haya colocado en la tercer seccin. Seguidamente, se vuelve a controlar el valor de la condicin, y as prosigue hasta que dicha condicin entregue un falso. Si conocemos la cantidad de veces que se repite el bloque es muy sencillo emplear un for, por ejemplo si queremo que se repita 50 veces el bloque de instrucciones puede hacerse as:
La variable del for puede tener cualquier nombre. En este ejemplo se la ha definido con el nombre f. Analicemos el ejemplo: - La variable f toma inicialmente el valor 1. - Se controla automticamente el valor de la condicin: como f vale 1 y esto es menor que 50, la condicin da verdadero. - Como la condicin fue verdadera, se ejecutan la/s operacin/es. - Al finalizar de ejecutarlas, se retorna a la instruccin f++, por lo que la variable f se incrementa en uno. - Se vuelve a controlar (automticamente) si f es menor o igual a 50. Como ahora su valor es 2, se ejecuta nuevamente el bloque de instrucciones e
incrementa nuevamente la variable del for al terminar el mismo. - El proceso se repetir hasta que la variable f sea incrementada al valor 51. En este momento la condicin ser falsa, y el ciclo se detendr. La variable f PUEDE ser modificada dentro del bloque de operaciones del for, aunque esto podra causar problemas de lgica si el programador es inexperto. La variable f puede ser inicializada en cualquier valor y finalizar en cualquier valor. Adems, no es obligatorio que la instruccin de modificacin sea un incremento del tipo contador (f++). Cualquier instruccin que modifique el valor de la variable es vlida. Si por ejemplo se escribe f=f+2 en lugar de f++, el valor de f ser incrementado de a 2 en cada vuelta, y no de a 1. En este caso, esto significar que el ciclo no efectuar las 50 vueltas sino slo 25. Problema 1: Realizar un programa que imprima en pantalla los nmeros del 1 al 100. Diagrama de flujo:
Podemos observar y comparar con el problema realizado con el while. Con la estructura while el CONTADOR x sirve para contar las vueltas. Con el for el CONTADOR f cumple dicha funcin. Inicialmente f vale 1 y como no es superior a 100 se ejecuta el bloque, imprimimos el contenido de f, al finalizar el bloque repetitivo se incrementa la variable f en 1, como 2 no es superior a 100 se repite el bloque de instrucciones. Cuando la variable del for llega a 101 sale de la estructura repetitiva y contina la ejecucin del algoritmo que se indica despus del crculo. La variable f (o como sea que se decida llamarla) debe estar definida como una variable ms. Programa: public class EstructuraRepetitivaFor1 { public static void main(String[] ar) {
La estructura do while es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia del while o del for que podan no ejecutar el bloque. Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutar el bloque repetitivo. La condicin de la estructura est abajo del bloque a repetir, a diferencia del while o del for que est en la parte superior. Representacin grfica:
El bloque de operaciones se repite MIENTRAS que la condicin sea Verdadera. Si la condicin retorna Falso el ciclo se detiene. En Java, todos los ciclos repiten por verdadero y cortan por falso. Es importante analizar y ver que las operaciones se ejecutan como mnimo una vez.
Problema 1: Escribir un programa que solicite la carga de un nmero entre 0 y 999, y nos muestre un mensaje de cuntos dgitos tiene el mismo. Finalizar el programa cuando se cargue el valor 0. Diagrama de flujo:
No hay que confundir los rombos de las estructuras condicionales con los de las estructuras repetitivas do while. En este problema por lo menos se carga un valor. Si se carga un valor mayor o igual a 100 se trata de un nmero de tres cifras, si es mayor o igual a 10 se trata de un valor de dos dgitos, en caso contrario se trata de un valor de un dgito. Este bloque se repite hasta que
se ingresa en la variable valor el nmero 0 con lo que la condicin de la estructura do while retorna falso y sale del bloque repetitivo finalizando el programa. Programa: import java.util.Scanner; public class EstructuraRepetitivaDoWhile1 { public static void main(String[] ar) { Scanner teclado=new Scanner(System.in); int valor; do { System.out.print("Ingrese un valor entre 0 y 999 (0 finaliza):"); valor=teclado.nextInt(); if (valor>=100) { System.out.println("Tiene 3 dgitos."); } else { if (valor>=10) { System.out.println("Tiene 2 dgitos."); } else { System.out.println("Tiene 1 dgito."); } } } while (valor!=0); } }
Enlaces patrocinadosLeading Open Source JMS Get Enterprise-Class JMS Messaging. Free Downloads, Docs & Training! fusesource.com
Matrices, arrays o vectores en java. Java posee la capacidad de definir un conjunto de variables del mismo tipo agrupadas todas ellas bajo un mismo nombre, y distinguindolas mediante un ndice numrico. Para definir un array en java es como definir una variable o atributo, pero al especificar el tipo lo que hacemos es colocar un par de corchetes [] para indicar que lo que estamos definiendo es un array. Por ejemplo:
Curso onLine Frameworks Quieres mejorar tu nivel de programacin. Promocin del 40%desc www.globalmentoring.com.mx/Enlaces patrocinados public int [] losValores; en la que definimos un array de enteros llamado losValores. Vamos a intentar realizar un ejemplo para ver como funciona: Prctica: Crear el fichero Array.java Agregar el siguiente cdigo en el fichero: public class Array { public static void main(String arg[]) { int [] losValores = null; losValores[4] = 100;
System.out.println(losValores[4]); } } Compilamos el cdigo, ejecutemos y...error!!! Parece extrao que el error sea NullPointerException, pero tiene sentido, recordemos que una variable java, que no sea de tipo bsico es una referencia que puede apuntar a objetos y por tanto losValores tambin es una referencia y debe de apuntar a objetos de tipo array de enteros. Es decir, el cdigo de la funcin main es necesario modificarlo: int [] losValores = new int[10];
Anterior - ndice - Siguiente III.2. CADENAS A. Introduccin a.) Introduccin a las clases String y StringBuffer En Java las cadenas se tratan de forma diferente a C/C++, donde las cadenas son matrices de caracteres en las que se indica el final de la cadena con un carcter de valor \0. En Java las cadenas son objetos de las clases predefinida String o StringBuffer, que estn incluidas en el paquete java.lang.*. Siempre que aparecen conjuntos de caracteres entre comillas dobles, el compilador de Java crea automticamente un objeto String. Si slo existieran cadenas de slo lectura (String), durante una serie de manipulaciones sobre un objeto String habra que crear un nuevo objeto para cada uno de los resultados intermedios. El compilador es ms eficiente y usa un objeto StringBuffer para construir cadenas a partir de las expresiones, creando el String final slo cuando es necesario. Los objetos StringBuffer se pueden modificar, de forma que no son necesarios nuevos objetos para albergar los resultados intermedios. Los caracteres de las cadenas tienen un ndice que indica su posicin. El primer carcter de una cadena tiene el ndice 0, el segundo el 1, el tercero el 2 y as sucesivamente. Esto puede sonar familiar a los programadores de C/C++, pero resultar chocante para aquellos programadores que provengan de otros lenguajes. b.) Operaciones bsicas, comunes a String y StringBuffer Existen una serie de mtodos que son comunes a ambas clases. Los siguientes mtodos de acceso a las cadenas:
int length(); Devuelve el nmero de caracteres de la cadena. char charAt( int i ); Devuelve el carcter correspondiente de ndice i.
String toString(); Devuelve una copia del objeto como una String. String substring( int i, int fin ); Devuelve una instancia de la clase String que contenga una subcadena desde la posicin ini, hasta la fin (si no se indica hasta el final de la cadena), del objeto cadena que invoque el mtodo.
void getChars(int ini, int fin, char[] destino, int destIni); Convierte la cadena en un vector de caracteres destino.
B. Mtodos de la clase String a.) Constructores La clase String proporciona cadenas de slo lectura y soporta operaciones con ellas. Se pueden crear cadenas implcitamente mediante una cadena entrecomillada o usando + += con dos objetos String. Tambin se pueden crear objetos String explcitamente con el mecanismo new. La clase String soporta multitud de constructores.
String(); Constructor por defecto. El nuevo String toma el valor "". String( String s ); Crea un nuevo String, copiando el que recibe por parmetro. String( StringBuffer s ); Crea un String con el valor que en ese momento tenga el StringBuffer que recibe como parmetro. String( char[] v ); El nuevo String toma el valor de los caracteres que tiene el vector de caracteres recibido por parmetro. String( byte[] v ); El nuevo String toma el valor de los caracteres que corresponden a los valores del vector de bytes en el sistema de caracteres de la ordenador en que se ejecute.
b.) Bsqueda en cadenas String Adems presenta los siguientes mtodos para buscar caracteres o subcadenas en la cadena, y devuelven el ndice que han encontrado o el valor 1 si la bsqueda no ha sido satisfactoria:
int indexOf( char ch, int start ): Devuelve el ndice correspondiente a la primera aparicin del carcter ch en la cadena, comenzando a buscar desde el carcter start (si no se especifica se busca desde el principio). int indexOf( String str ): Devuelve el ndice correspondiente al carcter en que empieza la primera aparicin de la subcadena str. int lastIndexOf( char ch, int start ): Devuelve el ndice correspondiente a la ltima aparicin del carcter ch en la cadena, comenzando a buscar desde el carcter start (si no se especifica se busca desde el final). int lastIndexOf( String str ): Devuelve el ndice correspondiente al carcter en que empieza la ltima aparicin de la subcadena str.
c.) Comparaciones de cadenas String Java no trabaja con el cdigo ASCII habitual, sino con el cdigo avanzado Unicode. El cdigo Unicode (cdigo universal) se caracteriza, sobre todo, por el uso de dos bytes por carcter. Esto permite aumentar los caracteres hasta 65000, y as se pueden representar los caracteres que componen las lenguas, vivas o muertas, ms importantes del mundo.
Hay que tener en cuenta que si nos salimos del rango 0-255 que coincide con el cdigo ASCII puede que las comparaciones no sean las esperadas. Las funciones de comparacin son las siguientes:
boolean equals( Object o ); Devuelve true si se le pasa una referencia a un objeto String con los mismos caracteres, o false si no. boolean equalsIgnoreCase( String s ); Compara cadenas ignorando las diferencias de ortografa maysculas/minsculas. boolean regionMatches( boolean b, int o, String s , int i, int n ); Compara parte de dos cadenas, carcter a carcter. boolean startsWith( String s, int i ); Comprueba si la cadena tiene el prefijo s desde i. boolean endsWith( String s ); Comprueba si la cadena termina con el sufijo s. int compareTo( Object o ); Devuelve un entero que es menor, igual o mayor que cero cuando la cadena sobre la que se le invoca es menor, igual o mayor que la otra. Si el parmetro es un String, la comparacin es lxica. int compareToIgnoraCase( String s ); Compara lexicogrficamente, ignorando las diferencias de ortografa maysculas/minsculas.
d.) Cadenas String derivadas En Java se devuelven nuevas cadenas cada vez que se invoca a un mtodo que crea una cadena diferente porque las cadenas String son de slo lectura:
String replace( char oldChar, char newChar ); Devuelve una nueva cadena con todos los caracteres oldChar sustituidos por el carcter newChar. String toLowerCase(); Devuelve una nueva cadena con los caracteres en minsculas, o si se especifica parmetro, siguiendo sus reglas. String toUperCase( Locale l ); Devuelve una nueva cadena con los caracteres en maysculas, o si se especifica parmetro, siguiendo sus reglas. static String trim(): Devuelve una nueva cadena del que se ha eliminado los espacios en blanco por el principio y por el final. static String copyValueOf( char[] v, int ini, int fin ); Devuelve una cadena igual que la contenida en el vector v, entre los lmites ini y fin (si no se especifican copia todo el vector). static String concat( String s ); Concatena la cadena que recibe al final de sta.
e.) Conversiones entre cadenas String y tipos simples Java Para convertir una variable de un tipo de datos simple (char, boolean, int, long, float, double) en una cadena (String), bastar con invocar al mtodo valueOf() del objeto String correspondiente:
static String valueOf( tipo ); El parmetro tipo soporta un carcter (char) un vector de caracteres (char[]) o un objeto (Object).
Sin embargo para convertir el valor de una cadena en un tipo de datos simple deberemos utilizar los siguientes mtodos: Tipo boolean De String new Boolean(String).booleanValue()
Integer.ParseInt(String, int base) Long.ParseLong(String, int base) new Float(String).floatValue() new Double(String).doubleValue()
Tabla 20: Conversiones de cadenas a tipos simples No hay ningn mtodo que convierta los caracteres escapados Java ( \b, \udddd ) en variables carcter (char), o a la inversa. Lo que se puede hacer es invocar valueOf() con un carcter (char) para obtener una cadena de la clase String que contenga ese carcter. As mismo no hay formas de crear o decodificar cadenas de nmeros en formatos octal (0) o hexadecimal(0x). f.) Conversiones entre cadenas String y vectores Tambin existen diversos constructores y mtodos de la clase String para tratar con vectores, tanto de caracteres como de bytes. En cuanto a los vectores de caracteres existen:
El constructor ya citado de String( char[] v ). Hace copia de los datos, por lo que las modificaciones posteriores del vector no afectarn a la cadena. char[] toCharArray(); Convierte la cadena en un vector de caracteres.
En cuanto a los mtodos para convertir vectores de byte (de 8 bits) en objetos String con caracteres Unicode de 16 bits existen:
El constructor ya citado de String( byte[] v ). Hace copias de los datos, por lo que las modificaciones posteriores del vector no afectarn a la cadena. byte[] getBytes( String s ); Convierte la cadena en un vector de byte, atendiendo a la tabla de caracteres especificada en s, o a la de la mquina si se omite.
C. Mtodos de la clase StringBuffer a.) Constructores Los constructores contenidos por la clase StringBuffer son:
StringBuffer( int lim ); Construye una cadena sin caracteres y con una capacidad inicial de lim caracteres (por defecto 16, si no se especifica otro valor). StringBuffer( String s ); Construye una cadena con el valor s.
b.) Modificacin de la cadena Existen tres tipos de modificaciones que se pueden aplicar a la cadena. Hay mtodos de insercin:
StringBuffer insert( int i, Object o ); Desplaza los caracteres de la cadena e inserta la cadena correspondiente al segundo parmetro (de cualquier tipo). StringBuffer append( Object o ); Inserta al final de la cadena, la cadena correspondiente al segundo parmetro (de cualquier tipo).
void setCharAt( int i, char to ); Cambia el carcter de la posicin i por to. Si la posicin supera la longitud de la cadena, se extiende rellenndose con caracteres nulos. StringBuffer replace( int ini, int fin, String s ); Reemplaza una subcadena de esta cadena (de ini a fin) por la cadena recibida por parmetro. No se debe confundir con el mtodo replace() que incluye la clase String. StringBuffer reverse(); Invierte la cadena (de izquierda a derecha).
Y mtodos de borrado:
StringBuffer delete( int ini, int fin ); Borra la subcadena entre el carcter ini y el fin. StringBuffer deleteCharAt( int i ); Borra el carcter en la posicin i.
c.) Capacidad de la cadena El buffer de un objeto StringBuffer tiene una capacidad que es la longitud de la cadena que puede almacenar sin tener que asignar ms espacio. El buffer crece automticamente a medida que se aaden caracteres, pero resulta ms eficiente especificar el tamao del buffer de una sola vez:
int capacity(); Devuelve la capacidad actual del buffer. void ensureCapacity( int i );. Garantiza que la capacidad del buffer es al menos i. void setLength( int i ); Establece la longitud de esta cadena a i.
d.) Extraccin de datos Para obtener un objeto String a partir de un objeto StringBuffer, debe invocarse el mtodo toString(), comn a ambas clases. Se debe tener en cuenta que no hay mtodos StringBuffer para eliminar una parte de un buffer. Para resolver este problema, debe crearse un vector de caracteres a partir del buffer, y construir un nuevo buffer con el contenido restante. Para esto se usa el mtodo getChars(), comn con la clase String. D. Ejemplos de uso de cadenas a.) Ejemplo de Cadena Fija (de la clase String) En el siguiente ejemplo se muestra la utilizacin de los principales mtodos de la clase String: public static void main( String s[] ){ String cad = new String("Cadena Fija"); System.out.println("Ejemplo de String: '"+cad+"'"); //Mtodos comunes a StringBuffer System.out.println("Su longitud es: "+cad.length()); System.out.println("Su tercer caracter es: "+cad.charAt(3)); System.out.print("Su subcadena del 3 al 6 es:"); System.out.println( cad.substring(2,6) );
char[] vectorcad = cad.toCharArray(); System.out.println("Creado un vector, de elemento 3: "); System.out.print( vectorcad[2] ); // Bsqueda en cadenas String subcad=new String("ena"); System.out.print("La subcadena '"+subcad+"'"); System.out.print(" aparece en la posicion: "); System.out.println( cad.indexOf(subcad) ); // Comparaciones String cadcomp=new String("CADENA Fija"); System.out.print("La cadena '"+cadcomp+"'"); if ( cad.compareTo(cadcomp) == 0 ) System.out.println(" ES igual 'Sensitive'"); else System.out.println(" NO es igual 'Sensitive'"); System.out.print("La cadena '"+cadcomp+"'"); if ( cad.equalsIgnoreCase(cadcomp) ) System.out.println(" ES igual 'Insensitive'"); else System.out.println(" NO = 'Insensitive'"); // Derivacin System.out.print("Cadena derivada en minusculas: "); System.out.println( cad.toLowerCase() ); } Lo que muestra por pantalla: Ejemplo de String: 'Cadena Fija'
Su longitud es: 11 Su tercer caracter es: e Su subcadena del 3 al 6 es: dena Creado un vector, de elemento 3: d La subcadena 'ena' aparece en la posicion: 3 La cadena 'CADENA Fija' NO es igual 'Sensitive' La cadena 'CADENA Fija' ES igual 'Insensitive' Cadena derivada en minusculas: cadena fija b.) Ejemplo de Cadena Variable (de la clase StringBuffer) En el siguiente ejemplo se muestra la utilizacin de los principales mtodos de la clase StringBuffer: public static void main( String s[] ){ StringBuffer cad = new StringBuffer("Cadena Variable"); System.out.println("Ejemplo de StringBuffer: '"+cad+"'"); // Modificacin de la cadena cad.delete( 0, 6 ); System.out.println("Borrados 6 primeros caracteres: "+cad); cad.replace( cad.length()-3, cad.length(), "da" ); System.out.println("Sutituidos ultimos caracteres: "+cad); cad.append(" Cadena"); System.out.println("Apendizada con 'Cadena': "+cad); // Gestin de su capacidad System.out.println("Tiene capacidad de: "+cad.capacity()); cad.ensureCapacity( 32 ); System.out.println("Capacidad sobre 32:"+cad.capacity()); System.out.println(""); } Lo que muestra por pantalla: Ejemplo de StringBuffer: 'Cadena Variable' Borrados 6 primeros caracteres: Variable Sutituidos ultimos caracteres: Variada Apendizada con 'Cadena': Variada Cadena Tiene capacidad de: 31 Capacidad sobre 32: 64
Arreglo Unidimensional Arreglo: Es una coleccin de datos del mismo tipo. Sirve para manejar un nmero n de elementos en comn, ya sea de tipos definidos por el Lenguaje,(int,float,String,etc) asi como aquellos definidos por el programador. Para ilustrar lo anteriormente dicho, tenemos el siguiente ejemplo: Si queremos tener 3 elementos de tipo int, sin usar los arreglos se hara del siguiente modo: private int numero1 = 1; private int numero2 = 2; private int numero3 = 3; Esta es una manera, pero no la adecuada ,imaginen por instante si necesitramos 20 elementos tendramos que declarar 20 variables, veamos como se agruparan estos 3 elementos en un solo arreglo: private int []x = new int[3]; private int[]x = {1,2,3}; En la primera lnea, hemos creado un arreglo vaco de 3 elementos; mientras que en la segunda, creamos un arreglo de 3 elementos inicializados. Este ejemplo proviene de lenguajes como java, sin embargo, la implementacin varia segn el lenguaje de programacin que se este utilizando. Los siguientes ejemplos estarn en el Lenguaje java. Mtodos de declaracin de Arreglos. Para declarar Arreglos en Java, se utiliza este formato: Tipo_de_dato []identificador;
Tipo_de_dato identificador[]; identificador = new Tipo_de_dato[numero_de_elementos]; Tambin es posible, como ya vimos en nuestro primer ejemplo se puede hacer en una sola linea. Tipo_de_dato []identificador = new Tipo_de_dato[numero_de_elementos]; Llenado de un arreglo vaco Para llenar un arreglo sin necesidad de inicializarlo, podemos de apoyarnos de un ciclo for, veamos el ejemplo: int []x = new int[3]; Declaramos el arreglo de 3 elementos for(int i = 0; i<=2; i+) x[i] = (int) (Math.random () * 20); con esto hacemos que x en la posicin que valga i (0,1,2) haga una seleccin aleatoria entre el 0 y el 20 Recuperacin de los elementos de un arreglo De igual manera en como llenamos un arreglo, nos apoyaremos del ciclo for para devolver los elementos for(int i = 0; i<=2; i++) System.out.println(x[i]); Hay un detalle que es muy importante aclarar: Cuando declaramos un arreglo, le damos el tamao que queremos ste tenga, en este caso fue de 3 elementos. Sin embargo, el ndice del arreglo (posicin) siempre iniciar en 0, es por eso que en el ciclo for le di la instruccin que recorriera desde el 0 hasta el 2, para que tomara en cuenta los 3 elementos del arreglo; si hubiramos asignado la orden que recorriera desde el 0 hasta el 3, tomara 4 repeticiones, con lo que se establecera un error, ya que el arreglo nicamente tiene un tamao de 3: x[0], x[1] y x[2]. Arreglo Bidimensional Conceptos Basicos
Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito ordenado y homogneo. El acceso a ellos tambin es en forma directa por medio de un par de ndices. Los arreglos bidimensionales se usan para representar datos que pueden verse como una tabla con filas y columnas. La primera dimensin del arreglo representa las columnas, cada elemento contiene un valor y cada dimensin representa una relacin La representacin en memoria se realiza de dos formas: almacenamiento por columnas o por renglones. Para determinar el nmero total de elementos en un arreglo bidimensional usaremos las siguientes frmulas: RANGO DE RENGLONES (R1) = Ls1 - (Li1+1) RANGO DE COLUMNAS (R2) = Ls2 - (Li2+1) No. TOTAL DE COMPONENTES = R1 * R2 REPRESENTACION EN MEMORIA POR COLUMNAS x : array [1..5,1..7] of integer Para calcular la direccin de memoria de un elemento se usan la siguiente formula: A[i,j] = base (A) + [((j - li2) R1 + (i + li1))*w] REPRESENTACION EN MEMORIA POR RENGLONES x : array [1..5,1..7] of integer Para calcular la direccin de memoria de un elemento se usan la siguiente formula: A[i,j] = base (A) + [((i - li1) R2 + (j + li2))*w] Donde: i = ndice del rengln a calcular j = ndice de la columna a calcular li1 = Lmite inferior de renglones li2 = Lmite inferior de columnas w = Nmero de bytes tipo componente estos programas son uno de los mas sencillos chequenlos //Este programa crea un arreglo bidimencional llamado are y solo se le asignan valores a este //Que de claro que para moverse en las posiciones de un arreglo bidimencional necesitamos dos for o while import javax.swing.J Option Pane;
class areglos0{ public static void main(String args[]){ //Creacion del Arreglo are int are[][]=new int[2][2]; String a; //Llenado del Arreglo are for(int x=0;x<=1;x++){ for(int y=0;y<=1;y++){ a=J Option Pane.showInputDialog(Introduce el Numero:); are[x][y]=Integer.parseInt(a); } } System.out.println(Se Termino De Ejecutar El Programa); } }
//Este programa crea un arreglo bidimencional llamado are y solo se le asignan valores a este //Que de claro que para moverse en las posiciones de un arreglo bidimencional necesitamos dos for o while import javax.swing.J Option Pane; class areglos01{ public static void main(String args[]){ //Creacion del Arreglo are int are[][]=new int[2][2]; String a; //Llenado del Arreglo are for(int x=0;x<=1;x++){ for(int y=0;y<=1;y++){ a=J Option Pane.showInputDialog(Introduce el Numero:); are[x][y]=Integer.parseInt(a); } } for(int x=0;x<=1;x++){ for(int y=0;y<=1;y++){
System.out.println(Valor [+x+][+y+]:+are[x][y]); } } System.out.println(Se Termino De Ejecutar El Programa); } } //Este programa crea un arreglo bidimencional llamado are y se le asignan valores a este directamente en codigo,e imprime eso valores //Que de claro que para moverse en las posiciones de un arreglo bidimencional necesitamos dos for o while import javax.swing.J Option Pane; class areglos02{ public static void main(String args[]){ //Creacion del Arreglo are int are[][]={{1,2},{3,4}};
//impresion de valores previamente asignados for(int x=0;x<=1;x++){ for(int y=0;y<=1;y++){ System.out.println(Valor [+x+][+y+]:+are[x][y]); } } System.out.println(Se Termino De Ejecutar El Programa); } } //Este programa crea un arreglo bidimencional llamado are y se le asignan valores a este directamente en codigo despues de la declaracion,e imprime eso valores //Que de claro que para moverse en las posiciones de un arreglo bidimencional necesitamos dos for o while import javax.swing.J Option Pane; class areglos03{ public static void main(String args[]){ //Creacion del Arreglo are
int are[][]=new int[2][2]; //asignacion de valores. are[0][0]=1; are[0][1]=2; are[1][0]=3; are[1][1]=4; //impresion de valores previamente asignados for(int x=0;x<=1;x++){ for(int y=0;y<=1;y++){ System.out.println(Valor [+x+][+y+]:+are[x][y]); } } System.out.println(Se Termino De Ejecutar El Programa); } }
//Este programa crea dos arreglo bidimencional y los suma,e imprime eso valores //Que de claro que para moverse en las posiciones de un arreglo bidimencional necesitamos dos for o while import javax.swing.J Option Pane; class areglos04{ public static void main(String args[]){ //Creacion del Arreglo are int are[][]=new int[2][2]; int are2[][]=new int[2][2]; int suma=0; //asignacion de valores. //Llenado manual del primer arreglo are[0][0]=1; are[0][1]=2; are[1][0]=3; are[1][1]=4;
//Llenado manual del segundo arreglo are2[0][0]=5; are2[0][1]=6; are2[1][0]=7; are2[1][1]=8; //impresion de valores previamente asignados for(int x=0;x<=1;x++){ for(int y=0;y<=1;y++){ suma=are[x][y]+are2[x][y]; System.out.println(Valor [+x+][+y+]:+are[x][y]+ + + [+x+][+y+]:+are2[x][y]+=+suma); } } System.out.println(Se Termino De Ejecutar El Programa); } }
I.1. INTRODUCCIN A LA PROGRAMACIN ORIENTADA A OBJETOS A. Programacin Orientada a Objetos La orientacin a objetos es un paradigma de programacin que facilita la creacin de software de calidad por sus factores que potencian el mantenimiento, la extensin y la reutilizacin del software generado bajo este paradigma. La programacin orientada a objetos trata de amoldarse al modo de pensar del hombre y no al de la mquina. Esto es posible gracias a la forma racional con la que se manejan las abstracciones que representan las entidades del dominio del problema, y a propiedades como la jerarqua o el encapsulamiento. El elemento bsico de este paradigma no es la funcin (elemento bsico de la programacin estructurada), sino un ente denominado objeto. Un objeto es la representacin de un concepto para un programa, y contiene toda la informacin necesaria para abstraer dicho concepto: los datos que describen su estado y las operaciones que pueden modificar dicho estado, y determinan las capacidades del objeto. Java incorpora el uso de la orientacin a objetos como uno de los pilares bsicos de su lenguaje. B. Los objetos
Podemos definir objeto como el "encapsulamiento de un conjunto de operaciones (mtodos) que pueden ser invocados externamente, y de un estado que recuerda el efecto de los servicios". [Piattini et al., 1996]. Un objeto adems de un estado interno, presenta una interfaz para poder interactuar con el exterior. Es por esto por lo que se dice que en la programacin orientada a objetos "se unen datos y procesos", y no como en su predecesora, la programacin estructurada, en la que estaban separados en forma de variables y funciones. Un objeto consta de:
Tiempo de vida: La duracin de un objeto en un programa siempre est limitada en el tiempo. La mayora de los objetos slo existen durante una parte de la ejecucin del programa. Los objetos son creados mediante un mecanismo denominado instanciacin, y cuando dejan de existir se dice que son destruidos. Estado: Todo objeto posee un estado, definido por sus atributos. Con l se definen las propiedades del objeto, y el estado en que se encuentra en un momento determinado de su existencia. Comportamiento: Todo objeto ha de presentar una interfaz, definida por sus mtodos, para que el resto de objetos que componen los programas puedan interactuar con l.
El equivalente de un objeto en el paradigma estructurado sera una variable. As mismo la instanciacin de objetos equivaldra a la declaracin de variables, y el tiempo de vida de un objeto al mbito de una variable. C. Las clases Las clases son abstracciones que representan a un conjunto de objetos con un comportamiento e interfaz comn. Podemos definir una clase como "un conjunto de cosas (fsicas o abstractas) que tienen el mismo comportamiento y caractersticas... Es la implementacin de un tipo de objeto (considerando los objetos como instancias de las clases)". [Piattini et al., 1996]. Una clase no es ms que una plantilla para la creacin de objetos. Cuando se crea un objeto (instanciacin) se ha de especificar de qu clase es el objeto instanciado, para que el compilador comprenda las caractersticas del objeto. Las clases presentan el estado de los objetos a los que representan mediante variables denominadas atributos. Cuando se instancia un objeto el compilador crea en la memoria dinmica un espacio para tantas variables como atributos tenga la clase a la que pertenece el objeto. Los mtodos son las funciones mediante las que las clases representan el comportamiento de los objetos. En dichos mtodos se modifican los valores de los atributos del objeto, y representan las capacidades del objeto (en muchos textos se les denomina servicios).
Desde el punto de vista de la programacin estructurada, una clase se asemejara a un mdulo, los atributos a las variables globales de dicho mdulo, y los mtodos a las funciones del mdulo. D. Modelo de objetos Existen una serie de principios fundamentales para comprender cmo se modeliza la realidad al crear un programa bajo el paradigma de la orientacin a objetos. Estos principios son: la abstraccin, el encapsulamiento, la modularidad, la jerarqua, el paso de mensajes y el poliforfismo. a.) Principio de Abstraccin Mediante la abstraccin la mente humana modeliza la realidad en forma de objetos. Para ello busca parecidos entre la realidad y la posible implementacin de objetos del programa que simulen el funcionamiento de los objetos reales. Los seres humanos no pensamos en las cosas como un conjunto de cosas menores; por ejemplo, no vemos un cuerpo humano como un conjunto de clulas. Los humanos entendemos la realidad como objetos con comportamientos bien definidos. No necesitamos conocer los detalles de porqu ni cmo funcionan las cosas; simplemente solicitamos determinadas acciones en espera de una respuesta; cuando una persona desea desplazarse, su cuerpo le responde comenzando a caminar. Pero la abstraccin humana se gestiona de una manera jerrquica, dividiendo sucesivamente sistemas complejos en conjuntos de subsistemas, para as entender ms fcilmente la realidad. Esta es la forma de pensar que la orientacin a objeto intenta cubrir. b.) Principio de Encapsulamiento El encapsulamiento permite a los objetos elegir qu informacin es publicada y qu informacin es ocultada al resto de los objetos. Para ello los objetos suelen presentar sus mtodos como interfaces pblicas y sus atributos como datos privados e inaccesibles desde otros objetos. Para permitir que otros objetos consulten o modifiquen los atributos de los objetos, las clases suelen presentar mtodos de acceso. De esta manera el acceso a los datos de los objetos es controlado por el programador, evitando efectos laterales no deseados. Con el encapsulado de los datos se consigue que las personas que utilicen un objeto slo tengan que comprender su interfaz, olvidndose de cmo est implementada, y en definitiva, reduciendo la complejidad de utilizacin. c.) Principio de Modularidad Mediante la modularidad, se propone al programador dividir su aplicacin en varios mdulos diferentes (ya sea en forma de clases, paquetes o bibliotecas), cada uno de ellos con un sentido propio.
Esta fragmentacin disminuye el grado de dificultad del problema al que da respuesta el programa, pues se afronta el problema como un conjunto de problemas de menor dificultad, adems de facilitar la comprensin del programa. d.) Principio de Jerarqua La mayora de nosotros ve de manera natural nuestro mundo como objetos que se relacionan entre s de una manera jerrquica. Por ejemplo, un perro es un mamfero, y los mamferos son animales, y los animales seres vivos... Del mismo modo, las distintas clases de un programa se organizan mediante la jerarqua. La representacin de dicha organizacin da lugar a los denominados rboles de herencia:
Imagen 1: Ejemplo de rbol de herencia Mediante la herencia una clase hija puede tomar determinadas propiedades de una clase padre. As se simplifican los diseos y se evita la duplicacin de cdigo al no tener que volver a codificar mtodos ya implementados. Al acto de tomar propiedades de una clase padre se denomina heredar. e.) Principio del Paso de Mensajes Mediante el denominado paso de mensajes, un objeto puede solicitar de otro objeto que realice una accin determinada o que modifique su estado. El paso de mensajes se suele implementar como llamadas a los mtodos de otros objetos. Desde el punto de vista de la programacin estructurada, esto correspondera con la llamada a funciones. f.) Principio de Polimorfismo Polimorfismo quiere decir "un objeto y muchas formas". Esta propiedad permite que un objeto presente diferentes comportamientos en funcin del contexto en que se encuentre. Por ejemplo un mtodo puede presentar diferentes implementaciones en funcin de los argumentos que recibe, recibir diferentes nmeros de parmetros para realizar una misma operacin, y realizar diferentes acciones dependiendo del nivel de abstraccin en que sea llamado.
E. Relaciones entre objetos Durante la ejecucin de un programa, los diversos objetos que lo componen han de interactuar entre s para lograr una serie de objetivos comunes. Existen varios tipos de relaciones que pueden unir a los diferentes objetos, pero entre ellas destacan las relaciones de: asociacin, todo/parte, y generalizacin/especializacin. a.) Relaciones de Asociacin Seran relaciones generales, en las que un objeto realiza llamadas a los servicios (mtodos) de otro, interactuando de esta forma con l. Representan las relaciones con menos riqueza semntica. b.) Relaciones de Todo/Parte Muchas veces una determinada entidad existe como conjuncin de otras entidades, como un conglomerado de ellas. La orientacin al objeto recoge este tipo de relaciones como dos conceptos; la agregacin y la composicin. En este tipo de relaciones un objeto componente se integra en un objeto compuesto. La diferencia entre agregacin y composicin es que mientras que la composicin se entiende que dura durante toda la vida del objeto componedor, en la agregacin no tiene por qu ser as. Esto se puede implementar como un objeto (objeto compuesto) que cuenta entre sus atributos con otro objeto distinto (objeto componente). c.) Relaciones de Generalizacin/Especializacin A veces sucede que dos clases tiene muchas de sus partes en comn, lo que normalmente se abstrae en la creacin de una tercera clase (padre de las dos) que rene todas sus caractersticas comunes. El ejemplo ms extendido de este tipo de relaciones es la herencia, propiedad por la que una clase (clase hija) recoge aquellos mtodos y atributos que una segunda clase (clase padre) ha especificado como "heredables". Este tipo de relaciones es caracterstico de la programacin orientada a objetos. En realidad, la generalizacin y la especializacin son diferentes perspectivas del mismo concepto, la generalizacin es una perspectiva ascendente (bottom-up), mientras que la especializacin es una perspectiva descendente (top-down).