3ero Manual EstructuraDatos
Comments
Description
Estructura de DatosComputación, Informática & Sistemas 1 Estructura de Datos Computación, Informática & Sistemas 2 Estructura de Datos © Estructura de Datos – Grupo IDAT Desarrollo y Edición a cargo del Programa de Computación e Informática. Director Ejecutivo Coordinador Académico Coordinador Administrativo Diseño y Diagramación : : : : Ing. Rolando Rojas Gallo Ing. José García La Riva Sr. Julio Cabrera Calle Srta. Bettina Chávez Huamán Srta. Flor Alicia Vega Collazos Elaborado por : Prof. Arias Hidalgo Luis Alberto Prof. Espinoza Muñoz Percy Deiby Producción : Departamento de Impresiones del Grupo IDAT Los derechos de edición, distribución y contenidos de este texto son de exclusividad del GRUPO IDAT. Computación, Informática & Sistemas 3 Estructura de Datos Computación. Informática & Sistemas 4 . tan solo lo creas a partir de una clase y le cambias las propiedades que creas conveniente. ¿Qué sucede si deseas una mesa hecha de metal? ¿Y si es de vidrio? ¿Y si la deseas de 3 patas o de 2 o incluso una?. microbuses. Y ahora. una clase sería “mesa” y un objeto sería la mesa que tienes en tu casa y otro objeto es la mesa en donde ahora estas colocando este libro para leerlo. por ejemplo “mesa” o “escritorio”. los objetos escritorio. Fascinante ¿no? Esto es debido a que java puede trabajar para casi cualquier procesador existente (el 99. reutilizarlos. Por ejemplo la clase auto proviene de la clase vehículo y de la clase auto se puede tener camiones. son mesas pero con características propias y como te das cuenta para cada objeto no necesitas definir cada uno de sus atributos nuevamente ya que lo “heredan” desde la clase de donde han sido creados. y “objetos” que viene a ser cada uno de los elementos que existen en la realidad y que provienen de una clase. celular o mp4 hasta electrodomésticos como cafeteras inteligentes o un refrigerador que detecta que cosas te hacen falta y manda el pedido al supermercado…. Este libro pretende mostrarte la forma de programación orientada a objetos y la manera cómo usarlos. De pronto necesitas un lugar donde escribir así que decides ir al carpintero y le dices: “necesito un mueble cuatro patas hecho de madera con cajones incluidos de la altura necesaria para poder sentarme en una silla y usarla para escribir”. Entonces ya podemos entrar a hablar de “clases” que vienen a ser las “palabras” . es decir. interactuar con ellos y hacer que ellos interactúen entre sí. Incluso las clases pueden crearse a partir de otras clases. es un lenguaje de objetos que obviamente provienen de clases.Estructura de Datos Imaginémonos por un momento que no existieran por un momento algunas palabras en nuestro vocablo. mesa de centro. java te permite escribir programas que funcionan en aparatos como una computadora. Java está orientado definitivamente a objetos. Computación. ¿Y si necesitas una mesa de centro para tu sala? … como puedes ver. las palabras que usamos se refieren a un elemento en particular pero de éste existen variantes de acuerdo a sus características propias. reloj. Y seguramente ahora te preguntarás ¿Por qué clases y objetos? La respuesta es fácil: Porque si necesitas varios objetos. etc. Por otro lado.99% de los procesadores que existen) Así de práctico es java y seguro que le encontrarás más de una utilidad. Así. Para el ejemplo anterior. Informática & Sistemas 5 . mesa de noche y otros nacen desde la palabra mesa. Estructura de Datos Computación. Informática & Sistemas 6 . O.While) ________________________44 Tema 4: Funciones y Procedimientos ______________________________________54 Tema 5: Arreglos (Vectores y Matrices) ____________________________________82 Tema 6: Métodos de ordenamiento y búsquedas ____________________________95 Tema 7 : Programacion Orientada a Objetos (P. Informática & Sistemas 7 .O.) ________________________105 Tema 8: ArrayList de Objetos ___________________________________________145 Tema 9: Listas enlazadas _______________________________________________155 Tema 10: Pilas y Colas _________________________________________________161 Computación.Estructura de Datos INDICE Tema 1: Introducción a Java _____________________________________________11 Tema 2: Sentencias Condicionales If y Switch ________________________________27 Tema 3: Sentencias Repetitivas – Bucles (For . Informática & Sistemas 8 .Estructura de Datos Computación. Estructura de Datos Computación. Informática & Sistemas 9 . Estructura de Datos Computación. Informática & Sistemas 10 . Portable. Multiplataforma: El código generado puede ser interpretado por diferentes tipos de dispositivos (Hardware y Sistema Operativo) y actuar en todos ellos por igual. incompatibilidades de software y hardware. Orientado a Objetos. Interpretado. equipos digitales. donde había un caos tremendo en el cual cada empresa líder trataba de implantar su propio estándar. se intentó con juegos de video. Sencillo: Para entender el funcionamiento de este lenguaje de programación no es necesario tener grandes conocimientos o dominios de programación avanzada. pero no había un medio en el cual se podía encontrar una aplicación real. debido a que la tecnología de objetos es segura y se toma con gran importancia para el desarrollo de sistemas modernos. Robusto. Distribuido.Estructura de Datos Tema 1: Introducción a Java Qué es Java Inicialmente Java fue creado por un grupo de investigadores de Sun Microsystems como un lenguaje de programación multipropósito y que funcionara no sólo en computadoras. hasta que llegó la oportunidad esperada: Internet y la World Wide Web. logrando así encontrar un medio ideal para su difusión. funcionales como los tipos Cliente Servidor. pero no se podía difundir. Seguro. Informática & Sistemas 11 . Todo lo que existe en java son objetos. Alto rendimiento. Ahora es compilado JIT. Dinámico. desde su creación Java mostró ser muy sólido. lo que lo hace fácil de identificar. sino que en cualquier dispositivo electrónico que necesite de una programación. Para los nuevos en este lenguaje les da una idea general de cómo se trabaja con el lenguaje C. Familiar: Sintaxis parecida a C / C++. Características de Java Simple. Arquitectura Neutral. Multithread. Java surgió como una respuesta por parte Sun Microsystems para el creciente mundo del desarrollo de aplicaciones internet. Lenguaje de objetos: No basado en objetos. donde una aplicación funcionaba en un servidor y no en otro debido a diferencias en el sistema operativo. Computación. el equipo de desarrollo de Java adaptó este nuevo lenguaje para que funcionara en la Web. Le permite además que cada Thread de una aplicación java pueda correr en una CPU distinta. si la aplicación se ejecuta en una máquina que posee varias CPU. De alto rendimiento: La creación de programas Java puede estar sujeta al uso de librerías existentes que no necesitan ser declaradas en cada uso. aumentando el alcance de la característica multiplataforma. sino. El siguiente paso es compilar y ejecutar el programa. Para crear un programa o aplicación en java es necesario aparte de definir e implementar las clases que generarán el programa definir una clase que contenga un método especial que indica el punto de entrada que es: public static void main (String[ ] args) Sintaxis: class NombreAplicacion { public static void main (String[] args) { // Código que crea los objetos necesarios para que funcione la aplicación } } Este ejemplo se puede usar como plantilla para todas las aplicaciones en java pues sólo basta con cambiar el nombre de la clase con el de la aplicación.Estructura de Datos Robusto: El compilador de Java puede detecta errores que impiden la creación de programas con fallos y avisa sobre los mismos para poder corregirlos. Multithread: Soporta de modo nativo los threads. Computación. Portable: La implementación de programas Java sigue los estándares y se respetan para toda aplicación creada con este lenguaje. una de las cuales se llama main. sin necesidad del uso de de librerías específicas. pasos que dependen de la herramienta de desarrollo. se crean programas que no atentan contra la información del usuario al no permitir leer o escribir en el disco duro. Seguro: Cuando se programa para aplicaciones web (applets). Estructura de un Programa en Java Todo programa en Java consta de una o más funciones. solo referenciadas para usarlas libremente. Informática & Sistemas 12 . Se utilizan para identificar los tipos. El tipo puede ser: byte. float. Las palabras reservadas en este lenguaje se muestran a continuación. Una variable se define mediante la combinación de un identificador. ]. Estas palabras clave sólo se pueden utilizar para su propósito original y no se pueden utilizar como identificadores de nombres de variable. clase o método. aunque como se verá después. Las siguientes palabras están reservadas en Java: boolean break byte case catch char class const continue do double else extends final finally float for goto implements import instanceof int interface long native new package protected public return short static strictfp super switch synchronized throw throws transient try void volatile while Variables La variable es la unidad básica de almacenamiento en un programa en Java.identificador [= valor] . short. Informática & Sistemas 13 . String int float double Aquí un listado más completo: Cadenas Numero Entero Entero y Decimales Entero y Decimales más grande Computación. un tipo y un ámbito. La forma básica de una declaración de variable es: tipo identificador [= valor] [. boolean o el nombre de una clase o interfaz.. Declaración de Variables y Tipo de Datos En Java existen básicamente cuatro tipos de datos. int.Estructura de Datos Palabras Clave Reservadas Las palabras clave reservadas son identificadores especiales que el lenguaje Java se ha reservado para controlar cómo está definido su programa. double. modificadores y mecanismos para control de secuencia incorporados. long.. char. podremos definir nuestros propios tipos de datos a partir de estos cuatro. Estructura de Datos TIPO LO QUE ALMACENA false y true de -128 a 127 RANGO boolean variable booleana de 1 byte (8 bits) byte short int long float double char String entero de 1 byte (8 bits) entero de 2 byte (16 bits) entero de 4 byte (32 bits) entero de 8 byte (64 bits) entero de 4 byte (32 bits) entero de 8 byte (64 bits) de -32768 a 32767 de -2147483648 a 2147483647 de -2 -63 a2 63 -1 -46 6 dígitos significativos (10 . Importante: se puede inicializar una variable al momento de declararla por ejemplo: int a=10. Operadores Aritméticos. z va a ser igual a b mas c z va a ser igual a b mod de c Suma Resta Multiplicación División Módulo (resto) Computación. Declaración de variables Pare declarar una variable primero se pone el tipo y luego el nombre de la variable. relacionales y Lógicos Operadores Aritméticos Existen dos tipos de operadores aritméticos: Los binarios: + * / % Ejemplo: z = b + c. de Asignación. 10 ) . en este ejemplo se están declarando 2 variables de tipo int a y b. z = b % c. ejemplo: int a. Informática & Sistemas 14 . 10 308 38 15 dígitos significativos (10 -324 ) carácter UNICODE 2 bytes (16 bits) Comprende el código ASCII Juego de caracteres. b. b=20 String cad=”hola”. Informática & Sistemas 15 . Operadores de Asignación = += -= *= /= %= Asignación simple Suma Resta Multiplicación División Módulo (resto) Con estos operadores se pueden escribir. expresiones del tipo: n=n+3 k=k*(x-2) x =x/3 se puede escribir n+=3 lo podemos sustituir por k*=x-2 se puede escribir x/=3 Operadores relacionales Los operadores relacionales se utilizan para comparar el contenido de dos variables.Estructura de Datos Y los unarios: ++ -Incremento (suma 1) Decremento (resta 1) Ejemplo: a++. de forma más breve. Aquí la variable a se incrementa en 1. aquí la variable a disminuye en 1 que es lo mismo que decir a= a –1. es lo mismo que decir a = a + 1. lo mismo sucede para decremento una variable seria a--. En Java existen seis operadores relacionales básicos: > < >= <= == != Mayor que Menor que Mayor o igual que Menor o igual que Igual que Distinto que Operadores Lógico Los operadores lógicos básicos son tres: && || ! AND OR NOT (El valor contrario) Computación. Estructura de Datos Nota: A la hora de programar es conveniente añadir comentarios (cuantos más mejor) para poder saber qué función tiene cada parte del código, en caso de que no lo utilicemos durante algún tiempo. Además facilitaremos el trabajo a otros programadores que puedan utilizar nuestro archivo fuente. Para poner comentarios en un programa escrito en Java usamos los símbolos /* y */: /* Este es un ejemplo de comentario */ // Este también es un comentario /* Un comentario también puede estar escrito en varias líneas */ El símbolo /* se coloca al principio del comentario y el símbolo */ al final. El comentario, contenido entre estos dos símbolos, no será tenido en cuenta por el compilador. Puntos Importantes Toda instrucción lleva punto y coma (;) Al final. Cuando se abre una llave ({) quiere decir que se van a ejecutar una serie de sentencias hasta cuando se cierre la llave(}) Las palabras reservadas se escriben tal como son es decir no es lo mismo escribir main () que MAIN () o que Main () son sensibles a las mayúsculas y minúsculas. Casi todas las palabras se escriben en minúsculas. Si el teclado no está configurado debemos configurarlo en el panel de control, teclado, idiomas y escogemos español-Perú Función System.Out.Println Esta función permitirá visualizar algo por consola. Ejemplo 1: System.out.println ("Hola Mundo”); //Esto visualizara hola mundo Ejemplo 2: String cad=”Ana”; System.out.println ("Hola " + cad); //Esto visualizara hola Ana Computación, Informática & Sistemas 16 Estructura de Datos Librería JOptionPane Es un componente de la librería swing que muestra cuadros de dialogo, entre los cuales se pueden ingresar datos o visualizar datos Se necesita importar a la librería: import javax.swing.JOptionPane; String Nombre; Nombre=JOptionPane.showInputDialog("Ingrese Nombre "); //Esto mostrara una ventana en la cual se ingresara un nombre y ese nombre se guardara en la variable Nombre int Num; Num=JOptionPane.showInputDialog("Ingrese Numero "); (OJO esto dará un errorrrrrrr) //Aquí se ingresa un número y se guarda en la variable Num OJO: Esto dará un error debido a que todo lo que se ingresa por JOptionPane siempre será cadena y tendremos que convertirlo a número para poder guardarlo en la variable Num Num=Integer.parseInt(JOptionPane.showInputDialog("Ingrese Numero”); (Esto está bien) El JOptionPane también sirve para visualizar datos: Ejemplo 1: JOptionPane.showMessageDialog(null, “Hola Mundo”); //Esto imprimirá Hola Mundo Ejemplo 2: String Nombre=”Ana”; double prom=15.5; Resultado = "Nombre de Alumno : " + Nombre + "\nPromedio :" + prom; JOptionPane.showMessageDialog(null, Resultado); //Esto imprimirá Nombre de Alumno: Ana Promedio : 15.5 Conversión de Datos Integer.parseInt .- Convierte una cadena a Entero También tendremos: Double.parseDouble.- Convierte a double. Computación, Informática & Sistemas 17 Estructura de Datos Ejercicios de conocimiento resueltos 1. Clasifique los siguientes datos en simples y compuestos. El número de botones de una camisa. La altura de una torre. El número de pasajeros de un avión. El resultado de hacer una apuesta (ganar o perder). La letra 'b' escrita en mayúscula. Los datos de una cuenta bancaria. La capital de Canadá. Solución: Datos simples: Por ejemplo: 8 > Dato numérico entero. Por ejemplo: 120,5 > Dato numérico real. Por ejemplo: 227 > Dato numérico entero. Dato lógico 'B' > Dato de tipo carácter. Datos compuestos: Dato compuesto por: nombre, apellidos, etc. "Ottawa" > Dato de tipo cadena. 2. De las siguientes palabras, ¿Cuáles son reservadas y cuáles no los son?: cadena carácter compuesto entero falso lógico numérico real simple verdadero Solución: Son palabras reservadas en Java: cadena entero real verdadero Computación, Informática & Sistemas 18 ya que. dato estructurado. verdadero es un valor de tipo lógico. contrario a simple. pero no un tipo en sí mismo. ya que. es decir. pero no una palabra reservada faslo debería ser falso lógico debería ser logico (sin tilde) numérico es un tipo de dato. pero no una palabra reservada simple es un tipo de dato. De la lista siguiente. Informática & Sistemas 19 . es compuesto. una cadena está formada por varios caracteres. Computación. ¿Cuáles son tipos de datos simples? dato booleano dato cadena dato enumerado dato estructurado dato numérico dato ordinal dato real dato verdadero Solución: Son tipos de datos simples: dato booleano dato enumerado dato numérico dato ordinal dato real No lo son: dato cadena. dato verdadero. pero no una palabra reservada 3.Estructura de Datos No lo son: carácter debería ser caracter (sin tilde) compuesto es un tipo de dato. c. b.out.5 y altura 4. Solución: class Mensaje{ public static void main(String[]args){ System.2. Informática & Sistemas 20 . Solución: public class MultipleLinea { // el método main empieza la ejecución de la aplicación de Java public static void main( String args[] ) { System. System.out.println("Mensaje a mostrar").println(" Area igual a " + c). } } Hacer un programa que permita mostrar varias líneas en consola con una sola línea de comando. } } Computación.2 Solución: class AreaTrianguloRectanguloApli{ public static void main(String[]args){ double a. a=3.out.5.Estructura de Datos Ejercicios prácticos resueltos Hacer un programa java que permita mostrar el mensaje en pantalla. b=4. c=(a*b)/2.println("Bienvenido\na\nla programación\nen Java!"). }// fin del método main }// Realice un código Java que permita mostrar el área de un triangulo dada su base 3. print("Ingrese número: ").print("El doble del número es: " + n*2). //imprimir mensaje inicial System. //convirtiendo el valor string a entero int n = Integer. Informática & Sistemas 21 .out. //mostrando los resultados System.out.out. public class ejercicio { public static void main(String[] args) { //llamando a Scanner para permitir el ingreso desde consola Scanner scan = new Scanner(System.parseInt(Numero).nextLine(). Solución: Forma 1: Usando la clase Scanner import java.in).Estructura de Datos Hacer un programa que permita el ingreso de un numero y muestre su doble y triple.Scanner. //capturando el valor String Numero = scan. System.util.print("El triple del número es: " + n*3). } } Computación. //mostrando los resultados System. //Pidiendo ingreso de número System.out.Readline(). int n. public class ejercicio { public static void main(String[] args) { String Num.in). //creación del flujo para leer datos InputStramReader Lectura = new InputStramReader(System. //capturando el valor Num = leer. System.io. Computación. Informática & Sistemas 22 .Estructura de Datos Forma 2: Usando la clase IO import java.out.in)).print("Ingrese número: "). //creación del filtro para optimizar la lectura de datos BufferedReader leer = new BufferedReader(Lectura).out. //convirtiendo el valor string a entero n = Integer. } } NOTA La creación del filtro para capturar datos desde teclado puede hacerse en una sola línea de comando: BufferedReader leer=new BufferedReader(new InputStreamReader(System.print("El triple del número es: " + n*3).parseInt(Num).print("El doble del número es: " + n*2).*. //Aquí se ingresa un número mediante el JOptionPane //Hay que recordar que todo lo que se ingresa es cadena N1=JOptionPane.parseInt(N1).parseInt(JOptionPane.swing. n2.out //System. //Aquí se convierte lo que se ingreso a Número Entero n=Integer. double prom. mostrar su nombre y su promedio.println("El doble es " + n*2).Resultado).showMessageDialog(null. Nombre=JOptionPane. //También podríamos visualizar con System. //Aquí se visualiza un resultado (primero se pone null y de ahí lo que se quiere visualizar JOptionPane. import javax.JOptionPane.showInputDialog("Ingrese Nombre "). prom = (n1+n2) /2.parseInt(JOptionPane.showInputDialog("Ingrese Nota 2 ")). n2=Integer. public class Ejercicio2 { public static void main(String[] args) { String Nombre.showMessageDialog(null."El Doble es " + n*2). int n. } } Computación. Informática & Sistemas 23 .out. Resultado = "Nombre de Alumno : " + Nombre + "\nPromedio :" + prom. n1=Integer.swing. } } Ejercicio 2: Ingresar el nombre y las 2 notas de un alumno. //Se llama a esta librería para poder utilizar el JOptionPane public class Ejercicio1 { public static void main(String[] args) { String N1. String Resultado.showInputDialog("Ingrese Nota 1 ")). JOptionPane.showInputDialog("Ingrese Número ").JOptionPane.Estructura de Datos Ejercicios prácticos resueltos con JOptionPane Ejercicio 1: Ingresar un número y mostrar el doble. int n1. import javax. double Precio. precio y cantidad. num=Integer. mostrar el monto.swing. Nombre=JOptionPane.out. public class Ejercicio3 { public static void main(String[] args) { String Nombre. int num. Monto =Precio * Cant.parseDouble(JOptionPane.Estructura de Datos Ejercicio 3: Ingresar el nombre. Monto.parseInt(JOptionPane. u. d=((num%1000)%100)/10.JOptionPane.JOptionPane.showInputDialog("Ingrese Nombre "). Cant=Integer. public class Ejercicio4 { public static void main(String[] args) { String Resultado. Precio=Double. int Cant.showInputDialog("Ingrese Cantidad ")).showInputDialog("Ingrese Número ")). d. import javax. u=num%10. c=(num%1000)/100. m. Computación.println("Monto es : " + Monto). c.showInputDialog("Ingrese Precio ")). } } Ejercicio 4: Ingresar un número de 4 cifras y mostrar la suma de sus cifras laterales y centrales import javax.swing. Informática & Sistemas 24 . System.parseInt(JOptionPane. m=num/1000. IGV. el precio por unidad y el nº de unidades y el programa sacará por pantalla el nombre del producto. Para cada uno de los puntos siguientes escribir un programa que pida los datos necesarios y calcule el área y el perímetro de la figura indicada. } } Laboratorio 1: Estructuras Básicas 1. y total a pagar.Estructura de Datos Resultado = "El numero ingresado fue :" + num + "\nSumade Cifras Centrales es : " +(c+d) + "\nSuma e cifras Laterales es :" + (m+u). Un cuadrado Un rectángulo Un triángulo Un círculo 3. Escribir un programa para calcular el importe de una venta en un supermercado. Qué tipo de datos resulta más adecuado para representar cada uno de los conceptos siguientes : El sueldo de un trabajador La edad de una persona El número de hijos El estado civil El estado de caducado no de un producto El nº de teléfono La dirección. Un edificio tiene 14 escalones entre pisos. El usuario debe indicar el nombre del producto. mostrar el subtotal. 4. Se ingresa el valor de costo de un producto y la cantidad comprada.Resultado). Computación. el nº de unidades vendidas y el precio total. Calcule cuantos pisos sube una persona que ha recorrido 86 escalones. Informática & Sistemas 25 .showMessageDialog(null. Preste especial atención a qué tipo de datos resulta más adecuado para cada representar cada cantidad. JOptionPane. 5. 2. Ingrese tres números. Desarrolle un programa que solucione el enunciado siguiente: Se ingresa el nombre de un empleado.50 soles. El programa debe mostrar: El número de cajas. Escribir un programa que calcule la nómina de un trabajador de la manera siguiente. 9. El precio de cada caja. Desarrolle un algoritmo para mostrar cada una de las cifras de un número de 4 cifras ingresado por pantalla y muestre también la suma de sus cifras. 12. Informática & Sistemas 26 . Se sabe que cada caja puede contener 14 libros. El trabajador cobra un precio fijo por hora y se le retiene un 5% en concepto de IRPF. Se ingresa el número de libros y el precio de cada libro. Una empaquetadora recibe un número de libros para colocar en cajas.Estructura de Datos 6. calcule su producto y suma y el resultado de la diferencia de estos resultados. Mostrar el descuento (5%) y el sueldo total. la retención y el sueldo neto. El programa debe pedir el nombre del trabajador. Ingrese un número entero de 2 cifras y muestre cada una de sus cifras por separado. Por cada año de servicio recibe S/. 10. Escribir un programa que imprima por pantalla los códigos ASCII correspondientes a los números 32 al 127.21 y se desea mostrar su área y perímetro. Se sabe que el lado de un cuadrado es 53. 8. las horas trabajadas y el precio que cobra por hora. Como salida debe imprimir el sueldo bruto. 11. El sub total del importe El IGV (19%) El total a pagar 13. Construya un algoritmo para convertir dólares en soles. Computación. 7. 14. sueldo y tiempo servicio de un trabajador. sino ejecutará la sentencia2. 2-Tarde. Informática & Sistemas 27 . String msj.parseInt(JOptionPane. Formato: if (condición) { //bloque de programación } Ejemplo: if (condición) { sentencia1. } Si se cumple la condición ejecutará la sentencia1.Estructura de Datos Tema 2: Sentencias Condicionales If y Switch Sentencias Condicionales Sentencia IF_ELSE (SI SINO) La sentencia sólo se ejecuta si se cumple la condición. turno=Integer. }else{ msj="Noche".swing. } else { sentencia2. Computación. if(turno==1){ msj=“Mañana” }else{ If(turno==2){ msj="Tarde". public class Ejercicio1 { public static void main(String[] args){ int turno.Noche) turno y visualice el nombre del turno (1- import javax. En cualquier caso. 3.showInputDialog("Ingrese Nro de Turno ")). el programa continuará después de haber cerrado la llave del else Nota: Si hubiera más de una sentencia dentro del If o el else se abrirá con llaves Ejemplo 1: Ingrese por teclado un numero de Mañana.JOptionPane. En caso contrario el programa sigue su curso sin ejecutar la sentencia. if(n1>n2 && n1>n3){ mayor = n1. n1=Integer.parseInt(JOptionPane.msj. import javax. n3=Integer.showInputDialog("Ingrese Número 1")). Computación.n2."Mayor es " + mayor).n3. msj).swing.showInputDialog("Ingrese Número 1")).swing. } } Ejemplo 2: Ingrese por teclado una contraseña si esta es igual a “IDAT” se debe visualizar el mensaje “Acceso Permitido” en caso contrario visualizar el mensaje “Acceso Denegado” import javax. } JOptionPane.mayor. } JOptionPane.showMessageDialog(null.parseInt(JOptionPane.msj). } } && significa “Y” y || significa “O”. public class Ejercicio1 { public static void main(String[] args){ String pwd. pwd=JOptionPane. } if(n3>n1 && n3>n1){ mayor = n3.showInputDialog("Ingrese Contraseña "). mayor=0.parseInt(JOptionPane.equals("IDAT")){ msj=“Acceso Permitido” }else{ msj="Acceso Denegado". n2=Integer. } } Ejemplo 3: Ingrese tres números por teclado y visualice el mayor.showInputDialog("Ingrese Número 1")). if(pwd. Informática & Sistemas 28 . } if(n2>n1 && n2>n3){ mayor = n2.showMessageDialog(null.JOptionPane.showMessageDialog(null. public class Ejercicio2 { public static void main(String[] args){ int n1.JOptionPane.Estructura de Datos } } JOptionPane. } Con el operador ternario seria así: Num = (Num >300&&Num < 500?Num + (Num *0.10):Num – (Num * 0. Cuando se utiliza el operador ternario el resultado de este se debe guardar en una variable de lo contrario saldrá error. }else{ Num = Num .(num * 0.20)).20). Informática & Sistemas 29 .Estructura de Datos Operador Ternario: Sintaxis: Var = (condicion?verdad: falso). Condición Verdad Falso Esta sentencia se lee así: en la variable num se va a guardar dependiendo de la condición si la cumple se guardara num incrementado en un 10% si no se guardara num disminuido en un 20% Computación. Ejemplo3: Se tiene un numero si este es mayor que 300 y menor 500 se deberá incrementar en un 10% de lo contrario se deberá disminuir en un 20% Con el if normal sería así: If(Num >300&&Num < 500){ Num = Num + (Num * 0.10). parseInt(Numero ). Informática & Sistemas 30 .INFORMATION_MESSAGE). } } 2."Resultado". si es positivo sumarle 20 y mostrarlo.parseInt(Numero )."Resultado".swing. int n = Integer.JOptionPane. “éxito”. public class Main { public static void main(String[] args) { String Numero = JOptionPane. import javax. n = Integer. n.showMessageDialog(null. } JOptionPane. Numero =JOptionPane. if ((n % 5) = = 0) { JOptionPane. Ingresar un número y si es divisible entre 5 mostrar un mensaje de “éxito”.showInputDialog("Ingrese Número:").JOptionPane.showMessageDialog(null. public class Main { public static void main(String[] args) { String Numero.Estructura de Datos Ejercicios Resueltos 1.JOptionPane. if (n > 0) { n=n+20.showInputDialog("Ingrese Número:"). int n. } } } Computación.INFORMATION_MESSAGE ). Ingresar un número por teclado. "Segundo".JOptionPane. Si el primero es menor o igual que el segundo. que imprima el mensaje “Segundo”.INFORMATION_MESSAGE). que imprima el mensaje “Primero”.showMessageDialog( null. import javax.parseInt(Numero1).showInputDialog("1º Número:").swing.showInputDialog("2º Número:"). } } } Computación. Informática & Sistemas 31 . public class Main { public static void main(String[] args) { String Numero1. Numero2 =JOptionPane."Primero". SINTAXIS if (condicion){ //sentencias 1 }else{ //sentencias 2 } Escribir un programa el cual lea dos valores enteros. se realiza otro bloque de sentencias. n1 = Integer. n2 = Integer.showMessageDialog( null.INFORMATION_MESSAGE). Numero1 =JOptionPane.JOptionPane. n2. "Resultado".parseInt(Numero2). Numero2. en caso de no cumplirse la condición."Resultado".JOptionPane. }else{ JOptionPane. Si el segundo es menor que el primero. if(n1 <= n2){ JOptionPane.Estructura de Datos ESTRUCTURA SELECTIVA DOBLE Realiza la ejecución de sentencias si la condición que valida es verdadera. int n1. showInputDialog("1º Nota:"). Numero2.INFORMATION_MESSAGE). promedio = (n1+n2)/2.parseInt(Numero2).Estructura de Datos Elaborar un algoritmo que me calcule el promedio de tres notas y me muestre Aprobado si su promedio es mayor que 10."Desaprobado"."Aprobado". import javax. n1 = Integer. }else{ JOptionPane. } } } Computación.showMessageDialog( null. Informática & Sistemas 32 .JOptionPane. Numero1 =JOptionPane.swing.5 caso contrario me muestre Desaprobado.showInputDialog("2º Nota:"). n2 = Integer. int n1.5){ JOptionPane. if(promedio >= 10. Numero2 =JOptionPane. n2. "Resultado".parseInt(Numero1).showMessageDialog( null.JOptionPane.INFORMATION_MESSAGE). public class Main { public static void main(String[] args) { String Numero1.JOptionPane. double promedio. "Resultado". n1 = Integer.parseInt(N1). Si el promedio es <=10 mostrar "Malo".JOptionPane.5 y <15 mostrar "Regular". Si el promedio es >=10. import javax. N1 =JOptionPane. double prom. Confeccionar un programa que pida por teclado tres notas de un alumno. Computación. N2. n2. n3. if (condicion){ [ if (condicion){ //sentencias 1 } [else{ //sentencias 2 }] ] }else{ [ if (condicion){ //sentencias 1 } [else{ //sentencias 2 }] ] } 1. public class Main { public static void main(String[] args) { String N1. N3.Estructura de Datos ESTRUCTURA SELECTIVA ANIDADA Decimos que una estructura condicional es anidada cuando por la rama del verdadero o el falso de una estructura condicional hay otra estructura condicional.swing.showInputDialog("1º Nota :"). int n1. calcule el promedio e imprima alguno de estos mensajes: Si el promedio es >=15 mostrar "Bueno". Informática & Sistemas 33 . JOptionPane.5){ JOptionPane.swing.JOptionPane.showInputDialog("2º Nota:"). n2 = Integer."Resultado". n3."Bueno".INFORMATION_MESSAGE ). n3 = Integer.parseInt(N3).showMessageDialog( null. }else{ JOptionPane.random().INFORMATION_MESSAGE ).parseInt(N2). public class Main { public static void main(String[] args) { double n1. JOptionPane.showMessageDialog( null.random(). Generaremos tres números aleatorios y luego imprimiremos el mayor de los tres import javax."Regular".INFORMATION_MESSAGE ).showMessageDialog( null."Malo". n2. n2 = Math. if(prom >= 15){ JOptionPane.Estructura de Datos N2 =JOptionPane.showInputDialog("2º Nota:"). N3 =JOptionPane. n3 = Math.random(). } } } } 2. prom = (n1+n2+n3)/3. Informática & Sistemas 34 . }else{ if (prom >= 10."Resultado". n1 = Math."Resultado".JOptionPane. if(n1 >= n2){ Computación. n3.n3. }else{ JOptionPane.INFORMATION_MESSAGE).JOptionPane.INFORMATION_MESSAGE).Estructura de Datos if (n1 >= n3){ JOptionPane.showMessageDialog( null.INFORMATION_MESSAGE).JOptionPane."Mayor n2"."Mayor n3". Informática & Sistemas 35 . } }else{ if (n2 >= n3){ JOptionPane. } } } } Computación.showMessageDialog( null. n1 .INFORMATION_MESSAGE).JOptionPane.JOptionPane.n2. }else{ JOptionPane."Mayor n3".showMessageDialog( null."Mayor n1".showMessageDialog( null. random(). } 1. Obtenga tres números aleatorios y muéstrelos en orden descendente. " + n3. n3. }else if (condicionn){ //sentencias n }else{ //sentencias.random(). String res=" ". if(n1 >= n2 && n2 >= n3){ res = n1 + " . n2.random().swing. public class Main { public static void main(String[] args) { double n1. }else if(n1 >= n3 && n3 >= n2){ Computación. n2 = Math. n1 = Math. n3 = Math. se recure a la selectiva múltiple formada por “else if” SINTAXIS if (condicion1) { //sentencias 1 }else if (condicion2){ //sentencias 2 }else if (condicion3){ //sentencias 3 ..JOptionPane. Informática & Sistemas 36 .. . import javax.Estructura de Datos Estructura Selectiva Múltiple Else If Si se desea comparar más de una variable o la comparación no es de igualdad. . " + n2 + " . showMessageDialog( null.showMessageDialog( null. " + n2. if(n1 >0){ res = "Positivo". " + n1.JOptionPane. " + n3 + " . }else if(n2 >= n1 && n1 >= n3){ res = n2 + " . } JOptionPane. " + n2. " + n1. " + n3. " + n3 + " . res. n1 = Integer. " + n1 + " .JOptionPane. }else{ res = "Negativo".INFORMATION_MESSAGE). double n1."Ordenado". }else if(n3 >= n1 && n1 >= n2){ res = n1 + " .Estructura de Datos res = n1 + " . import javax. Muestre si un numero ingresado es positivo."Resultado". " + n2 + " .res. " + n1 + " . public class Main { public static void main(String[] args) { String N1. negativo o cero.showInputDialog("Ingrese Número:").res.parseInt(N1).INFORMATION_MESSAGE). } } Computación. } } 2. }else if(n3 >= n2 && n2 >= n1){ res = n3 + " . }else if(n1 == 0){ res = "Cero". N1 =JOptionPane. } JOptionPane.swing. }else if(n2 >= n3 && n3 >= n1){ res = n2 + " .JOptionPane. Informática & Sistemas 37 . case 5: nomdia="Jueves". } JOptionPane. switch(dia){ case 1: nomdia="Domingo".parseInt(JOptionPane.. break. break.showInputDialog("Ingrese Día de la semana. dia=Integer. default: sentencias. case 6: nomdia="Viernes".JOptionPane.nomdia). } } Computación. } Cada case puede incluir una o más sentencias sin necesidad de ir entre llaves. Informática & Sistemas 38 . break. Ejemplo1: Ingrese un número del 1 al 7 y visualice que día es. en caso de que la opción escogida no exista. break. break.swing. break. public class Ejercicio3 { public static void main(String[] args) { int dia. break.. String nomdia="". case 3: nomdia="Martes". break.Estructura de Datos Sentencia SWITCH (EN CASO) switch (variable) { case contenido_variable1: sentencias. case 2: nomdia="Lunes". default :nomdia="No existe". ya que se ejecutan todas hasta que se encuentra la sentencia BREAK la variable evaluada sólo puede ser de tipo entero o carácter.")).. case 4: nomdia="Miércoles".showMessageDialog(null. default ejecutará las sentencias que incluya. import javax. break. break. case contenido_variable2: sentencias. case 7: nomdia="Sábado". case constante3: secuencia de sentencias break. SINTAXIS switch (variable) { case constante1: secuencia de sentencias break. . a menudo no es tan efectivo ni elegante. En estos casos es recomendable usar la sentencia switch para los casos en que se desea comparar con igualdad una variable entera.Estructura de Datos Aunque con la estructura condicional se pueden realizar múltiples comparaciones. break.. default: secuencia de sentencias } Es importante recalcar que no se puede probar más de una constante por case. case ' ': msj = “Es espacio”. es no teniendo sentencias asociados a un case. como se muestra a continuación: switch (letra) { case 'a': case 'e': case 'i': case 'o': case 'u': msj = “Es vocal”. break. break. con lo que se permite que el flujo del programa caiga al omitir las sentencias. Informática & Sistemas 39 . } Computación. default: msj = “Es otro caracter”. es decir. pero la forma como se puede simular este punto.. teniendo una sentencia nula donde sólo se pone el caso. case constante2: secuencia de sentencias break. Estructura de Datos EJERCICIOS RESUELTOS 1. Ingrese un número de un solo digito por teclado y visualice el nombre en letras. import javax.swing.JOptionPane; public class Main { public static void main(String[] args) { String Numero, letra; int n; Numero =JOptionPane.showInputDialog("Ingrese Número:"); n = Integer.parseInt(Numero ); switch(n){ case 0: letra = "cero"; break; case 1: letra = "uno"; break; case 2: letra = "dos"; break; case 3: letra = "tres"; break; case 4: letra = "cuatro"; break; case 5: letra = "cinco"; break; case 6: letra = "seis"; break; case 7: letra = "siete"; break; case 8: letra = "ocho"; break; case 9: letra = "nueve"; break; } JOptionPane.showMessageDialog( null,letra,"Resultado",JOptionPane.INFORMATION_MESSAGE); } } Computación, Informática & Sistemas 40 Estructura de Datos 2. Ingrese por teclado el número del mes (de acuerdo al orden) y muestre la cantidad de días que tiene. Considere año no bisiesto. import javax.swing.JOptionPane; public class Main { public static void main(String[] args) { String Mes; int n,dias = 0; Mes =JOptionPane.showInputDialog("Ingrese Número:"); n = Integer.parseInt(Mes); switch(n){ case 1: dias = 31; break; case 2: dias = 28; break; case 3: dias = 31; break; case 4: dias = 30; break; case 5: dias = 31; break; case 6: dias = 30; break; case 7: dias = 31; break; case 8: dias = 31; break; case 9: dias = 30; break; case 10: dias = 31; break; case 11: dias = 30; break; case 12: dias = 31; break; } JOptionPane.showMessageDialog( null,dias,"Resultado",JOptionPane.INFORMATION_MESSAGE); } } Computación, Informática & Sistemas 41 Estructura de Datos Laboratorio 2: Sentencias condicionales 1.- Ingrese por teclado la hora en formato de 24 horas y la cantidad de minutos al dar enter deberá salir la hora en formato de 12 horas por ejemplo si se ingresa 23 en una caja y en la otra 12 el resultado sería 11:12:PM. 2.- Ingrese la cantidad de minutos hablados por una persona y el tipo de llamada (Local, Nacional, Internacional).Se visualizara el importe de la llamada sabiendo que por los 3 primeros minutos se paga S/ 1.00 y por cada minuto adicional se paga 0.50 en caso sea local si es nacional se incrementa el 25% y si es internacional se incrementa el 60% a los precios por minuto. 3.-Ingrese por teclado dos números y un signo de operación (+,-,*, /) se deberá mostrar el resultado de la operación. 4.- Ingrese por teclado el nombre, año de nacimiento y el sexo de una persona (M o F), se deberá mostrar uno de los siguientes mensajes. - Varón mayor de edad - Varón menor de edad - Dama mayor de edad - Dama menor de edad 5.- Ingrese un número y visualícelo en romano. 6.- Ingrese por teclado el día de nacimiento y el mes de nacimiento de una persona al dar Enter se deberá mostrar su signo zodiacal. 7.- Se deberá desarrollar un algoritmo en el cual se deberá de ingresar el nombre de un alumno y el turno en el que estudia (M, T y N) así como también el ciclo (I, II, III, IV, V, VI y SIDET) y la carrera (CI, Enfermería y Administración) se deberá calcular el pago de su pensión en base a los siguientes datos: El precio por carrera es: CI = 320.00, Enfermería = 280.00, Administración = 270.00 Además que dependiendo del ciclo en el que están se pagara un recargo del precio de 10,20,30,40,50,60 y 70% (para sidet). Así como también si es del turno “M” se deberá recargar 10% mas solo si esta en I, II, o III ciclo, si es del turno “T” se recarga el 15 % mas solo si esta en I, o II y por ultimo si es del turno “N” se le hará un descuento del 15 % solo si esta en SIDET Al finalizar solo se debe mostrar el monto de la pensión. Computación, Informática & Sistemas 42 Estructura de Datos 8.- Diseñe un programa que me permita implementar un menú de opciones de conversión de Monedas: Convertir Soles a Dólares [1] Convertir Dólares a Euros [2] Convertir Euros a Dólares [3] Convertir Euros a Soles Convertir Salir [4] Soles a Euros [5] [6] Sabiendo que se tendrá que Ingresar a una de estas opciones e Ingresar el monto a convertir Para convertir soles a Dólares y a Euros. Considere el tipo de cambio 1Dolar= 3.52 soles y 1 Dólar=1.09 Euros 9.- Un instituto ofrece cursos de programación, el costo de los cursos es de la siguiente manera: Básico Profesor Alumno Externo Intermedio 50 40 70 70 50 100 Avanzado 100 80 120 Se pide elaborar un programa para emitir el recibo por dicho curso, los datos que se mostraran en el recibo son: nombre del participante, costo del curso y nivel del curso. Computación, Informática & Sistemas 43 Estructura de Datos Tema 3: Sentencias Repetitivas – Bucles (For While) Sentencia FOR (PARA HASTA) Su sintaxis es: for (inicialización;condición;incremento o decremento){ sentencia1; sentencia2; } El FOR necesita una variable que controle las vueltas que se da Esta variable guardara el inicio, la condición y el incremento o decremento. Ejemplo 1: for(i=0;i<=10;i++){ } En este for se está empezando de 0 y la condición es que mientras i sea menor o igual que 10, finalmente i se incrementara en 1 por cada vuelta que se dé. (Se dará 11 vueltas) Ejemplo 2: for(i=2;i<=10;i=i+2){ } En este FOR se empieza de 2 mientras que i sea menor o igual que 10, finalmente i se incrementara de 2 en 2. (se dará 5 vueltas). Ejemplo 3: For(i=10;i>0;i--){ } En este FOR se empieza de 10 mientras que i sea mayor que 0, finalmente i se decrementará en 1 (se dará 10 vueltas). Computación, Informática & Sistemas 44 Estructura de Datos EJERCICIOS RESUELTOS 1. Haga un programa que imprima los números del 20 al -10 en orden descendente. public class ejercicio { public static void main(String[] args) { int i; for (i =20 ; i==-10;i-- ){ System.out.println(i); } } } 2. Escribir un programa que lea 10 números y encuentre el promedio, el máximo y el mínimo de esos valores import java.util.Scanner; public class ejercicio { public static void main(String[] args) { int i, n, max, min; double prom; String Num; Scanner scan = new Scanner(System.in); System.out.print("Ingrese Número : "); Num = scan.nextLine(); n = Integer.parseInt(Num); max=n; min =n; prom=n; for (i =1 ; i<=9;i++ ){ System.out.print("Ingrese Número : "); Computación, Informática & Sistemas 45 Computación.println("El promedio es : " + prom).Estructura de Datos Num = scan.5.JOptionPane.9. Informática & Sistemas 46 . if(n<min){ min = n. } if(n>max){ max=n.i++){ System.println(i + " * " + Num + " = " + (i*Num)).out.out.7.2. public class Ejer1 { public static void main(String[] args){ int Num.out.i<=12. import javax.showInputDialog("Ingrese Número")).3.4. i. } } } En este ejercicio se ingresara un número y se almacenará en la variable num luego se tendrá que multiplicar esa variable por 1.nextLine().10.12 La sentencia System. System. } prom=prom+n. Num = Integer.8. for(i=1. } } Ejercicios prácticos Ejercicio 1: Ingrese un número y ver la tabla de multiplicar de ese número. } prom = prom/10. System.out.6. System.parseInt(JOptionPane.parseInt(Num).println("El máximo valor es : " + max).println(i + " * " + Num + " = " + (i*Num)). n = Integer.swing.11.println("El mínimo valor es : " + min).out. } if(Orden. Si el número a ingresar es el 6 el resultado sería si: Ejercicio 2: Visualizar los números pares o impares hasta el 100 en forma ascendente o descendente. Tipo = JOptionPane.i+=2){ System. valorfin = 99.swing.Estructura de Datos Significa que primero se escribirá el valor de i luego se escribirá el carácter “*" luego se va a escribir el valor de num luego se escribe el carácter “ = “ luego se escribe el valor de i * num. }else{ valorini=1.equals("P")){ valorini=2. Informática & Sistemas 47 . Para eso se ingresara por teclado que clase de numero se quiere ver „P‟ par o „I‟ impar y también se ingresara por teclado la forma de visualización si es „A‟ ascendente y si es „D‟ descendente. Esto se repetirá 12 veces.JOptionPane. Orden= JOptionPane.showInputDialog("Ingrese Orden de salida Ascen[A] o Desc[D]"). } Computación. public class Ejer2 { public static void main(String[] args){ String Tipo. valorfin=0. valorfin = 100. if(Tipo.out.i<=valorfin.println(i). i.equals("A")){ for(i=valorini.showInputDialog("Ingrese Tipo de números a Imprimir Par[P] o Impar[I]"). import javax. int Num. valorini=0. Orden. } } } } Ejercicio 3: Visualizar la tabla de multiplicar de un numero x para lo cual se deberá ingresar primero el numero que se va a multiplicar luego desde donde empieza la tabla y también hasta donde termina la tabla import javax.showInputDialog("Ingrese Número a multiplicar")).println(i + " * " + Num + " = " + (i*Num)). Fin = Integer.out.i++){ System.i>=valorini.i<=Fin.println(i).Estructura de Datos }else{ for(i=valorfin.parseInt(JOptionPane. Inicio. Inicio = Integer.JOptionPane. for(i=Inicio.parseInt(JOptionPane.showInputDialog("Ingrese Inicio de la tabla")). i.i-=2){ System. Informática & Sistemas 48 . } } } El resultado será el siguiente: Computación.parseInt(JOptionPane.showInputDialog("Ingrese Fin de la tabla")).swing. public class eJER3 { public static void main(String[] args){ int Num. Fin. Num = Integer.out. swing. Ejemplos resueltos Ejercicio 1: Ingresar un número de cualquier cantidad de cifras y al final mostrar la suma de sus cifras pares e impares.parseInt(JOptionPane. el programa vuelve a ejecutar las sentencias del bucle. sentencia2. } Esto se define Mientras que la condición se cumpla hacer.println("Suma de impares:" + sumimp).println("Suma de pares:" + sumpar). } } Computación.showInputDialog("Ingrese Numero")).out.JOptionPane. }while (condición). Esto se define Hacer mientras que la condición se cumpla. Y el DO WHILE controla la condición al final del bucle. Sintaxis del DO WHILE es: do{ sentencia1. Sintaxis del WHILE es: while (condición) { sentencia.out.Estructura de Datos Sentencia WHILE y DO WHILE (HACER MIENTRAS) Ambas sentencias son las mismas con la única diferencia que el WHILE controla la condición antes de entrar en el bucle. public class Ejer4 { public static void main(String[] args){ int numero. cifra. } else{ sumimp+=cifra. sumimp=0. Informática & Sistemas 49 . sumpar=0. import javax. if (cifra%2==0){ sumpar+=cifra. Si ésta se cumple. el programa no entrará en el bucle. while(numero>0){ cifra=numero%10. numero=Integer. Si ésta no se cumple. System. } numero=numero/10. } System. out. numero=numero/10. } System.println(num). while(numero>0){ cifra=numero%10. } } } { Computación. Informática & Sistemas 50 . } System.out. numero=Integer. while ( decimal > 0 ) { binario = decimal % 2 + binario. } } Ejercicio 4: Mostrar los números del 50 al 100 public class impnum{ public static void main(String arg[ ]) int num = 50.Estructura de Datos Ejercicio 2: Ingresar un número de cualquier cantidad de cifras y mostrarlo en forma invertida. public class Ejer5 { public static void main(String[] args){ int numero.println(binario). import javax.JOptionPane. } } Ejercicio 3: Convertir el número 25222 a base 2 public class Dec2Bin{ public static void main(String args[]){ int decimal = 252222.println("Número Invertido es :" + numeroinv). num = num + 1. String binario = "". numeroinv=numeroinv*10 + cifra. numeroinv=0.showInputDialog("Ingrese Número")).out. cifra. while(num < 101) { System. decimal /= 2.parseInt(JOptionPane.swing. public class ejercicio { public static void main(String[] args) { int n. Scanner scan = new Scanner(System.out. public class ejercicio { public static void main(String[] args) { int tot_num. do { operaciones ++. n = Integer.out. } } 2. do { System. if (Num != "no") { n = Integer. Pida por pantalla el ingreso de números enteros y muestre la cantidad de números ingresados y la suma de los mismos. import java. suma=0. suma = suma+n. multiplicarlo por 3 y sumarle 1.in). sino. Num = scan.Scanner.print("Ingrese número: "). también se deberá imprimir cuantas operaciones de estas son hechas. System. } suma = suma + 1. String Num.Scanner. }while(Num != "no").Estructura de Datos Ejercicios resueltos 1.parseInt(Num). Repetir lo anterior hasta que el valor sea 1.util.println("Cantidad de números : " + suma). String Num. operaciones = 0. System. if (n % 2 == 0){ Computación. import java. Realice esta acción hasta que el usuario ingrese “no”.nextLine(). operaciones. Leer un valor positivo mayor que 1. imprimiendo cada valor.out. dividirlo entre 2. y hacer la siguiente secuencia: si el número es par.nextLine().in). Scanner scan = new Scanner(System. tot_num=0.print("Ingrese número: ").util.parseInt(Num). n. res. Informática & Sistemas 51 . System. suma. Num = scan.out. tot_num = tot_num +1.println("La suma es : " + suma). 3. System. Realice un programa que permita ingresar el precio de pago del 1º grado y muestre el precio de los demás años de estudio. Roja 3.println("Resultado : " + res). Gris Camas 2 1 3 2 1 Planta Primera Primera Segunda Segunda Tercera Diseñe el algoritmo (en pseudocódigo) de un programa que: Muestre el listado de las habitaciones de la casa rural. impar o neutro.Estructura de Datos res = n/2. Pida por teclado el número (dato entero) asociado a una habitación. } } Laboratorio 3: Bucles 1. }else{ res = n+1. } System.println("Operaciones : " + operaciones). además de la planta donde está ubicada cada una de ellas: Habitación 1. Se ingresa un año por teclado. determine si es par. }while(n > 0). Rosa 5. Azul 2. 2. Verde 4. Visualice la suma de las cifras de un número introducido por teclado y muestre la diferencia entre el número inicial y el resultante de colocar las cifras en orden inverso. En la siguiente tabla se muestra el número de camas de las habitaciones de una casa rural. Informática & Sistemas 52 . Muestre por pantalla la planta y el número de camas de la habitación seleccionada. Computación. 5. En un colegio primario aplican un 5% de aumento por cada grado de estudio. Haga un programa que lea un número por pantalla. 4. 6. Desarrolle un programa que permita intercambiar el valor de dos variables. el programa debe mostrar si es bisiesto o no.out.out. Imprimir el nombre del día. 15. luego el tercero se restará. Calcular los valores de la suma del capital y el interés compuesto para un período dado de años. Escribir un programa que lea dos caracteres. Suponer que el número es un día de la semana. que imprima el mensaje ``igual''. y la suma de los operandos que se restaron. el total de operandos de la operación (sin incluir el cero). Diseñe el algoritmo (en pseudocódigo) de un programa que: Pida por teclado la arista (dato real) de un cubo. Computación. e imprima su valor cuando se pueda interpretar como un número hexadecimal. Leer un valor entero. Si el segundo es menor que el primero. Si hay un error en la lectura de los datos. Escribir un programa que lea números hasta que se encuentre el cero. que imprima el mensaje ``Arriba''. Construir la tabla de multiplicar que el usuario indique. Por ejemplo para una entrada como: 1 3 1992 La salida será: Fecha anterior a 1-3-1992 es 29-02-1992. imprimir la fecha del día anterior. 8. Cuando se llegue a esta condición deberá imprimir el resultado. En el caso de que la arista sea mayor que cero. Si el primero es menor que el segundo. que imprima un mensaje conteniendo la palabra ``Error'' y haga finalice. 12. Repita los primeros pasos.Estructura de Datos 7. 9. Desplegar múltiplos de 4 entre 60 y 20 acompañados de su logaritmos de base 10 y base e respectivos. Suponer que 1 corresponde a lunes y así sucesivamente. que imprima el mensaje ``Abajo''. 11. Aceptar letras mayúsculas y minúsculas para los valores del 10 al 15. Escribir un programa el cual lea dos valores enteros. 13. 10. muestre por pantalla el mensaje:"El volumen del cubo de arista <arista> es: <volumen>". 14. Dados como entrada 3 enteros representando la fecha como día. mientras que. El segundo número se sumará al primero. mes. Si los números son iguales. el cuarto se sumará. Para cada año el interés es calculado como: interés = capital * tasa interés / 100 Capital += interés. la arista introducida sea mayor que cero. año. Muestre por pantalla cuantos volúmenes de cubos han sido calculados. Informática & Sistemas 53 . y así se deberá seguir alternado hasta que se llegue al cero. El valor devuelto por la función será de este tipo. Tipo y nombre de argumentos: son los parámetros que recibe la función. Si no queremos que retorne ningún valor deberemos indicar el tipo vacío ( void). Por defecto. la función devolverá un valor de tipo entero ( int ). Ejemplo: /* 1) */ /* 2) */ /* 3) */ /* 4) */ int sumar(int a. Algunas funciones hacen un proceso pero no devuelven nada. cada una de las cuáles tendrá una tarea determinada. si no indicamos el tipo.Estructura de Datos Tema 4: Funciones y Procedimientos Funciones Las funciones son bloques de código utilizados para dividir un programa en partes más pequeñas. Para luego retornar al punto desde donde fue llamada. Bloque de sentencias: es el conjunto de sentencias que serán ejecutadas cuando se realice la llamada a la función. es decir. Informática & Sistemas 54 . } Computación. Por último recalcar que los argumentos de la función y sus variables locales se destruirán al finalizar la ejecución de la misma. Nunca se debe llamar a la función main desde otro lugar del programa. Este valor se lo enviamos al hacer la llamada a la función. nombre_función: es el nombre que le daremos a la función. Es decir es un conjunto de sentencias que hacen un proceso y devuelven un valor. Pueden existir funciones que no reciban argumentos. en este caso a la función se le conoce como método o procedimiento Sintaxis: tipo_función nombre_función (tipo y nombre de argumentos) { Bloque de sentencias } tipo_función: puede ser de cualquier tipo de los que conocemos. Los argumentos de una función no son más que variables locales que reciben un valor. Las funciones pueden ser llamadas desde la función main o desde otras funciones. int b) { return a + b. 1.y).y. System. Crear una función que devuelva TRUE si un número es par caso contario devuelva FALSE class metodo1 { public static void main(String arg[ ]) { int a = 5. int b) tipo del resultado: int nombre del método: sumar lista de parámetros: int a. y = 34. int b 2. Instrucción: se retorna la suma de a y b 4. } } Resultado: 2. Cabecera del método: int sumar (int a.Estructura de Datos 1. x = 12.println("La suma es : " + s). if ( par(a) == true) Computación. Crear una función que devuelva la suma de 2 números class suma { public static void main(String arg[ ]) { int x.out. Informática & Sistemas 55 . } //Aquí se define la función public static int suma(int a. int s = suma(x. fin del bloque Si se coloca las palabras public static antes del método se logra un comportamiento de tipo global. int b) { return a + b. comienzo del bloque o cuerpo del método 3. println(a + " es impar").out. Informática & Sistemas 56 . } return p. llamando al método: invertir_num. System. if (num % 2 == 0) { p = true.println(a + " es par "). } } public static boolean par(int num) { boolean p = false.out. } } 3.parseInt(JOptionPane. Implementar un programa en java que determine los 100 primeros números palíndromes a partir de un número ingresado por teclado en adelante. System. numero = Integer.out.Estructura de Datos { System. while (contador < 100) { if ( invertir_num(numero) == numero) { Computación.println("\n").showInputDialog(“Ingrese número”)). } else { System.out. int contador = 0.println("\nLos 100 primeros palindromes a contar del " + numero). class palindromes { public static void main(String Arg[ ]) { int numero = 0. } } Computación. num_inv.Estructura de Datos System. } } public static int invertir_num ( int num ) { int div_entera. } return num_inv. div_entera = div_entera / 10. num_inv = 0. contador++. while (div_entera != 0) { resto = div_entera % 10. num_inv = num_inv * 10 + resto. resto = 0. Informática & Sistemas 57 . } numero++. resto.print(numero + "\t").out. div_entera = num. showMessageDialog( null. n1 = pedirnum(). Por lo tanto.swing."Resultado". sólo la copia cambia y el valor original permanece intacto. int n1.parseInt(nota). Imprimir nombre y promedio de un alumno. int n3){ double prom. Informática & Sistemas 58 . JOptionPane. si la función modifica el parámetro. si la función modifica el parámetro. public class Main { static double promedio (int n1.prom.n2 = pedirnum().n3 = pedirnum(). calcular promedio en una función y mostrar los resultados. import javax. return Integer. int n2.INFORMATION_MESSAGE ). n3. } public static void main(String[] args) { String nota.JOptionPane. return prom. } } Computación. prom = (n1+n2+n3)/3. Por lo tanto. Pasando parámetros por valor package ejemplo1.showInputDialog("Ingrese Nota1:"). n2.n3). el valor original en el código que llamó a la función cambia.Estructura de Datos Paso de valores a funciones En el paso de parámetros a funciones hay dos aproximaciones clásicas: el paso por valor y paso por referencia. prom = promedio(n1. double prom.n2. no la copia del valor. Paso por referencia significa que cuando un argumento se pasa a una función. } static int pedirnum(){ String nota =JOptionPane. Ejercicios Resueltos 1. Paso por valor significa que cuando un argumento se pasa a una función.JOptionPane. la función recibe la dirección de memoria del valor original. capturar 3 calificaciones y nombre en un procedimiento. la función recibe una copia del valor original. Informática & Sistemas 59 . Crear una tabla de multiplicar.JOptionPane. x = 10. } // Cierra clase 2. System. x. import java.parseInt(nota).println(tabla(n. operaciones en una función. mostrar(123). Hacer un programa que ejecute un procedimiento. } } } Ejercicios resueltos 1. x.swing.println("y="+y). Hacer un programa que muestre datos (enteros y cadenas) mediante procesos.showInputDialog("Ingrese Nota1:"). import javax.i)). } static void proc1(){ int y.i++){ System.*.out.println("x="+x). public class Ejemplo { public static void main(String[] args) { int x.io.swing. n = pedirnum(). La captación de variables será mediante funciones. muestra de datos en el principal. control de ciclo en el principal. public class Ejercicio1 { public static void main(String args[]){ Ejercicio1 x = new Ejercicio1(). capturar datos de entrada en función.mostrar("hola"). proc1(). y = 20. Computación.Estructura de Datos 2. return Integer. } public static void main(String[] args) { int i. una función “operación” que regrese de a cuerdo al parámetro recibido: el doble si es número o agregue la palabra “IDAT” si es cadena.out. el cual imprime una variable y su valor. System.i<=12. import javax. }. public class Main { public int pedirnum(){ String nota =JOptionPane.out. int por){ return (num + " x " +por + " = "+num*por). } public String tabla(int num. for (i=0.JOptionPane. operacion("Hola") ).-Area de un triángulo"+ "\n3.pedir("ingrese número". } public String pedir(String msj){ return JOptionPane. Construir un programa que contenga el siguiente menú con las opciones: 1-Pasar de Soles a Dólares 2-Calcular el área de un triangulo 3-Calcular el precio de una venta (cantidad * precio) 0-Salir import javax.showInputDialog(msj).-Boleta de venta"+ "\n0. public class NewClass { public static void main(String args[]){ String menu="Menú de Opciones"+ "\n1.-Soles a Dólares"+ "\n2.showMessageDialog(null. Informática & Sistemas 60 . switch(op){ case 1:SolesDolar(). do{ NewClass x = new NewClass().showInputDialog(msj). int i){ String var =JOptionPane. } public int pedir(String msj. int i = x.break. } public void mostrar(String msj){ JOptionPane.mostrar( x. } public int operacion(int var){ return var*2. 5). double opcion = x. op = (int)opcion.JOptionPane. } } 3. } public void mostrar(int msj){ JOptionPane.swing. Computación. x.-Salir". mostrar(s). String s = x.pedirnum(menu). } public String operacion(String cad){ return cad + " IDAT".msj).pedir("Ingrese cadena"). int op. x. x.parseInt(var).mostrar( x.operacion(5) ). return Integer.mostrar(i).msj).Estructura de Datos x.showMessageDialog(null. double area = b*h/2.msj).showMessageDialog(null.break. x. } public static void Triangulo(){ NewClass x = new NewClass().mostrar("El área es : " + area). case 3:Boleta(). double costo= pedirnum("Ingrese Costo").break. NewClass x = new NewClass(). } public static void Boleta(){ NewClass x = new NewClass(). double h = pedirnum("Ingrese Altura"). } }while(op!=0).mostrar("El total es" + total). } public static void SolesDolar(){ double soles=pedirnum("Ingrese Cantidad en Soles"). return Double.Estructura de Datos case 2:Triangulo().showInputDialog(msj).showMessageDialog(null. double total = can*costo. } static String pedirlet(String msj){ String nota =JOptionPane.msj). } static double pedirnum(String msj){ String nota =JOptionPane. } } Computación. } public void mostrar(String msj){ JOptionPane.mostrar(soles*3. return nota. x. } public void mostrar(double msj){ JOptionPane. double b = pedirnum("Ingrese Base"). Informática & Sistemas 61 . double can = pedirnum("Ingrese Cantidad").parseDouble(nota). x.12).showInputDialog(msj). alternativamente String str="El primer programa". Podemos conocer si un string comienza con un determinado prefijo. Computación.println("El primer programa"). según que el string comience o no por dicho prefijo.Estructura de Datos Funciones de Cadenas (Clase String) Dentro de un objeto de la clases String o StringBuffer. número de caracteres que guarda un string se llama a la función miembro length. A este array se accede a través de la función miembro de la clase. pero es un objeto de la clase String. Por ejemplo. que devuelve true o false. Java crea un array de caracteres de una forma similar a como lo hace el lenguaje C++. También se puede escribir. Cómo se obtiene información acerca del string Una vez creado un objeto de la clase String podemos obtener información relevante acerca del objeto a través de las funciones miembro.length(). String str=new String(). Informática & Sistemas 62 . pero aún no se ha creado ningún objeto de esta clase. Un string nulo es aquél que no contiene caracteres. cuando se escribe System. Java crea un objeto de la clase String automáticamente. Para obtener la longitud. Para crear un string explícitamente escribimos String str=new String("El primer programa"). String str="El primer programa". Para crear un string implícitamente basta poner una cadena de caracteres entre comillas dobles. Está declarando un objeto str de la clase String. Para crear un string nulo se puede hacer de estas dos formas String str="". int longitud=str. Sin embargo. String str. Los strings u objetos de la clase String se pueden crear explícitamente o implícitamente.out. llamando al método startsWith. int pos=str.equals(str2)){ System. }else{ System. boolean resultado=str. El segundo argumento le dice a la función indexOf que empiece a buscar la primera ocurrencia de la letra p a partir de la posición pos+1. } if(str1. String str2=new String("El lenguaje Java"). int pos=str. En este ejemplo la variable resultado tomará el valor true.indexOf('p').Estructura de Datos String str="El primer programa". mediante la función miembro endsWith.out. se llama a otra versión de la misma función pos=str. }else{ System. String str="El primer programa". String str="El primer programa".indexOf("pro"). String str="El primer programa". De modo similar.indexOf('p'. pos+1). podemos saber si un string finaliza con un conjunto dado de caracteres. Otra versión de indexOf busca la primera ocurrencia de un substring dentro del string. str1 y str2 ocupan posiciones distintas en memoria pero guardan los mismos datos. Si se quiere obtener la posición de la primera ocurrencia de la letra p.out. boolean resultado=str. Vemos que una clase puede definir varias funciones miembro con el mismo nombre pero que tienen distinto número de parámetros o de distinto tipo. En el siguiente código String str1="El lenguaje Java".println("El mismo contenido"). if(str1==str2){ System.println("Los mismos objetos").out. Informática & Sistemas 63 . se usa la función indexOf. } Esta porción de código devolverá que str1 y str2 son distintos objetos pero con el mismo contenido.println("Distinto contenido"). Para obtener las sucesivas posiciones de la letra p.endsWith("programa"). La comparación de strings nos da la oportunidad de distinguir entre el operador lógico == y la función miembro equals de la clase String.startsWith("El").println("Distintos objetos").out. Computación. Informática & Sistemas 64 .compareTo("Tomás"). La función miembro comapareTo devuelve un entero menor que cero si el objeto string es menor (en orden alfabético) que el string dado. Una segunda versión de la función miembro substring. La expresión (str1==str2) devolverá true. nos permite extraer un substring especificando la posición de comienzo y la el final.compareTo("Alberto"). La variable entera resultado tomará un valor mayor que cero.prinln("Son el mimso objeto "+(str1==str2). Se obtendrá el substring "Java".substring(12). String subStr=str. String str="El lenguaje Java". String str="El lenguaje Java". cero si son iguales. Los objetos str1 y str2 guardan la misma referencia al objeto de la clase String creado. String str="Tomás".equals("El lenguaje Java"). ya que Tomás está después de Alberto en orden alfabético. 11). y devuelve true cuando dos strings son iguales o false si son distintos.out. String str="Alberto". System. String str2=str1. int resultado=str. La variable entera resultado tomará un valor menor que cero.Estructura de Datos Cambiemos la segunda sentencia y escribamos String str1="El lenguaje Java". Computación. ya que Alberto está antes que Tomás en orden alfabético. En muchas ocasiones es necesario extraer una porción o substring de un string dado. int resultado=str. Para este propósito hay una función miembro de la clase String denominada substring. Para estraer un substring desde una posición determinada hasta el final del string escribimos String str="El lenguaje Java". boolean resultado=str. y mayor que cero si el objeto string es mayor que el string dado.substring(3. String subStr=str. el método equals compara un string con un objeto cualquiera que puede ser otro string. Asi pues. La variable resultado tomará el valor true. float.verde. double.doubleValue(). i++) { System. long. String str=String.split(". } Computación.morado.valueOf(valor).marrón". Para convertir un string en número decimal (double) se requieren dos pasos: convertir el string en un objeto de la clase envolvente Double. int numero=Integer. double numero=Double. que las posiciones se empiezan a contar desde cero.parseInt(str. String[] arrayColores = colores.Estructura de Datos Se obtendrá el substring "lenguaje". mediante la función miembro estática valueOf. for (int i = 0.azul.intValue(). Es muy útil cuando tenemos un conjunto de elementos separados por comas. Se puede hacer el mismo procedimiento para convertir un string a número entero String str="12". El método split devuelve un array de String. La clase String proporciona versiones de valueOf para convertir los datos primitivos: int. Cuando introducimos caracteres en un control de edición a veces es inevitable que aparezcan espacios ya sea al comienzo o al final. Para convertir un número en string se emplea la función miembro estática valueOf (más adelante explicaremos este tipo de funciones). Informática & Sistemas 65 . y a continuación convertir el objeto de la clase Double en un tipo primitivo double mediante la función doubleValue String str="12.out.valueOf(str).amarillo. Para eliminar estos espacios tenemos la función miembro trim String str=" 12 ". i < arrayColores. llamamos a la función miembro estática parseInt de la clase Integer (clase envolvente que describe los números enteros) String str=" 12 ".valueOf(str). Recuérdese. Por ejemplo: String colores = "rojo.35 ". // En este momento tenemos un array en el que cada elemento es un color.trim(). int numero=Integer. Para convertir un string en número entero.").println(arrayColores[i]). primero quitamos los espacios en blanco al principio y al final y luego.trim()). int valor=10.length. String str1=str. for(int i=0. los objetos de la clase String son constantes lo cual significa que por defecto. habrá 1000 porciones de memoria que el recolector de basura ha de identificar y liberar.. se puede emplear la clase StringBuffer que nos permite crear objetos dinámicos. se reserva una nueva porción de memoria y se desecha la vieja porción de memoria que es más pequeña (una palabra menos) para que sea liberada por el recolector de basura (grabage collector). decir. } //. objetos de la clase String. mensaje. Los arrays se estudiarán en la siguiente página. public class CrearMensaje{ public String getMensaje(String[] palabras){ StringBuffer mensaje=new StringBuffer(). } Computación. for(int i=0.length. que pueden modificarse.append(palabras[i]). Imaginemos una función miembro a la cual se le pasa un array de cadenas de caracteres.. i++){ mensaje. es. } //. i<palabras. Si el bucle se realiza 1000 veces. solamente se pueden crear y leer pero no se pueden modificar. Informática & Sistemas 66 .Estructura de Datos La salida será: rojo amarillo verde azul morado marrón La clase StringBuffer En la sección dedicada a los operadores hemos visto que es posible concatenar cadenas de caracteres. public class CrearMensaje{ public String getMensaje(String[] palabras){ String mensaje="". } return mensaje. Para evitar este trabajo extra al recolector de basura. Ahora bien.length. i<palabras.. } return mensaje. i++){ mensaje+=" "+palabras[i].. } Cada vez que se añade una nueva palabra.append(" ").toString(). 'a'. cada vez que se ejecuta el bucle. import javax. La función toString.. 'u'. 4 ). String s6 = new String( arregloByte ). Computación. // usar constructores de String String s1 = new String(). String salida = "s1: " + s1. String s3 = new String( arregloChar ). // anexar objetos String a salida String salida = "s1 = " + s1 + "\ns2 = " + s2 + "\ns3 = " + s3 + "\ns4 = " + s4 + "\ns5 = " + s5 + "\ns6 = " + s6. ( byte ) 'ñ'. convierte un objeto en una cadena de caracteres. String s5 = new String( arregloByte. String s4 = new String( arregloChar.exit( 0 ). ( byte ) 'n'.showMessageDialog( null. String s2 = new String( s ). ( byte ) 'e'. 'l'. Ejercicios resueltos de la Clase String 1. Informática & Sistemas 67 . 'ñ'.Estructura de Datos La función append incrementa la memoria reservada para el objeto mensaje con una palabra más sin crear nueva memoria. JOptionPane. 5 ).Este programa demuestra los métodos length. import javax. ( byte ) ' '.*.swing.. 'p'. char arregloChar[] = new char[ 4 ].*. System. charAt y getChars de la clase String.swing. 'm'. ' '. salida.Constructores de la clase String. String s = new String( "hola" ). byte arregloByte[] = { ( byte ) 'a'. 'o'. (byte) 'o' }. "Constructores de la clase String". que veremos más adelante. public class ConstructoresString { public static void main( String args[] ) { char arregloChar[] = { 'c'. 'e'. public class VariosString { public static void main( String args[] ) { String s1 = "hola a todos". } } 2. 7. JOptionPane. ( byte ) 'o'. ( byte ) 'u'.INFORMATION_MESSAGE ). 's' }. ( byte ) 'v'. 4. String salida = "s1 = " + s1 + "\ns2 = " + s2 + "\ns3 = " + s3 + "\ns4 = " + s4 + "\n\n". String s4 = "feliz cumpleaños". public class CompararString { public static void main( String args[] ) { String s1 = new String( "hola" ). JOptionPane. for ( int cuenta = 0.swing. // iterar a través de los caracteres en s1 y mostrar al revés salida += "\nLa cadena invertida es: ". salida += "\nEl arreglo de caracteres es: ". no son el mismo objeto salida += "s1 es igual a \"hola\"\n". 0 ).length() . import javax.charAt( cuenta ) + " ".. } } // fin de la clase VariosString 3. String s3 = "Feliz Cumpleaños".Estructura de Datos // probar método length salida += "\nLongitud de s1: " + s1.showMessageDialog( null.length.exit( 0 ). equalsIgnoreCase.JOptionPane. cuenta < arregloChar. // copiar caracteres de la cadena a arregloChar s1. JOptionPane. "Métodos de String para manipular caracteres". else salida += "s1 es distinta de \"hola\"\n". for ( int cuenta = s1.equals( "hola" ) ) // true salida += "s1 es igual a \"hola\"\n".length(). cuenta-.getChars( 0. // s1 es una copia de "hola" String s2 = "adiós". Informática & Sistemas 68 . System.) salida += s1. Computación.Los métodos equals. compareTo y regionMatches de String. // probar igualdad if ( s1.INFORMATION_MESSAGE ). arregloChar. // probar igualdad con == if ( s1 == "hola" ) // false. 4. salida.1. cuenta++ ) salida += arregloChar[ cuenta ]. cuenta >= 0. s4.exit( 0 ).startsWith( "em" ) ) salida += "\"" + cadenas[ cuenta ] + "\" empieza con \"em\"\n". JOptionPane. } } // fin de la clase CompararString 4. // probar igualdad (ignorar mayúsculas) if ( s3.compareTo( s1 ) es " + s2.compareTo( s2 ) + "\ns2.showMessageDialog( null. // probar compareTo salida += "\ns1.swing. JOptionPane. else salida += "Los primeros 5 caracteres de s3 y s4 no concuerdan\n". // probar regionMatches (susceptible a mayúsculas) if ( s3. "empezando". Computación.length. 5 ) ) salida += "Los primeros 5 caracteres de s3 y s4 concuerdan". // probar el método startsWith for ( int cuenta = 0.regionMatches( true. cuenta++ ) if ( cadenas[ cuenta ]. 0.compareTo( s1 ) + "\ns1.regionMatches( 0. 0. // probar regionMatches (ignorar mayúsculas) if ( s3.compareTo( s4 ) es " + s3.*. s4.compareTo( s1 ) + "\ns3. 0.Estructura de Datos else salida += "s1 es distinta de \"hola\"\n". else salida += "Los primeros 5 caracteres de s3 y s4 no concuerdan". System.Métodos startsWith and endsWith. public class InicioFinString { public static void main( String args[] ) { String cadenas[] = { "empezó". "terminando" }.. "Comparaciones entre cadenas".compareTo( s4 ) + "\ns4.compareTo( s1 ) es " + s1.compareTo( s3 ) + "\n\n". cuenta < cadenas.equalsIgnoreCase( s4 ) ) // true salida += "s3 es igual a s4\n". String salida = "".compareTo( s2 ) es " + s1. else salida += "s3 es distinta de s4\n". 5 ) ) salida += "Los primeros 5 caracteres de s3 y s4 concuerdan\n".INFORMATION_MESSAGE ). salida. import javax. Informática & Sistemas 69 . "terminó".compareTo( s3 ) es " + s4. public class MetodosIndexString { public static void main( String args[] ) { String letras = "abcdefghijklmabcdefghijklm".endsWith( "do" ) ) salida += "\"" + cadenas[ cuenta ] + "\" termina con \"do\"\n".*.Estructura de Datos salida += "\n".exit( 0 ).indexOf( '$' ).swing.length. salida.Métodos indexOf y lastIndexOf para buscar cadenas.showMessageDialog( null. cuenta++ ) if ( cadenas[ cuenta ].length. "Comparaciones con la clase String". salida += "\n'a' se encuentra en el índice " + letras.lastIndexOf( 'c' ). System. cuenta < cadenas. } } // fin de la clase InicioFinString 5. cuenta++ ) if ( cadenas[ cuenta ]. 25 ).startsWith( "pez". Informática & Sistemas 70 . salida += "\n'$' se encuentra en el índice " + letras. JOptionPane.INFORMATION_MESSAGE ).indexOf( 'c' ). cuenta < cadenas. salida += "\n".indexOf( 'a'. salida += "\nLa última 'a' se encuentra en el índice " + letras. // probar el método endsWith for ( int cuenta = 0. // probar método startsWith. empezando desde la posición // 2 de la cadena for ( int cuenta = 0. // probar indexOf para localizar un caracter en una cadena String salida = "'c' se encuentra en el índice " + letras. // probar lastIndexOf para buscar un caracter en una cadena salida += "\n\nLa última 'c' se encuentra en el índice " + letras. salida += "\nEl último '$' se encuentra en el índice " + Computación. 2 ) ) salida += "\"" + cadenas[ cuenta ] + "\" empieza con \"pez\" en la posición 2\n". JOptionPane.lastIndexOf( 'a'.. import javax. 1 ). salida += "La subcadena desde el índice 3 hasta 6 es " + "\"" + letras.lastIndexOf( "def".indexOf( "def".indexOf( "hola" ).lastIndexOf( '$' ).exit( 0 ). salida += "\nEl último \"hola\" se encuentra en el índice " + letras. 25 ). salida += "\nEl último \"def\" se encuentra en el índice " + letras.Estructura de Datos letras.exit( 0 ). // probar indexOf para localizar una subcadena en una cadena salida += "\n\n\"def\" se encuentra en el índice " + letras.*. // probar lastIndexOf para encontrar una subcadena en una cadena salida += "\n\nEl último \"def\" se encuentra en el índice " + letras. "Métodos de búsqueda de String".swing.lastIndexOf( "def" ).indexOf( "def" ). import javax. JOptionPane. Informática & Sistemas 71 .Los métodos substring de la clase String. } } // fin de la clase MetodosIndexString 6. JOptionPane. JOptionPane.showMessageDialog( null.lastIndexOf( "hola" ). "Métodos substring de la clase String". // probar métodos substring String salida = "La subcadena desde el índice 20 hasta el final es " + "\"" + letras.substring( 3. salida += "\n\"def\" se encuentra en el índice " + letras. System..showMessageDialog( null. salida += "\n\"hola\" se encuentra en el índice " + letras.substring( 20 ) + "\"\n". 7 ).INFORMATION_MESSAGE ). salida. 6 ) + "\"". } Computación. JOptionPane. public class SubString { public static void main( String args[] ) { String letras = "abcdefghijklmabcdefghijklm". salida. System.INFORMATION_MESSAGE ). concat( s2 ) = " + s1. salida += "\ns1 después de la concatenación = " + s1. import javax. String salida = "s1 = " + s1 + "\ns2 = " + s2. } } // fin de la clase ConcatenacionString Computación. JOptionPane. Informática & Sistemas 72 . public class ConcatenacionString { public static void main( String args[] ) { String s1 = new String( "Feliz " ).showMessageDialog( null. String s2 = new String( "Cumpleaños" ). System.swing. salida. salida += "\n\nResultado de of s1.*.concat( s2 ). "El método concat de String". JOptionPane.Estructura de Datos } // fin de la clase SubString // El método concat de la clase String.exit( 0 ).INFORMATION_MESSAGE ). donde enero es 0 y diciembre es 11.util. una de ellas era la interpretación de datos que tenían que ver con fechas.util.Date y es la representación de la fecha cuando trabajamos con JDBC (Java DabaBase Connectivity).Date representa un instante de tiempo específico. con precisión de milisegundos". Por ahora veamos las convenciones que sigue esta clase: El año "y" está representado por un entero igual a ("y" . 61 solo ocurre cuando se agrega el segundo adicional para ajustar la diferencia entre el reloj atómico y el tiempo de rotación de la tierra.1 la clase java. quiere decir que no solo se trata de una simple cadena al estilo yyyy/MM/dd. puede que sólo conozcamos la más mala para hacerlo. 1.1900). Antes del jdk1. Con estos artículos pretendo explicar un poco que clases tiene el lenguaje para trabajar con fechas.Date: Según la documentación "La clase java.Calendar para que esta se encargue de hacerlo (una delegación). así que en este momento esta clase. Los días y minutos se representan de forma corriente.31 y 0 . o peor aún. Son dos de las clases más usadas cuando una aplicación implica el trabajo con fechas: java.util.util. Entre 1 .Estructura de Datos Funciones de Fecha (Clase Date) Trabajar con fechas en java no es algo del otro mundo ni tiene demasiadas complicaciones. aunque la clase java. sólo hace lo que se mencionó al principio: "representa un instante de tiempo específico. Los segundos van entre 0 y 61.util.Date y java.util. La otra era el formateo (la forma como se muestra) y parseo (convertir un String a java. tiene una precisión de milisegundos. Por ejemplo el año 2004 se representa como 104 (2004 . No sobra mencionar que los métodos para obtener el año.Date siempre lo hace. los métodos más usados y algunas sugerencias para realizar un trabajo adecuado que nos facilite el mantenimiento de nuestras aplicaciones. es decir.util. pero la cantidad de formas que hay para hacerlo puede confundirnos. Al igual que su clase padre. Las horas van entre 0 y 23.Calendar se encargó de esto. son los campos almacenados en una base de datos cuyo tipo es una fecha que puede o no incluir la hora.util..sql. esto más que ser una especie de "autoadulación" para la clase. Los meses son representados por números entre 0 y 11. java. más adelante veremos cómo ampliar esta funcionalidad.sql. esos métodos ya está obsoletos y la clase java. mes y año. días. sino que almacena hasta milisegundos y que es posible trabajar con ellos. mes y día de esta clase ya están obsoletos y lo único que hacen es llamar a la clase java.Las clases java. con precisión de milisegundos".Date.sql.Date).Date tenía dos funciones adicionales a la que conocemos ahora. Informática & Sistemas 73 . con la excepción que al mostrarla en la salida estándar con el formato por defecto solo muestra el día. entre otros. Computación.1900).Date: Esta clase hereda de java.59 respectivamente. Hay que anotar también que para campos que almacenen solamente horas existen otras clases para manejarlos. Pero debido a las dificultades que presentaban estas funcionalidades a la hora de internacionalizar los programas. segundos. como años. donde la medianoche es 0 y el medio día 12. util.sql. Informática & Sistemas 74 . su valor el milisegundos será negativo. Computación.util.sql. si la imprimes tendrá el formato de java. pues esos milisegundos no son controlables cuando creamos la instancia de una fecha.sql.Date(utilDate. Aquí vienen dos puntos importantes: Si la fecha que almacena cualquiera de las clases es menor a las 00:00:00 enero 1 de 1970 GMT.Date(sqlDate.Date sqlDate = new java.getTime()). La fecha es susceptible a la zona horaria.Date utilDate = null. //Milisegundo cero //también se puede crear una instancia de java.out.Date otraFecha = new java.util.Date. //Fecha actual del sistema java. así que las siguientes instrucciones son válidas: java. Para pasar de java.Estructura de Datos En resumen ambas clases.util.Date(0). sólo se encargan de almacenar la cantidad de milisegundos que han pasado desde las 12 de la noche del primero de enero de 1970 en el meridiano de Greenwich.util.9 segundos cada año para ajustar la diferencia entre el reloj atómico y la velocidad de rotación de la tierra.Date System. sino a partir de las 19:00 de diciembre 31 de 1969.Date con parámetros iniciales java.sql.sql.sql.Date y java.Date */ System. //El primer segundo a partir del inicio Prueba a imprimir cada uno de estos valores y fíjate en la diferencia de formatos entre java.Date hereda de java. También se pueden tomar los milisegundos de java.Date fechaActual = new java.sql.util. /* aunque es java.Date sqlDate = new java.Date a java.sql. utilDate = sqlDate.sql. Por ejemplo en Colombia los milisegundos no se empiezan a contar desde enero 1 de 1970.Date inicioLocal = new java.sql. además como la clase intenta representar el "Tiempo Universal Coordinado" (UTC) suma 0. //esta vez se mostrará con el formato de java. java. Esto se traduce en que muy difícilmente podemos basarnos en valores como 0 o 60000 para realizar validaciones.Date de dos fomas.util.util.Date.getTime()).Date sqlDate = new java. java. Ambas clases se pueden instanciar directamente mediante new(). podemos llegar a tener problemas al confiar en los milisegundos que se tienen.util.Date(0).out.sql.util.Date(1000).util. Esto es importante porque si transportamos una fecha relativa de una zona a otra.Date.util. java.sql.Date().Date utilDate = null.Date necesita un parámetro en el constructor: el tiempo en milisegundos.sql.sql. recordemos que java. Se puede pasar de java. una de ellas es con una asignación simple: java.println(utilDate).sql.Date(0).println(utilDate).Date: java.util.util.Date().Date y pasarlos al constructor de java.util. los milisegundos no son ni siquiera iguales para la misma fecha en la misma zona horaria. pero la clase java.Date utilDate = new java.Date se deben tomar los milisegundos de la primera y pasarlos al constructor de la segunda: java.Date a java.util.util. utilDate = new java. peor aún. es decir.Date().compareTo(sqlDate) == 0){ System.println(sqlDate). if (utilDate. Como ambas clases heredan del java. a una instancia de esta podemos asignar cualquiera de las otras. if (utilDate. es muy fácil pasar de un tipo de dato a otro.sql.println("IGUALES").Date(utilDate.Date utilDate = new java. Las clases Time y Timestamp. Para comparar fechas usamos el método compareTo() que internamente compara los milisegundos entre ellas usando directamente los métodos getTime() de ambas clases.Date System.sql. } O lo que es equivalente: java. manteniendo los métodos de la clase asignada. su núcleo son los milisegundos. como es de imaginarse.sql.sql. java.Estructura de Datos //Con formato de java.Date sqlDate = new java. La clase Time es un envoltorio de la clase java. Informática & Sistemas 75 . java. Al igual que java. al imprimir se verá el mismo formato de la clase Time.util.util. }else{ System. mientras timestamp agrega fracciones de segundo a la cadena. si asignamos un Time a una java.Date.util.util.out.util.Date utilDate = new java. tanto Time como Timestamp se pueden instanciar directamente y su constructor tiene como parámetro el número de milisegundos.out.getTime() == sqlDate. } 2.Date().println("DIFERENTES"). son hijas (heredan) de java.sql. Computación. La clase Time solamente muestra la hora. Esto no quiere decir que no se puedan usar con otros fines.getTime()){ System.util. }else{ System. minutos y segundo. similar a la clase java. y como la clase java.util. minutos. java.Date.println("DIFERENTES").out.sql.getTime()).println("IGUALES").Date para representar los datos que consisten de horas.sql.Date es superclase de todas. Ambas clases pertenecen al API JDBC y son las encargadas de representar los campos de estos tipos en una base de datos.Date sqlDate = new java. es decir. Para convertir entre tipos de datos diferentes debemos usar los milisegundos de una clase y asignarlos a las instancias de las otras.getTime()).util. mientras Timestamp representa estos mismos datos más un atributo con nanosegundos.util. segundos y milisegundos.out.Date. cuando se muestra alguna de las clases mediante su método toString() se ven los datos que intentan representar.Date.Date(utilDate.out. de acuerdo a las especificaciones del lenguaje SQL para campos de tipo TIMESTAMP.Date. getTime(). System.println("util.out.println("sql.Time: 19:01:46 sql.util.Timestamp: ["+utilDate+"]").util. Informática & Sistemas 76 .Timestamp: "+sqlTimestamp).getTime()).Time sqlTime = new java.Date se le asigne uno del tipo Time.out. java.Date apuntando a sql.println("util.util.getTime()).println("util.Date: "+utilDate).sql.Date con milisegundos de sql.out.Date con milisegundos de sql.Date apuntando a sql.Date().println("sql.sql.util. System. Arroja: util.util. no importa que a un objeto del tipo java. creamos nuevas instancias con los milisegundos los formatos con que se muestran son los mismos.util.sql.Date apuntando a sql.Timestamp: 2004-05-20 19:01:46.Date utilDate = new java.Date con milisegundos de sql.Time: ["+utilDate+"]").out.Estructura de Datos Con este código: java. //fecha actual long lnMilisegundos = utilDate. System. System.468] Pero si en vez de solo apuntar.println("util.Timestamp(lnMilisegundos).Timestamp sqlTimestamp = new java.sql. System. Fíjese en el formato de salida: util.Date apuntando a sql.Date(sqlTimestamp. minutos y segundos.Time: [Thu May 20 19:54:42 GMT-05:00 2004] util. utilDate = new java.sql. al mostrar a través de la consola se invocará el método toString() de la clase time: utilDate = sqlTime.Date: Thu May 20 19:01:46 GMT-05:00 2004 sql. pues aunque este último únicamente muestra horas.Time: [19:29:47] util. Se obtiene la siguiente salida: util. Es decir.out.Date(sqlTime.593 Note que aún cuando todos los objetos tienen los mismos milisegundos el formato con el que se muestran depende de la clase que realmente los contiene.Date con milisegundos de sql. java.sql.Time(lnMilisegundos).Date usando los milisegundos del objeto sqlTime.Timestamp: ["+sqlTimestamp+"]").out.Date: "+sqlDate). siempre ha conservado todos los datos de la fecha con que se creó.Date: 2004-05-20 sql. java.out. utilDate = sqlTimestamp.Time: ["+sqlTime+"]").out. System.Date sqlDate = new java.Time: "+sqlTime). System.println("util.println("sql.Date(lnMilisegundos). Note que lo verdaderamente importante ocurre cuando creamos la instancia de java.Timestamp: [Thu May 20 19:54:42 GMT-05:00 2004] Computación. System. utilDate = new java.Timestamp: [2004-05-20 19:29:47. util.util.put("segundos". Esta no es la mejor forma para hacerlo.getTime(). resultadoMap.util.fechaMenor. minutos y segundos. //obtenemos los segundos long segundos = diferenciaMils / 1000.Date fecha2){ java.Date fecha1 = new java. Informática & Sistemas 77 .Date(-604070999750L).toString(minutos)).Long. fechaMenor = fecha1.util.toString(segundos)).util. } //los milisegundos long diferenciaMils = fechaMayor.put("minutos". //ponemos los resultados en un mapa :-) resultadoMap.1950 GMT-05:00 java.Date fechaMayor = null.toString(horas)). java. fechaMenor = fecha2.HashMap. /* Verificamos cual es la mayor de las dos fechas. java. import java. public class Prueba { public static Map getDiferencia(java. }else{ fechaMayor = fecha2. import java.util.util. return resultadoMap. */ if (fecha1. pero cabe bien para mostrar de forma práctica todos los conceptos anteriormente estudiados.Date fechaMenor = null. //obtenemos las horas long horas = segundos / 3600.util.Map.Long.Date fecha1.Long. para no tener sorpresas al momento * de realizar la resta. Computación.put("horas". //igual que el paso anterior long minutos = segundos /60.getTime() . segundos -= minutos*60.Estructura de Datos Para finalizar esta primera entrega veamos el código para mostrar la diferencia entre dos fechas en horas. //restamos las horas para continuar con minutos segundos -= horas*3600.compareTo(fecha2) > 0){ fechaMayor = fecha1. } public static void main(String[] args) { //5:30:00 de Noviembre 10 . resultadoMap. Map resultadoMap = new HashMap(). Si se importa la clase. En la próxima entrega veremos cómo realizar operaciones completas entre fechas utilizando las clases Calendar y GregorianCalendar. ¿Por qué? 2.sql. Existe un error de un segundo. parece que se han metido en una clase solamente a propósito de agrupación. Float. Todos los ejemplos los hemos hecho creando nuevas instancias de las clases. float y double Math.Estructura de Datos //6:45:20 de Noviembre 10 .asin( double ) Math. Sin embargo.1950 GMT-05:00 java. Este procedimiento funciona igual para todos los hijos de java. se tiene acceso al conjunto de funciones matemáticas estándar: Math. } } Diferencia entre fechas Fecha1: Fri Nov 10 05:30:00 GMT-05:00 1950 Fecha2: Fri Nov 10 06:45:21 GMT-05:00 1950 {segundos=20. 3.util.Date fecha2 = new java. pero todo lo que hemos hecho debe funcionar igual de ambas formas (con base de datos y usando constructores). por eso se encapsulan en Math.Timestamp. por los que no se pueden crear instancias de la clase. He omitido el traer información desde una base de datos para no complicar el código.exp( double ) Math.Date: java.util. Funciones Matemáticas (Clase Math) La clase Math representa la librería matemática de Java.sin( double ) Math. minutos=15} Notas: 1.out. El constructor de la clase es privado. etc.Time y java.abs( x ) para int.).floor( double ) Computación.println(getDiferencia(fecha1.tan( double ) Math. long. fecha2)).util.util.atan( double ) Math.Date. Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que inicializarla. y lo mismo sucede con las demás clases que corresponden a objetos que tienen un tipo equivalente (Character.double ) Math. Las funciones que contiene son las de todos los lenguajes. java.cos( double ) Math.util.Date(-604066478813L).ceil( double ) Math. //Luego vemos como obtuve esas fechas System. lo cual no sucede cuando trabajamos con fechas posteriores a 1970.sqrt( double ) Math. Informática & Sistemas 78 .log( double ) Math. horas=1.atan2( double.acos( double ) Math. min( a.println( max ). float max. float y double Math. z = Math.out.z.Estructura de Datos Math.max( a. Mates. long.pow( 2.round( 123.println( z ).println( y ). rand = Math.println( rand ).random() devuelve un double Math.4 ).rint( double ) Math. System.b ) Math. } } Computación.pow( a.E para la base exponencial Math. float y double Math.out. x = Math.(float)3e9 ). Informática & Sistemas 79 .567 ).abs( -123 ).out.random(). System. double rand.println( x ).java.round( x ) para double y float Math.b ) para int.max( (float)1e10.b ) para int.PI para PI He aquí un ejemplo. System. System. System.out.out. de uso de algunas funciones de la clase Math: class Mates { public static void main( String args[] ) { int x. long.y. y = Math. max = Math. Escribir un programa que imprima los caracteres ascii del 32 al 127. Construir una función que nos regrese el triple de cualquier número. Escribir una función que calcule la potencia de los parámetros ingresados. Construir un procedimiento que ordene ascendentemente 3 números y los muestre. 13. 16. Crear un programa que tenga el siguiente menú: a. Haga un programa java que pida un número. 9. 6. Escribe un procedimiento que escriba en pantalla los n primeros números primos. divisores. Construir una función que nos regrese la letra “I” o “P” si el número que recibió fue impar o par respectivamente. Escribe una función que reciba un número como parámetro y devuelva el número que se obtiene al invertir el orden de los dígitos del número original.F) Ingrese Edad. Construir un programa que pida un número. Escribe una función llamada media2 que reciba dos reales y devuelva el real que representa la media aritmética de ambos números. Escribir una función "Es Múltiplo" que sirva para determinar si un número es múltiplo de otra. El procedimiento recibe n como parámetro. si la función recibe el número 356 devolverá el número 653. la misma función lo graba con el 15% de IGV si no lo es. e. Ingrese nombre Ingrese sexo (M. 11. la cantidad de 10. calcule el factorial y muestre la suma de las cifras del factorial resultante. 3. Diseñar una función "aMayusculas()" que convierta una cadena de texto en mayúsculas. Por ejemplo. Construir un programa que emita una factura si el artículo es importado. Escribir dos funciones Entrada () y Salida () que incluyan todas las operaciones de entrada de datos y salida. Escribe luego un programa utilizando la función del ejercicio anterior que lea dos reales por teclado y devuelva la media aritmética de ambos. 4. Saludo (Buenos días Señor o Señorita . Construye una función para ver si un número es primo o no. una función lo graba con el 20% de IGV si es nacional.Estructura de Datos Laboratorio 4: Funciones y Métodos 1. 7. d. 8. c. 2. según sea el caso ) Salir Computación. visualice sus al divisores y la suma de los mismos. 12. 14. Informática & Sistemas 80 . y usa esa función para construir el procedimiento. 15. b. 5. Escribir una función que intercambie el valor de dos variables ingresadas por pantalla. Estructura de Datos 17. ii. Agregar a la frase introducida la cadena “Hola como estas” Computación. Informática & Sistemas 81 . b. Crear las siguientes opciones en un menú a. ii. Salir Volumen de un cubo Volumen de una esfera Mostrar la longitud de una cadena ingresada. c. Matemática i. Lenguaje i. Informática & Sistemas 82 .Estructura de Datos Tema 5: Arreglos (Vectores y Matrices) Arreglos de Variables (Vectores y Matrices) Un array permite referirse a una serie de elementos del mismo tipo con un mismo nombre que están almacenados de forma contigua en la memoria. V[4]=4.4}. y hace referencia un único elemento de la serie utilizando uno o más índices.7. Y se ha llenado así: M[0][0]=0 Computación. Ejemplos Gráfico de una Matriz: Índices de Columna Índices de Filas M La matriz se ha declarado de la siguiente manera: int M[][]=new int[3][4]. Y se ha llenado así: V[0]=15. V[1]=21. Tambien se podria llenar asi: int V []={ 15. Ejemplos Grafico de un vector: V El vector se ha declarado de la siguiente manera: int V[]=new int[5]. como un vector o una matriz en Álgebra. V[3]=18.21. V[2]=7.18. Informática & Sistemas 83 . ya que el arreglo “v” tiene 5 elementos [0 al 4] Si en caso tuviéramos esta matriz Int matriz[][]=new int[4][6] As Integer Para devolver la cantidad de filas seria: matriz. Este ejemplo declara un array de una dimensión.length y para devolver la cantidad de columnas seria matriz[0]. Buscar. Por ejemplo M[1][3] se está refiriendo a la fila 1 columna 3. esto último devuelve la cantidad de columnas que tiene la fila 0 de la matriz.length esto devolvería 5..Estructura de Datos M[0][1]=1 M[0][2]=2 M[0][3]=3 M[1][0]=4 M[1][1]=5 … etc. Procesos con Vectores (Añadir.. los índices se empiezan a contar en cero. vector[1]. con veinte elementos. matriz[3][5] de tipo entero. con 4 x 6 elementos. matriz[0][0]. llamado vector. llamado matriz. v. cada uno de los cuales permite almacenar un Double.length. Propiedades de los Arreglos: Entre las más importantes tenemos: length. vector[19]. Nótese que para llenar una matriz se indica en que fila y columna se va a llenar.Devuelve la cantidad de elementos que tiene un arreglo Ejemplo: Int v[]=new int[5]... . vector[0].. Salvo que se indique otra cosa. Ejemplo: double vector[]=new double[20]. . Eliminar): a) Añadir Elementos: Computación. . Int matriz[][]=new int[4][6] As Integer Este ejemplo declara un array de dos dimensiones. Recorrer. Computación. por ejemplo si nuestro arreglo tiene como último índice el número 4 nuestra siguiente posición tendrá que ser el número 5. do while o for. Solucionamos esto obteniendo el tamaño de nuestro arreglo con la propiedad length y asignamos ese valor obtenido como nuevo índice.Estructura de Datos Para añadir elementos debemos conocer el último índice del arreglo y agregarle una posición más. b) Recorrer Para recorrer un arreglo tenemos que utilizar una estructura de control. c) Buscar Para realizar las búsquedas dentro de un vector necesitamos conocer el elemento o índice a buscar. como puede ser un while. Informática & Sistemas 84 . out. Eliminar): d) Añadir Elementos: Para añadir elementos debemos conocer el tamaño de nuestra matriz. } } f) Buscar Para realizar las búsquedas dentro de una matriz necesitamos conocer el elemento o índice a buscar. int buscar = 20. Recorrer. tabla[ultimo x + 1][ultimo y + 1] = dato e) Recorrer Para recorrer una matriz tenemos que utilizar una estructura de control. j++){ System. Buscar. j < 5. i++){ for(int j = 0. i++){ for(int j = 0. j++){ Computación. ya que su tamaño es invariable. for( int i = 0. j < 5. i < 5. for( int i = 0. i < 5. como puede ser un while. Informática & Sistemas 85 .println(“” + tabla[i][j]). do while o for.Estructura de Datos Procesos con matrices (Añadir. Estructura de Datos if(tabla[i][j] == buscar){ System.i++){ Computación. public class Ejer1 { public static void main(String[] args){ int v[]=new int[5]. } } } Ejemplos Prácticos 1.JOptionPane.length. break.i<v. Llene un vector de 5 elementos con números aleatorios y muéstrelos. int i.println(“Numero encontrado”). for(i=0.swing. Informática & Sistemas 86 .out. import javax. i<v. } } } OJO : Math. Llene un vector de 10 elementos con números aleatorios del 0 al 100.men. int i.length.i++){ if (v[i]>may){ may=v[i]. System.random()*100). } } 3.i<v.may. } } System. public class Ejer5 { public static void main(String[] args){ int v[]=new int[10].println(""). public class Ejer2 { public static void main(String[] args){ int v[]=new int[10]. import javax. Computación.print(v[i]+"\t"). System.length.out. int i.JOptionPane.random()*10).print(v[i]+"\t").out.out.out. //Calculando el mayor y el menor número que hay en el arreglo men=v[0]. System.out. } may=v[0]. System. for(i=0.println("El mayor es: "+may).length.i<v.num.random()*10). System. Llene un vector de 10 elementos con números aleatorios del 0 al 100 se debe de mostrar los números generados además de el mayor y el menor. for(i=1. luego debe de ingresar por teclado un número y mostrar un mensaje si este existe o no.print(v[i]+"\t").println("El menor es: "+men).random()*10 genera un numero aleatorio del 0 al 10 el resultado sale con decimales (Int) convierte a entero 2.out.swing. int encontrado=0.Estructura de Datos v[i]=(int)(Math.i++){ v[i]=(int)(Math. for(i=0.i++){ //Llenando y Listando el vector v[i]=(int)(Math. Informática & Sistemas 87 . } if (v[i]<men){ men=v[i]. ?"). } } if(encontrado==0){ System. Llene una vector de 10 elementos con nombres de personas.showInputDialog("Ingrese Nombre a Buscar").out.rpta.Estructura de Datos } num = Integer.equalsIgnoreCase(nom)){ encontrado=1.i++){ if(v[i]==num){ encontrado=1.Pos=0. String nom.JOptionPane.println("El nombre " + nom + " SI esta en el arreglo"). } } } Computación.out.out.length. }while(!rpta.showInputDialog("Ingrese Nombre :").swing. de ahí se debe de ingresar un nombre a buscar. }else{ System.println("El Número SI se ha encontrado"). } nom =JOptionPane.out.i<Pos.i++){ System. break.encontrado=0.equalsIgnoreCase("N")). int i. for(i=0. }else{ System.println("El nombre " + nom + " NO esta en el arreglo").i<v.i<v.length. break.println(v[i]).i++){ if(v[i].parseInt(JOptionPane. import javax.println("El Número NO se ha encontrado"). } } if(encontrado==0){ System..showInputDialog("Desea ingresar otro nombre. for(i=0. public class Ejer6 { public static void main(String[] args){ String v[]=new String[10].showInputDialog("Ingrese Número a Buscar")). do{ v[Pos]=JOptionPane. rpta=JOptionPane. Pos++. for(i=0.out. } } } 4. al final se debe mostrar un mensaje si este se encuentra dentro del arreglo o no. Informática & Sistemas 88 . Llenar una matriz de 5x 5 con números aleatorios. al final muestre cuanto es la suma de cada fila de la matriz. System.equals(nom)){ Aquí se está comparando el “vector” de “i” con “nom” es decir: v[i]==nom Pero como es un arreglo de cadenas se utiliza la función equalsIgnoreCase o equals 5.length.out.print(m[f][c] + "\t").length.Estructura de Datos OJO: nótese la función equalsIgnoreCase en esta sentencia: if(v[i]. Computación. for(f=0. Llenar una matriz(3x4) con números aleatorios y muéstrelos por pantalla public class Ejer3 { public static void main(String[] args){ int m[][]=new int[3][4]. int f. Informática & Sistemas 89 .random()*100). } System.println("").c.f++){ for(c=0. } } } 6.out.c++){ m[f][c]=(int)(Math.c<m[0].f<m. random()*10).c++){ m[f][c]=(int)(Math.c<m[0].random()*10). } } } 7.length. Computación. for(c=0.out.length. x[f][c]=a[f][c]+b[f][c].f<m. suma+=m[f][c]. for(f=0.out.c. b[f][c]=(int)(Math. int f.print("="+suma). for(f=0.length.println("").f++){ suma=0.length.random()*100).c++){ a[f][c]=(int)(Math. } System.swing. public class Ejer7 { public static void main(String[] args){ int a[][]=new int[3][3]. Informática & Sistemas 90 .f++){ for(c=0.out. System. System.c<a[0]. int f. int b[][]=new int[3][3].suma.c. int x[][]=new int[3][3].JOptionPane.print(m[f][c] + "\t").f<a.Estructura de Datos public class Ejer4 { public static void main(String[] args){ int m[][]=new int[5][5]. Llene 2 matrices de 3 x3 con números aleatorios y en una tercera matriz guarde la suma de las 2 matrices anteriores import javax. b y c. public class Proyectil{ public static void main (String args []){ Computación.out. } System. } System.c++){ System.f<b.length.out.length.println("Listado matriz a"). for(f=0.print(a[f][c]+"\t").out. for(f=0.f++){ for(c=0.c<a[0].length. } System. import javax.length. for(f=0. } System.out. Informática & Sistemas 91 .out.println("Listado matriz x").out. y muestre la magnitud y dirección de dicho proyectil.out.out.println(""). } System.swing.println(""). Se sabe que la velocidad de un proyectil está dada por la ecuación.f<x. } } } Ejercicios Resueltos: 1.length.c++){ System.c++){ System.c<b[0]. Diseñe una aplicación que sea capaz de leer los valores de las constantes a.length. en forma vectorial: V= ai+ bj+ ck.f++){ for(c=0.print(x[f][c]+"\t").print(b[f][c]+"\t").f<a.println("Listado matriz b").c<x[0].f++){ for(c=0.println("").Estructura de Datos } } System.out.*. direccion.showInputDialog("¿Hay más datos a procesar?\n\nSi=1 y No=0").parseInt(leer). JOptionPane. while(ban==1) { //mientras hayan datos a procesar //leemos el valor de las constantes leer=JOptionPane. magnitud=Math.Estructura de Datos String leer. leer=JOptionPane.y direccion=Math.atan(vector[1]/vector[0]).parseDouble(leer).showInputDialog("Ingrese el valor de a:").showMessageDialog(null. double magnitud. int ban=1. Informática & Sistemas 92 . "El valor de la magnitud es: "+magnitud+"\n y con un angulo direccional de: "+direccion+" Radianes").sqrt(sum).showInputDialog("Ingrese el valor de b:"). //calculamos la magnitud //la cual es la raíz cuadrada de las suma más //de las componentes al cuadrado sum=(vector[0]*vector[0])+(vector[1]*vector[1])+(vector[2]*vector[2]).parseDouble(leer). double vector[]=new double[3]. ban=Integer.showInputDialog("Ingrese el valor de c:"). }//del while }//del main }//de la clase Computación. vector[0]=Double. //La dirección viene dada por la tangente inversa //del cociente de las componentes x.parseDouble(leer). leer=JOptionPane. vector[1]=Double. sum. leer=JOptionPane. vector[2]=Double. f++){//las filas suma=0. tiene un promedio de: "+promedio).parseDouble(leer). public class MatrizNotas{ public static void main (String args []) { int f. "El alumno.Estructura de Datos 2. double notas [][]=new double[10][5]. promedio. import javax. c<5. Informática & Sistemas 93 . y se desea promediar la nota final de cada uno de ellos. Diseñe una aplicación que solucione este problema. double suma.showInputDialog( "Ingrese la nota: "+c+" del alumno: "+f). } } Computación.showMessageDialog(null. } suma=suma+notas[f][c].showInputDialog("Ingrese la nota: "+c+" del alumno: "+f).swing. for(c=0. notas[f][c]=Double. JOptionPane. c++){ leer=JOptionPane. f<10. } promedio=suma/5.c. while(notas[f][c]>10 || notas [f][c]<0){ leer=JOptionPane. Se tienen las notas de 5 exámenes de 10 alumnos. for(f=0. String leer.parseDouble(leer).*. notas[f][c]=Double. double notas [][]=new double[10][5]. JOptionPane. "El alumno.showInputDialog("Ingrese la nota: "+c+" del alumno: "+f). } promedio=suma/5. promedio.parseDouble(leer). while(notas[f][c]>10 || notas [f][c]<0){ leer=JOptionPane.showMessageDialog(null.swing. c++){ leer=JOptionPane. y se desea promediar la nota final de cada uno de ellos.c.Estructura de Datos 3.showInputDialog( "Ingrese la nota: "+c+" del alumno: "+f). notas[f][c]=Double.*. f<10. f++){//las filas suma=0. } suma=suma+notas[f][c]. String leer. public class MatrizNotas{ public static void main (String args []) { int f. tiene un promedio de: "+promedio). notas[f][c]=Double. double suma. for(f=0.parseDouble(leer). } } Computación. Se tienen las notas de 5 exámenes de 10 alumnos. Diseñe una aplicación que solucione este problema. for(c=0. Informática & Sistemas 94 . import javax. c<5. println(“Número encontrado”). break.parseInt(JOptionPane. Informática & Sistemas 95 . Terminamos con éxito la búsqueda cuando el elemento es encontrado. int matriz[ ][ ] = new int matriz[10][10].i<v.i++){ if(v[i]==num){ encontrado=i.showInputDialog("Ingrese Número a Buscar")). for(i=0. j++){ if(matriz[i][j] == buscar){ System. En un arreglo bidimensional.println("El Número SI se ha encontrado"). Este es el método de búsqueda más lento. num = Integer.Estructura de Datos Tema 6: Métodos de ordenamiento y búsquedas Algoritmo Busqueda Una búsqueda es el proceso mediante el cual podemos localizar un elemento con un valor específico dentro de un conjunto de datos.println("El Número NO se ha encontrado"). Búsqueda Secuencial A este método tambien se le conoce como búsqueda lineal y consiste en empezar al inicio del conjunto de elementos. pero si nuestro arreglo se encuentra completamente desordenado es el único que nos podrá ayudar a encontrar el dato que buscamos. e ir a través de ellos hasta encontrar el elemento indicado ó hasta llegar al final de arreglo.length. } } } Computación. A continuación veremos algunos de los algoritmos de búsqueda que existen.out. i++){ for( int j = 1. encontrado=-1.out. int buscar = 30. j < 20. }else{ System. cuando se empieza la búsqueda se compara todos los datos del arreglo con el numero a buscar y si en caso se encuentra la variable “encontrado” guarda la posición del numero. } Aquí la variable “encontrado” inicialmente tiene un valor negativo (-1). i < 20. } } if(encontrado==-1){ System. for( int i = 1.out. out. while (bajo < alto && buscar != vector[central]) { if (buscar > vector[central]) { bajo = central + 1. int bajo = 0.1. } central = (bajo + alto) / 2. para hacer esto se determina el elemento central del arreglo y se compara con el valor que se está buscando. de esta forma se elimina una mitad del arreglo junto con el elemento central para repetir el proceso hasta encontrarlo o tener solo un elemento en el arreglo. i < 20. i++) { vector[i] = i * 10. for (int i = 0. int vector[] = new int[20]. int alto = vector. Informática & Sistemas 96 .1. }else{ alto = central . Su implementación es la siguiente. } Computación.println("Elemento " + buscar + " encontrado en la posicion: " + central). int central = (bajo + alto) / 2.length . Para poder aplicar este algoritmo se requiere que el arreglo este ordenado. } int buscar = 150. } if(buscar == vector[central]){ System. si coincide termina la búsqueda y en caso de no ser así se determina si el dato es mayor o menor que el elemento central.Estructura de Datos Búsqueda Binaria: Este algoritmo permite buscar de una manera más eficiente un dato dentro de un arreglo. ya que este también está ordenado. Informática & Sistemas 97 . Consiste en ciclar repetidamente a través de la lista. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios. ya está ordenado Vamos a ver un ejemplo. Si un elemento es mayor que el que está en la siguiente posición se intercambian. Este método finaliza en el momento en el que se han realizado tantas pasadas como objetos . 2. ¿Cuándo conviene usar un método de ordenamiento? Cuando se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo. Su hace menos 1 pasadas porque el primero de los objetos. Repetimos el primer paso pero esta vez con otro elemento menos. intercambiándolos de posición si están en el orden equivocado. De esta forma tenemos en la última posición de nuestra tabla el elemento más grande. Esta es nuestra lista: Computación.Estructura de Datos Métodos de Ordenamiento Es la operación de arreglar los registros de un arreglo el algún orden secuencial de acuerdo a un criterio de ordenamiento. Se compara el primer elemento con el segundo. menos el último. Repetimos lo mismo que antes pero ahora con todos los elemento.1 hay en la lista. comparando elementos adyacentes de dos en dos. imaginando que deseamos realizar una ordenación creciente: 1. como es lógico si pensamos que los demás ya están ordenados. Si están desordenados se intercambian. Ordenamiento por Burbuja Bubble Sort es un sencillo algoritmo de ordenamiento. Luego se mira el segundo con el tercero. como si fueran pequeñas "burbujas". El propósito principal de un ordenamiento es el de facilitar las búsquedas de los miembros del conjunto ordenado. 3. El ordenamiento se efectúa con base en el valor de algún campo en un registro. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios. lo cual significa que la lista está ordenada. En pocas palabras y menos complejas. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente. intercambiando también si es necesario. ¿Sencillo no? Los pasos a seguir utilizando este método son los siguientes. Así hasta que llegamos al último elemento. También es conocido como el método del intercambio directo. que ya está ordenado. v[i]=v[j].length-1.length. así que no hacemos nada.j.i<v. 4 es mayor que 3.length.i<v.out.Llenar un vector con números aleatorios luego ordenarlo y volverlo a listar import javax. int i. } } } Ejemplo.i++){ v[i]=(int)(Math. TAM toma el valor 5. System.swing.j<v. Intercambiamos y obtenemos: 3-4-2-5-1 Comparamos el cuarto y el quinto: 5 es mayor que 1.Estructura de Datos 4-3-5-2-1 Tenemos 5 elementos. v[j]=aux. } //Ordenando el arreglo for(i=0. Continuamos con el tercero y el cuarto: 5 es mayor que 2.aux.length-1.out. public class Ejer8 { public static void main(String[] args){ int v[]=new int[10]. Es decir. Comenzamos comparando el primero con el segundo elemento.j++){ if(v[i]>v[j]){ aux=v[i]. Ahora tenemos: 3-4-5-2-1 Ahora comparamos el segundo con el tercero: 4 es menor que 5.println("\nListado de Arreglo"). Informática & Sistemas 98 . for(i=0.i++){ for(j=i+1.JOptionPane.random()*10).i<v. System. Intercambiamos nuevamente: 3-4-2-1-5 Repitiendo este proceso vamos obteniendo los siguientes resultados: 3-2-1-4-5 2-1-3-4-5 1-2-3-4-5 for(i=0.i++){ Computación. así que intercambiamos.print(v[i]+"\t"). for(int i=0. } aux = vector[menor]. Informática & Sistemas 99 . vector[menor] = vector[i]. for(int j = i + 1.length. } } Ordenamiento por Inserción: En este tipo de ordenamiento los elementos que van a ser ordenados son considerados uno a la vez. } } } Ordenamiento por Selección: En este tipo de ordenamiento se selecciona o se busca el elemento más pequeño (o más grande) de todo el conjunto de elementos y se coloca en su posición adecuada. int vector[] = new int[30]. QUICKSORT.length. i ++){ menor = i. int aux.Estructura de Datos for(j=i+1.out. SHELL. Entre estos tipos de ordenamientos se encuentran el de INSERCION DIRECTA. j++){ if(vector[j] < vector[menor]){ menor = j. } } } System. INSERCION BINARIA Y HASHING. for(i=0. Este proceso se repite para el resto de los elementos hasta que todos son analizados. v[i]=v[j].j<v.i<v.println("\nListado de Arreglo Ordenado").print(v[i]+"\t"). menor.length.i++){ System. j < vector.j++){ if(v[i]>v[j]){ aux=v[i]. vector[i] = aux. Cada elemento es insertado en la posición apropiada con respecto al resto de los elementos ya ordenados. i < vector. a) Método de Inserción Computación.length.out. v[j]=aux. Estructura de Datos int vector[] = new int[30]. (j >= h) && (vector[j .h] > b. } c) Método QuickSort: Computación. for(int i = 1. I < vector. } b) Método Shell int vector[] = new int[30]. j = i. int j = I.length. } vector[j] = vector[j . while((h*3 + 1) < vector. i++){ int b = vector[i]. j --.length){ h = 3 * h + 1. } while( h > 0 ){ for(int i = h . Informática & Sistemas 100 . for(j = i.i < vector. } h = h / 3. j. int h = 1. while( (j > 0) && (vector[j-1] > aux) ){ vector[j] = vector[j – 1].h]. int aux. } Vector[j] = aux.1.h]. j -= h){ vector[j] = vector[j . i++){ aux = vector[i].length. int b){ int a1 = a.Estructura de Datos public void QuickSort(int vector[]. vector[a1] = vector[b1]. vector[b1] = aux. Informática & Sistemas 101 . QuickSort(vector. vector[a1] = vector[b1]. vector[b1] = aux. } } vector[b] = vector[b1]. vector[b1] = pivot. } Computación. b1 = b.1 ){ if(vector[a1] > vector[b1]){ aux = vector[a1]. vector[b1] = pivot. if(a1 < b1){ aux = vector[a1]. b1). b + 1. int a. if( a1 >= b1) return. while( a1 < b1 ){ while( vector[a1] <= pivot && a1 < b1 ) a1++. } return. } int pivot = vector[(a1 + b1) / 2 ]. aux. QuickSort(vector. a1 – 1). a. while(pivot <= vector[b1] && a1 < b1) b1--. else if( a1 == b1 . 5 +97. (El arreglo será de 5 elementos).1700 y determine cuanto de dinero debe incrementarse o decrementarse a cada empleado para que todos tengan un sueldo igual al sueldo promedio actual. reemplazar por el número cero a aquellos números que se repiten más de una vez. Diseñe un programa que genere aleatoriamente los sueldos de 10 empleados de una empresa con valores en el intervalo de s/. Llenar la matriz aleatoriamente. mostrar dichos elementos por pantalla.800 a s/. Informática & Sistemas 102 . Imprimir un Listado como el siguiente: EMPLEADO 0 1 2 3 SUELDO 1500 1350 1200 1600 REAJUSTE -52.Estructura de Datos Laboratorio 5: Arreglos y Matrices Realizar un programa que me permita registrar una planilla de trabajadores cuyos campos son los siguientes: Codigo Nombre Basico int String double Bonificacion double Gratificacion double Sabiendo que se tendra que almacenar 8 registros como mínimo. si en caso que haya un numero ya repetido o existente.hasta que al final se deba de almacenar en el arreglo solamente numero no repetidos . Calcular y mostrar por pantalla el mayor y el menor de los elementos constituidos de una matriz de orden 10 x 10. .5 +247. deberá de salir un mensaje diciéndote que ya existe ese número y volver a ingresar nuevamente .5 -152. donde se implementara un menú de opciones de la siguiente manera: Ingresar Ordenar Modificar Eliminar Mostrar Plantilla Salir En un arreglo unidimensional llenado con números Enteros Generados aleatoriamente.5 Computación. Ingresar por teclado N numero a un arreglo unidimensional . .Estructura de Datos 4 5 6 7 8 9 1550 1320 1630 1455 1280 1590 -102. b. cod045. los pesos personas e imprimir los siguientes listados según la elección del usuario: a.5 +127. d. Diseñen un programa que genere aleatoriamente un arreglo con las notas de los 45 alumnos de la sección e imprima a continuación un listado como el siguiente: LISTADO GENERAL DE NOTAS CODIGO Cod01 Cod02 Cod03 . . 06 REPORTE ESTADISTICO Número de Aprobobados Número de Desaprobados Nota Promedio Nota Máxima. Computación.67 %) : 14. : 33 (73.5 -7. . c.33 %) : 12 (26.decremento Una sección cuenta con 45 alumnos codificados correlativamente como cod01. y los sexos de 20 Un Listado de Edades de las personas de sexo Femenino Un Listado de pesos de las mujeres mayores de Edad Un Listado de pesos de los varones mayores de Edad Un Listado de sexos y edades de las personas que pesan menos de 70 kg.5 +167.5 -182. Nota Mínima. Cod45 NOTAS 17 18 14 . . Informática & Sistemas 103 .5 Donde + significa incremento y .5 -142. cod02……….50 : 18 : 02 Diseñe un programa que genere aleatoriamente las edades. peso en el intervalo de 45 a 100 kilos y el sexo en el intervalo de 1 a 2 ( 1=”masculino”. 2=”femenino”) Desarrollar un programa que almacene en un arreglo Bidimensional de orden 11 x 20 números generados Aleatoriamente [ 2 – 9] y guardar el número 1 a todos los Espacios de memoria que representen la Figura Geométrica del triangulo que a continuación veremos : Llenar una matriz de 10x10 con números aleatorios sin que estos se repitan Computación.Estructura de Datos La Edad estará en el intervalo de 10 a 90 años. Informática & Sistemas 104 . Estructura de Datos Computación. Informática & Sistemas 105 . Estructura de Datos Computación. Informática & Sistemas 106 . En el siguiente ejemplo tenemos una estructura de un coche con sus métodos y atributos Las clases son lo más simple de Java. Así pues. Usando la POO podemos escribir códigos más claros.O.) Durante los últimos años en la informática ha dominado la programación llamada estructurada. La solución es estructurar todavía más el programa. Java no soporta funciones o variables globales. El conocimiento de las clases es fundamental para poder entender los programas Java. modularidad. Informática & Sistemas 107 . Está basado en varias técnicas. fáciles de modificar y hacer programas más complejos.Estructura de Datos Tema 7 : Programmation Orientada a Objetos (P.O. pero esta posibilidad es más un intento de no separarse mucho y ser compatible con C. C o el Pascal por decir los dos más importantes. que pueden definir métodos fuera del bloque de la clase. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos. incluyendo herencia. que un buen diseño orientado a objetos. polimorfismo y encapsulamiento. Todas las acciones de los programas Java se colocan dentro del bloque de una clase o un objeto. Todos los métodos se definen dentro del bloque de la clase. empiezan a surgir funciones a porrón. Esto puede despistar a los programadores de C++. Todo en Java forma parte de una clase. El código se termina enrevesado. La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. el esqueleto de cualquier aplicación Java se basa en la definición de una clase. Es decir tenemos una estructura de datos y funciones y procedimientos que actúan sobre esa estructura de datos. Clases Las clases son tipos de datos y operaciones sobre los datos. es una clase o describe cómo funciona una clase. Aun así cuando hay que hacer un programa demasiado largo y complicado es cuando la programación estructurada da a conocer sus limitaciones. empezamos a olvidar como hacíamos el programa etc. Su uso se popularizó a principios de la década de 1990. La programación estructurada es la que usan lenguajes como el java. Acceso a métodos de una clase Computación. La POO nos obliga a ello. Hay que reconocer que de esos lenguajes a otros como el BASIC que se utilizaban los "goto 30" y los códigos "espagueti" se progresó mucho. si no se especifica el control de acceso. en el siguiente trozo de código podemos observarlo: public MiClase { int i. Las variables y métodos de instancia privados sólo pueden ser accedidos desde dentro de la clase.Estructura de Datos Cuando se crea una nueva clase en Java. char. se puede especificar el nivel de acceso que se quiere para las variables de instancia y los métodos definidos en la clase: public public void CualquieraPuedeAcceder(){} Cualquier clase desde cualquier lugar puede acceder a las variables y métodos de instacia públicos. etc. No son accesibles desde las subclases. } } Computación. } public void Suma_a_i( int j ) { i = i + j. Una clase en Java puede contener variables y métodos. por los paquetes (packages). protected protected void SoloSubClases(){} Sólo las subclases de la clase y nadie más pueden acceder a las variables y métodos de instancia protegidos. pero no por los externos al paquete. Los métodos protegidos (protected) pueden ser vistos por las clases derivadas. Es lo mismo que protected. se deben declarar como private protected. private private String NumeroDelCarnetDeIdentidad. Las variables pueden ser tipos primitivos como int. friendly (sin declaración específica) void MetodoDeMiPaquete(){} Por defecto. Para evitarlo. public MiClase() { i = 10. y también. Todas las clases de un paquete pueden ver los métodos protegidos de ese paquete. lo que hace que ya funcione como en C++ en donde sólo se puede acceder a las variables y métodos protegidos de las clases derivadas. lo que significa que son accesibles por todos los objetos dentro del mismo paquete. Por ejemplo. Los métodos son funciones. en Java. como en C++. las variables y métodos de instancia se declaran friendly (amigas). Informática & Sistemas 108 . no se puede declarar una variable con el mismo nombre que una de ámbito exterior. Sin embargo. Las variables de Java sólo son válidas desde el punto donde están declaradas hasta el final de la sentencia compuesta que la engloba. Se pueden anidar estas sentencias compuestas. Informática & Sistemas 109 .Estructura de Datos La clase MiClase contiene una variable (i) y dos métodos. Como sigue: Computación. Como crear una clase en java con NetBeans: Cuando se crea la clase se debe de poner el nombre de la clase y el nombre del paquete que va a contener a dicha clase Nombre de Clase Nombre de paquete Una clase se crea inspirada en un objeto de la vida real. y cada una puede contener su propio conjunto de declaraciones de variables locales. Ámbito de una variable Los bloques de sentencias compuestas en Java se delimitan con dos llaves. por ejemplo quiero modelar un gato en un programa entonces tengo que escribir una clase que se llame gato. MiClase que es el constructor de la clase y Suma_a_i( int j ). Generalmente estos métodos son públicos. Aquí se ha creado 2 atributos de la clase “GATO”: (“numvidas” el cual guarda la cantidad de vidas que tiene el gato y “color” el cual guarda el color del gato) Métodos Los métodos son la implementación de las funciones de las clases. Los métodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. Computación. En el siguiente ejemplo se está creando el método “Mauiar” que tiene como finalidad imprimir la cadena “miauuuuu”. Informática & Sistemas 110 . estas deben definirse en forma privada y no publica.Estructura de Datos El ejemplo todavía no contiene ningún atributo ni tampoco ninguna función anterior Atributos Son las características que tiene una clase. a los atributos también se les conoce como propiedades o campos. es algo así como mostrarte que algo funciona pero no como funciona.NumVidas=NumVidas // this. Solo conoce los métodos que le hacen falta para usarla. Informática & Sistemas 111 .NumVidas es el atributo de la clase y NumVidas es el parámetro recibido } Lo mismo pasa con el atributo “Color” Computación. Por ejemplo se creó una función para devolver el valor que tenga el atributo “NumVidas” llamado “getNumVidas” public int getNumVidas(){ return NumVidas. que no se sabe cómo funciona y su usuario desconoce la estructura interna. este método recibe un parámetro el cual dejara su valor al atributo NumVidas” Public void setNumVidas(String NumVidas){ This.Estructura de Datos Encapsulamiento El objeto se supone que es una caja negra. Esta propiedad de la POO se llama encapsulamiento. El encapsulamiento consiste en ocultar los detalles de la implementación de un objeto Encapsulamiento es en teoría eso. En el ejemplo anterior se ha encapsulado los atributos de la clase. } También se creó un método llamado “setNumVidas”. El programador de la clase ha ocultado deliberadamente esta estructura. Informática & Sistemas 112 .Estructura de Datos Objetos Los objetos son las instancias de las clases con sus datos concretos e independientes unos de otros. Usando un símil en la programación estructurada diremos que una clase es un tipo de dato y un objeto una variable de ese tipo. Ejemplo de un objeto de tipo coche Ejemplos de objetos de tipo pelota Computación. Informática & Sistemas 113 .Estructura de Datos En el siguiente ejemplo se crea una clase la cual tendrá como finalidad crear objetos de tipo “Gato”. a esta clase la llamaremos “LlamandoGato” y la guardaremos en el paquete llamado “GUI” Antes de comenzar a programar debemos de hacer una importación a la clase “Gato”. esto se debe a que la clase “Gato” se encuentra en otro paquete. además de llamar al método “Maullar” de los dos. Ahora creamos 2 objetos “Gato” llamado “Tom” y “Garfield”. llenamos los datos de esos 2 objetos y luego imprimimos sus datos. Computación. gato Tom. int es un tipo de dato. nota es el nombre de la variable. y Tom es el nombre del objeto. gato es un tipo de dato definido por el usuario. ambos son tipos de datos.Estructura de Datos Clases vs Objetos La relación entre clases y objetos en los programas de computadora es muy similar al de las variables por ejemplo si tengo int nota. Se tiene: gato es a Tom como int es a nota. nota es una variable entera en donde se almacenan sólo un dato entero Tom es un objeto que puede almacenar varios tipos de datos y además tiene funciones propias de su clase Constructores Computación. Informática & Sistemas 114 . Cuando se crea un objeto de alguna manera tenemos que inicializar los valores de sus atributos para que no contengan un valor disparado o queramos fijarlos a un determinado valor inicial. ya sabemos que un constructor es un método que tiene el mismo nombre de la clase. Antes de ser instanciada con new no consume memoria. se pueden declarar uno o más constructores opcionales que realizan la inicialización cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. La inicialización de los atributos lo podemos hacer mediante el constructor de la clase. Informática & Sistemas 115 . Ahora cuando se crea una nueva instancia de “Gato”. simplemente es una declaración de tipo. si lo definimos con distintos atributos tendremos varios constructores. Computación. Cuando se declara una clase en Java. y es invocada cada vez que se crea un objeto de la clase automáticamente. En el ejemplo anterior se está creando 3 constructores. y se llama al constructor de la clase: La palabra clave new se usa para crear una instancia de la clase. se crean (instancian) todos los métodos y variables.Estructura de Datos El constructor es un método que se llama igual que la clase. de manera que extiende su funcionalidad. Computación. } Herencia La herencia es uno de los mecanismos de la programación orientada a objetos. el reciclador de memoria ( garbage collector) llamará: // Cierra el canal cuando este objeto es reciclado protected void finalize() { close(). de la misma forma en que piensa el ser humano.Estructura de Datos En el ejemplo anterior veremos cómo se crea los objetos de la clase “gato” cada uno llamando a un diferente constructor Finalizadores Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automáticamente todos los objetos que se salen del alcance. llamada entonces superclase. La idea es la de partir de las situaciones más generales e ir derivando hacia las más particulares. creando categorías. No obstante proporciona un método que. por medio del cual una clase se deriva de otra. Informática & Sistemas 116 . Una de sus funciones más importantes es la de proveer Polimorfismo. cuando se especifique en el código de la clase. Una Pato es una subclase de Ave. En el siguiente ejemplo se creara una clase “AVE” Computación. Cualquier cosa que contenga la definición de Ave será copiada a la clase Pato. Por ejemplo. si se tiene la clase Ave. además. que es una especialización de Ave. en Pato se pueden definir sus propios métodos y variables de instancia. se puede crear la subclase Pato. class Pato extends Ave { int numero_de_patas. Se dice que Pato deriva o hereda de Ave. Informática & Sistemas 117 . } La palabra clave extends se usa para generar una subclase (especialización) de un objeto.Estructura de Datos La Herencia es el mecanismo por el que se crean nuevos objetos definidos en términos de objetos ya existentes. color y nombre.Estructura de Datos Esta clase tendrá como atributos : numero_patas. Informática & Sistemas 118 . estos atributos serán encapsulados Además se creara un método llamado “MostrarDatos” el cual imprimirá todos los datos. Computación. métodos. En el ejemplo clase “Pato” todo lo que tiene la clase “Ave” (Atributos. etc. método no heredado ya que no todas las aves podrán nadar. es decir la clase extendida.Estructura de Datos También tenemos un método “Volar” el cual imprimiría el mensaje “Estoy volando” Ahora nos crearemos una clase hija. esta clase se llamara “Pato” que es una clase hija de la clase “Ave” Para que se defina que la clase es una clase extendida se pone la palabra “extends” y ahí se define que es una clase extendida de “Ave” Además en esta clase se está definiendo un método llamado “Nadar”.) anterior la heredara Sobrecarga Permite extender la funcionalidad de una clase. Computación. Informática & Sistemas 119 . además se podrá programar algo adicional.out.MostrarDatos(). ahí se está invocando a lo programado en la clase padre. es decir la “Gallina” además de tener los atributos heredados del “Ave” tendrá un atributo adicional. entonces se dice que estos métodos son sobrecargados. esto es sobrecarga Tipos de Clases Hasta ahora sólo se ha utilizado la palabra clave public para calificar el nombre de las clases que hemos visto. Informática & Sistemas 120 . (Este atributo debe de ser encapsulado) También se ha creado los métodos “MostrarDatos” y “Volar”.getEsPonedora()). ambos métodos ya han sido definidos en la clase padre. System. } NOTA: Observen la sentencia “super. public void MostrarDatos(){ super. pero hay tres modificadores más. Este atributo servirá para indicar si la gallina es ponedora. Los tipos de clases que podemos definir son: abstract Computación.Estructura de Datos Sobrecargar un método simplemente es escribirlo dos o más veces en la misma clase pero con diferentes parámetros y (obviamente) diferentes implementaciones Ahora vamos a crear una clase “Gallina” la cual tendrá un atributo adicional llamado “EsPonedora”.MostrarDatos()”.println(“Es ponedora :”+this. la clase Math es una clase final. la palabra clave this hace referencia a los miembros de la propia clase. Una clase abstracta no se instancia. que no se puede acceder al mismo tiempo a ellos desde distintos threads. public class MiNuevaClase extends MiClase { public void Suma_a_i( int j ) { i = i + ( j/2 ). this Y super Al acceder a variables de instancia de una clase. es decir. } } Aquí this. No se puede heredar de una clase final. public MiClase() { i = 10. } // Este constructor establece el valor de i public MiClase( int valor ) { this. Si se necesita llamar al método padre dentro de una clase que ha reemplazado ese método. Computación. Volviendo al ejemplo de MiClase. Por ejemplo. sino que se utiliza como clase base para la herencia. final Una clase final se declara como la clase que termina una cadena de herencia. el sistema se encarga de colocar los flags necesarios para evitarlo.Estructura de Datos Una clase abstract tiene al menos un método abstracto. Son accesibles dentro del mismo paquete en el que se han declarado. // i = valor } public void Suma_a_i( int j ) { i = i + j. se puede añadir otro constructor de la forma siguiente: public class MiClase { int i. public Las clases public son accesibles desde otras clases.i = valor. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.i se refiere al entero i en la clase MiClase. super. se puede hacer referencia al método padre con la palabra clave super: import MiClase. synchronizable Este modificador especifica que todos los métodos definidos en la clase son sincronizados. Informática & Sistemas 121 . Para acceder desde otros paquetes. primero tienen que ser importadas.Suma_a_i( j ). bien sea directamente o por herencia. int arcAngle ). Las clases abstractas no pueden tener métodos privados (no se podrían implementar) ni tampoco estáticos.Estructura de Datos } } En el siguiente código. sin tener que implementar métodos.util. Esto es muy útil cuando la implementación es específica para cada usuario.int width.int x2. int height ). el constructor establecerá el valor de i a 10.. No obstante. public abstract void drawArc( int x. mnc = new MiNuevaClase(). Un ejemplo de clase abstracta en Java es la clase Graphics: public abstract class Graphics { public abstract void drawLine( int x1. public abstract void drawOval( int x. no todos los métodos de una clase abstracta tienen que ser abstractos. Computación. no se puede hacer un new de una clase abstracta. Una clase abstracta en Java es lo mismo que en C++ virtual func() = 0.int y. Una clase abstracta tiene que derivarse obligatoriamente.int y1.int y.int y1. mnc..int width.Suma_a_i( 10 ). int height. Informática & Sistemas 122 . int y2 ).int y2 ) { <código para pintar líneas -específico de la arquitectura-> } } Cuando una clase contiene un método abstracto tiene que declararse abstracta. pero todos los usuarios tienen que utilizar los mismos métodos. import java. } Los métodos se declaran en la clase Graphics.int x2. . después lo cambiará a 15 y finalmente el método Suma_a_i() de la clase padre (MiClase) lo dejará en 25: MiNuevaClase mnc. CLASES ABSTRACTAS Una de las características más útiles de cualquier lenguaje orientado a objetos es la posibilidad de declarar clases que definen como se utiliza solamente.int startAngle.*. lo que obliga a que al derivar de la clase haya que implementar forzosamente los métodos de esa clase abstracta. pero el código que ejecutará el método está en algún otro sitio: public class MiClase extends Graphics { public void drawLine( int x1. tocar()").tocar()").println("Guzla. } public void afinar() {} } class Saxofon extends Instrumento { public void tocar() { System.out. } public String tipo() { return "Guitarra". } public String tipo() { return "Saxofon". public String tipo() { return "Instrumento".out. } Computación.out. } public String tipo() { return "Piano".tocar()"). } class Guitarra extends Instrumento { public void tocar() { System. } } // Un tipo de Guitarra class Ukelele extends Guitarra { public void tocar() { System.tocar()").out.println("Piano.println("Saxofon. } public void afinar() {} } // Un tipo de Guitarra class Guzla extends Guitarra { public void tocar() { System.out. Informática & Sistemas 123 .Estructura de Datos abstract class Instrumento { public abstract void tocar().out. } public abstract void afinar().afinar()").println("Guitarra. } public void afinar() { System.println("Ukelele.tocar()"). } public void afinar() {} } class Piano extends Instrumento { public void tocar() { System.println("Guzla. orquesta[i++] = new Ukelele(). // Generar una INSTANCIA de una la Clase Abstracta no es valido // Instrumento nuevo = new Instrumento(). Dentro de comentarios se encuentra la generación de una instancia del tipo Instrumento la cual generaría un error al ser compilada la Clase. } public static void main(String[] args) { // Declarar un Arreglo SIN INSTANCIAS es válido en Clases Abstractas Instrumento[] orquesta = new Instrumento[5]. esto permite que sea generado sin ningún error. INTERFACES Los métodos abstractos son útiles cuando se quiere que cada implementación de la clase parezca y funcione igual. i < e.length. pero necesita que se cree una nueva clase para utilizar los métodos abstractos.tocar(). } static void afinarTodo(Instrumento[] e) { for(int i = 0. Computación.. afinarTodo(orquesta). Informática & Sistemas 124 . // seguirá funcionando debido a Polimorfismo: static void afinar(Instrumento i) { // . // Up-casting al asignarse el Arreglo orquesta[i++] = new Guitarra(). orquesta[i++] = new Saxofon(). orquesta[i++] = new Piano(). recuerde que un arreglo es únicamente un contenedor de Objetos. i. este comportamiento se demuestra en el método principal (main) Aunque dentro del método sea generado un Arreglo de esta Clase abstracta. orquesta[i++] = new Guzla().Estructura de Datos public String tipo() { return "Ukelele". int i = 0. } } La característica de hacer una Clase/Método abstract reside en que no puede ser generada una instancia de la misma. } } public class Musica2 { // No importa el tipo de Instrumento.. i++) afinar(e[i]). Por ejemplo: public interface VideoClip { // comienza la reproduccion del video void play(). constantes. que definen normas y políticas (protocolos estructurales). // detiene la reproduccion void stop(). • • Las interfaces son clases. class MiOtraClase implements VideoClip { void play() { <código nuevo> } void bucle() { <código nuevo> } void stop() { <código nuevo> Computación. solamente se pueden usar los métodos.Estructura de Datos Los interfaces proporcionan un mecanismo para abstraer los métodos a un nivel superior. En ellas se declaran. La principal diferencia entre interface y abstract es que un interface proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia. Los métodos de una clase son public. funciones para que sean implementados en las clases. con lo cual no se hereda nada. permitiendo a cada clase compartir el interfaz de programación sin tener que ser consciente de la implementación que hagan las otras clases que implementen el interface. La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por cualquier número de clases. static y final. Un interface contiene una colección de métodos que se implementan en otro lugar. } Las clases que quieran utilizar el interface VideoClip utilizarán la palabra implements y proporcionarán el código necesario para implementar los métodos que se han definido para el interface: class MiClase implements VideoClip { void play() { <código> } void bucle() { <código> } void stop() { <código> } Al utilizar implements para el interface es como si se hiciese una acción de copiar-y-pegar del código del interface. // reproduce el clip en un bucle void bucle(). Informática & Sistemas 125 . Pero las interfaces son más un conjunto de comportamientos definidos. Las clases abstractas. las clases abstractas no se implementa y las interfaces tampoco. que esperan ser implementados por el programador.Estructura de Datos } Diferencia clase abstracta con una interface: Pareciera que son lo mismo. las clases abstractas se usan mas para una relación de " es un ". Informática & Sistemas 126 . en primer lugar deben ser heredadas para ser implementadas en su totalidad o parcialmente. como en la siguiente figura: Computación. Clase Alarma public class Alarma { public int Sensor. además de activar el timbre. } public void Comprobar(){ super. encienda una luz (que representaremos con un objeto de tipo Bombilla Procure eliminar la aparición de código duplicado al crear la subclase de Alarma y asegúrese de que. Luzzzzzzzzzzzzzzzzzzzz"). Beeeeeppppp Sonando").out. } } } Clase AlarmaLuminosa public class AlarmaLuminosa extends Alarma { public AlarmaLuminosa(){ super(). Informática & Sistemas 127 . suponiendo que la alarma comprueba si debe activar o desactivar el timbre cuando se invoca el método comprobar() Cree una subclase de Alarma denominada AlarmaLuminosa que.println("Luzzzzzzzzzzzzzzzzzzzzzz.Comprobar(). } } } Computación. Implemente en Java todo el código necesario para el funcionamiento de la alarma. } public void Comprobar(){ if(Sensor>10){ System. } public int getSensor(){ return Sensor.Estructura de Datos Ejercicios resueltos 1. if(Sensor>10){ System.println("Beeeeepppppp. cuando se activa la alarma luminosa se enciende la luz de alarma y también suena la señal sonora asociada al timbre. } public void setSensor(int s){ Sensor=s.out. public Alarma(){ Sensor=0. in)).println("Ingrese sensor de la Bombilla ").println("Ingrese sensor del timbre "). Marca="". } } 2. } public void setCodigo(int cod){ Codigo=cod.readLine())). } public int getCodigo(){ return Codigo. public int Canti.parseInt(Tecla. Nombre="".setSensor(Integer. Canti=0. timbre. System. public String Nombre. Clase Producto public class Producto { public int Codigo. Bombilla.Marca. public class Ejemplo1 { public static void main(String[] args)throws IOException{ BufferedReader Tecla=new BufferedReader(new InputStreamReader(System. } public void setMarca(String Mar){ Marca=Mar.io. timbre. Bombilla.Estructura de Datos Clase Ejemplo1(invoca a la clase alarma y alarmaluminosa) import java. public double Precio. public Producto() { Codigo=0. En una tienda se venden Mouse. System. } public String getMarca(){ return Marca.Comprobar().Comprobar().out.setSensor(Integer. Precio=0.out. } public String getNombre(){ return Nombre. AlarmaLuminosa Bombilla=new AlarmaLuminosa(). Informática & Sistemas 128 .parseInt(Tecla.readLine())). } public void setNombre(String nom){ Nombre=nom.*. } Computación. elaborar un programa que permita ingresar datos a mouse y monitores y luego mostralos. Alarma timbre=new Alarma(). monitores. } } Clase Monitores public class Monitores extends Producto{ public int Pulgadas. } public String getPulgadas(){ return Pulgadas + " Pulgadas". } public double getPrecio(){ return Precio. } public String getTipoMonitor(){ String cad="". TipoMonitor=0. } } Computación. public Monitores() { super(). } return cad.print(getPulgadas()+"\t"+getTipoMonitor()+"\t"). public int TipoMonitor. switch(TipoMonitor){ case 0:cad="Nada".out.Estructura de Datos public void setCanti(int cant){ Canti=cant. } public int getCanti(){ return Canti. } public void setPrecio(double pre){ Precio=pre. } public void ImprimirProducto(){ super. case 2:cad="Monitor Plasma". System. } public void ImprimirProducto(){ System.break.out. Informática & Sistemas 129 . } public void setTipoMonitor(int tipo){ TipoMonitor =tipo.println(getCodigo()+ "\t" + getNombre()+ "\t" + getMarca()+ "\t" + getPrecio()+ "\t" + getCanti()+ "\t").break. case 1:cad="Monitor LCD".break. } public void setPulgadas(int p){ Pulgadas =p.ImprimirProducto(). SumaIGV=0.showInputDialog(“Ingrese Nombre. case 2:cad="Mouse Inhalambrico".break...swing.showInputDialog(“Ingrese Precio.showInputDialog(“Ingrese Marca.setPulgadas(Integer. } return cad.setMarca(JOptionPane. moni...”)).”)).parseInt(JOptionPane.Neto. Double SumaMonto.. switch(TipoMouse){ case 0:cad="Nada". TipoMouse=0. SumaMonto=0. moni.”)). Computación.setCanti(Integer...SumaNeto..setPrecio(Double. moni.parseInt(JOptionPane.setNombre(JOptionPane. Monitores moni.setCodigo(Integer.break. Double Monto. Mouse mous.0.JOptionPane. do{ TipoProd=Integer. } public String getTipoMouse(){ String cad="". } public void setTipoMouse(int tipo){ TipoMouse =tipo.”))).showInputDialog(“Ingrese sensor.0..showInputDialog(“Ingrese Codigo. case 1:cad="Mouse Clasico". moni.ImprimirProducto(). public class Ejemplo2 { public static void main(String[] args){ String rpta="".parseDouble(JOptionPane.. moni.parseInt(JOptionPane. moni.”))).SumaIGV. Informática & Sistemas 130 .print(getTipoMouse()+"\t"). System.parseInt(JOptionPane.showInputDialog(“Ingrese Cantidad. int TipoProd=0. if(TipoProd==1){ moni=new Monitores().. } } Clase Ejemplo2 (Invoca a Monitores y Mouse) import javax.showInputDialog(“Ingrese Pulgadas. SumaNeto=0.IGV.”))).0..out.break..”))). public Mouse() { super().Estructura de Datos Clase Mouse public class Mouse extends Producto { public int TipoMouse.. } public void ImprimirProducto(){ super. mous.setTipoMonitor(Integer.println("Neto :" + Neto).setCodigo(Integer.”))). System. System.showInputDialog(“Ingrese Marca...ImprimirProducto()..”))). Neto=Monto + IGV.setMarca(JOptionPane.. int b) { x= a. System.setPrecio(Double..equalsIgnoreCase("S")).out. System.showInputDialog(“Ingrese Precio.ImprimirProducto(). Creacion de una clase punto class Punto { int x.”)). }while(rpta. SumaMonto +=Monto.out. } IGV=Monto * 0. SumaIGV +=IGV. System. y= b. rpta=JOptionPane.showInputDialog(“IngreseTipo Monitor 1-LCD. }else{ mous=new Mouse().setNombre(JOptionPane. mous. mous.”))).println("**** Totales ******").”)))..showInputDialog(“Ingrese Codigo.println("Neto :" + SumaNeto).parseInt(JOptionPane.Estructura de Datos moni. System... Punto (int a.println("Monto de la venta :" + Monto).showInputDialog(“Ingrese Cantidad.19.”)).out. int y.parseDouble(JOptionPane.showInputDialog(“Ingrese Nombre.. } } 3.setCanti(Integer. mous.setTipoMouse(Integer.out.println("Monto de la venta :" + SumaMonto).2-Plasma. static int radio = 10..2-Optico”)))..showInputDialog(“Desea agregar otro?”). System. } void desplazarX(int t) { x= x + t. mous. mous. Computación.showInputDialog(“Ingrese Tipo de mouse 1-Clasico.parseInt(JOptionPane. Informática & Sistemas 131 . Monto = mous. Monto = moni.getCanti().getPrecio()*mous.println("Igv :" + SumaIGV). mous.parseInt(JOptionPa ne.out.out. SumaNeto+=Neto. moni.parseInt(JOptionPane..getPrecio()*moni.println("Igv :" + IGV).getCanti().out. static int cilindrada = 250.desplazarX(15). Punto p0 = new Punto(5. Computación. float p) { super (a. } } 4. String c. Informática & Sistemas 132 . y= y+d. p1.nombreDelPropietario = nombre.. peso = p..b). PuntoPC(int a. Metodo Constructor / Metodo constructor */ Moto(String nombre) { this.. centimetros cubicos String nombreDelPropietario. class PuntoPC extends Punto { String color. int b. . } } . Creacion de una clase MOTO class Moto { String fabricante.12). } void desplazarAmbos(int d) { x= x+d. private String color. Punto p1 = new Punto(6..Estructura de Datos } void desplazarY (int h) { y = y + h. private int numeroDeSerie. color = c. boolean motorEncendido.10). float peso. marca: " + fabricante).out. System.println(".println(".describeMoto( ).").Estructura de Datos } Moto( ) { .println("El motor ya esta encendido !"). } else { motorEncendido = true.")..out. System.println(" ").out. System. } } void describeMoto( ) { System.println("Arrancando el motor. System.el motor esta apagado").color = "verde fosforito". System. } void encenderMotor( ) { if (motorEncendido true) { System.describeMoto( ).println(" Computación.out.el motor esta encendido"). miMoto = new Moto( ).cilindrada: " + cilindrada + " centimetros cubicos"). El motor se acaba de encender").println("Descripcion de La moto. miMoto.out.fabricante = "Kawasaki". System. if (motorEncendido true) { System.println(" ")..pintada de color: " + color). System.println(".println(". miMoto.out.out.println(".println("Brrummm. Informática & Sistemas 133 .encenderMotor( ).out.out. System. } public static void main(String args[]) { Moto miMoto.out.out. miMoto. miMoto. miMoto. } else { System.out. laMotoDeMiHermano. Altera la variable estatica de la clase Moto Moto. Informática & Sistemas 134 . laMotoDeMiHermano.fabricante = "Suzuki".println(" "). NOTA: el color saldra null } } Computación.describeMoto( ).encenderMotor( ). miMoto.describeMoto( ). Otra moto Moto laMotoDeMiHermano = new Moto( ). miMoto. laMotoDeMiHermano.cilindrada = 500. System.Estructura de Datos ").out.describeMoto( ). Dado el siguiente programa: class A { static int x[ ] = {1.¿Cuál de las siguientes afirmaciones es falsa en Java? a) Es posible definir arrays bidimensionales de la forma a[i][j]. a. d) No es posible. c) “Hola” es un array.f (b.x[1]).y[0] + " " + b.out.println (b.. void f (int z[ ]) { z[1]+=2. (2) } } Computación. b) No es posible declarar arrays con memoria estática. c) Definiendo una superclase con constructores públicos.Estructura de Datos Ejercicios prácticos 1. b. System.y = b..¿Cómo es posible crear objetos de una clase cuyos constructores son todos privados? a) Definiendo un método estático público en la clase que cree un objeto de la clase y lo devuelva.out. } } class B { public static void main (String args[ ]) { A b = new A ( ). } void g ( ) { A a = new A ( ). b. Informática & Sistemas 135 . d) Un array es un objeto. b) Definiendo una subclase y declarando públicos los constructores heredados.x[0]++. (1) System.println (b. 2.g ( ).x.x[0] + " " + b.y). int y[ ]. donde cada fila a[i] puede tener distinta longitud. b.y[1]). 2}. Estructura de Datos 3..f ((B) b)). System.f ((B) b)).out..f (b)). } } Salida: AA0 AA1 AB2 BB1 Computación.println (a..¿Cuál es la salida de la línea (1)? a) 1 2 b) 1 4 c) 2 2 d) 2 4 4.n++).En el programa anterior. System.out.out.out. } String f (B x) { return "AB" + (x.n--). Informática & Sistemas 136 . A b = new B ().n--).¿Cuál es la salida en pantalla del siguiente programa? class A { static int n = 0.println (b. ¿cuál es la salida de la línea (2)? a) 1 2 b) 1 4 c) 2 2 d) 2 4 5. String f (A x) { return "AA" + (x.f (b)).println (b. System. } public static void main (String args[]) { A a = new A (). System.println (a. } } class B extends A { String f (B x) { return "BB" + (x. } class Rectangulo extends Figura { double left. } 7. Informática & Sistemas 137 . Circulo y Figura.area (). j.length-1. public double area () { return width * height.menor (lista[j-1])) intercambiar (lista. j > i. j.El siguiente método ordena una lista de números decimales por el método de la burbuja: static void ordenar (double lista[]) { 1 for (int i = 0.length. } } Computación. j-1). height. se permite suponer que los lados de un Rectángulo son paralelos a los ejes de coordenadas abstract class Figura implements Ordenable { public boolean menor (Ordenable obj) { return obj instanceof Figura && area () < ((Figura) obj) . definir las clases Rectángulo. centerY. Para ello. j--) 3 if (lista[j] < lista[j-1]) intercambiar (lista. i < lista. siempre al nivel más alto posible de la jerarquía de clases. public double area () { return 2 * Math.length-1.length. j > i. radius. j-1). i++) 2 for (int j = lista.PI * radius.. i++) for (int j = lista.Estructura de Datos 6.Basándose en el diseño del apartado anterior. 4 } Generalizar la función ordenar para que ordene listas de cualquier tipo de datos sobre los que tenga sentido definir una relación de orden. de tal manera que sea posible ordenar listas de figuras por su área. Nota: para simplificar. } } class Circulo extends Figura { double centerX. static void ordenar (Ordenable lista[]) { for (int i = 0.. Definir en estas clases todos los métodos y variables necesarios para ello. i < lista. j--) if (lista[j]. introducir una mínima modificación en las líneas 1 y 4. } abstract double area (). y definir las clases y/o interfaces adicionales que sean necesarias. top. } interface Ordenable { boolean menor (Ordenable obj). width. Definir una clase Persona con una variable dni y los métodos necesarios para que se pueda hacer la intersección de listas de personas con la clase anterior. i++) elementos [i] = elems.size ()]. break. i < elementos. class Conjunto { Object elementos[]. class Persona { String dni. j++) if (elementos[i]. } return new Conjunto (inter). Informática & Sistemas 138 . for (int i = 0. public boolean equals (Object obj) { return (obj instanceof Persona) && dni.length. los elementos de la primera lista que son equal a algún elemento de la segunda.length. } Conjunto interseccion (Conjunto conj) { Vector inter = new Vector (). y devuelva un nuevo conjunto con la intersección de los dos.equals (((Persona) obj) .elementos. i++) for (int j = 0.elementAt (i).Estructura de Datos 8. Conjunto (Vector elems) { elementos = new Object [elems.Definir una clase Conjunto que contenga: Un array de valores de cualquier tipo.dni). Un método intersección que tome como argumento otro conjunto. } } Computación..elementos[j])) { inter. i < elementos. for (int i = 0. es decir..addElement (elementos[i]). j < conj. considerando que dos personas son la misma cuando tienen el mismo DNI. } } 9.length.equals (conj. el número de metros cuadrados. y para los discos el nombre de la discográfica. y la impresión del cliente sobre el piso. y el período de tiempo por el que estará vigente la hipoteca. Al centro cultural acuden una serie de clientes (de los que se guarda su DNI y nombre). en años. Informática & Sistemas 139 . que son las operaciones que la misma brindará. o pisos libres. Un centro cultural se dedica al préstamo de dos tipos de materiales de préstamo: discos y libros. Una vez se ha encontrado un piso adecuado. Implemente una clase en Java que permita realizar operaciones sobre dos números. En cualquier caso. la propia inmobiliaria ofrece al cliente un préstamo hipotecario. si se dispone de aval o no (por defecto. en el que se indica la cantidad solicitada. Estos pisos pueden ser viviendas de protección oficial. Para los dos se guarda información general. que realizan una serie de peticiones de discos o libros (como mucho hasta 5 peticiones). que se puede calcular en función del precio. 3. no). Debe disponer de un único constructor que reciba ambos atributos y cinco métodos. y el precio. y por cada visita que soliciten. Escribir el esqueleto de las clases que estimes apropiadas para el supuesto planteado anteriormente. Para cada petición se guarda la fecha de inicio y fin del préstamo. La misma debe tener dos atributos que son los números enteros con los que se va a operar. también almacenamos el porcentaje de beneficio que se lleva la inmobiliaria. Dichos métodos serán: • • • • • obtenerSuma() obtenerResta() obtenerProducto() obtenerCociente() obtenerModulo() Nota: Siempre consideramos el primero en relación al segundo. se guarda la dirección del piso. almacenamos también su número de páginas. Una agencia inmobiliaria dispone de una serie de pisos en oferta.Estructura de Datos Laboratorio 7: Clases y Objetos 1. es decir. Escribir el esqueleto de las clases que estimes apropiadas para el supuesto planteado anteriormente. una descripción sobre su contenido y estado. la resta será el Computación. se almacena la fecha y hora de la visita. Los clientes que solicitan pisos a la inmobiliaria dejan su DNI y nombre. el tipo de interés aplicado. 2. En el caso de los libros. como su código identificativo. el título y el autor. En el caso de viviendas libres. representa la estructura básica de un programa para recopilar los encargos de productos de una compañía. llamado agregarNumero(int numero) y otro para obtener el promedio hasta el momento. b) Implemente en Java un método que a partir de una matriz de triángulos devuelva el área del triángulo de mayor superficie 7. incompleto. Para realizar el cociente y el módulo debemos chequear que el segundo número sea diferente a cero. Informática & Sistemas 140 . defina las variables de ejemplar mínimas que requiera. exponente). Diseñe e implemente en Java una clase para trabajar con triángulos isósceles.pow(base. 4. Utilice valores inventados por usted. Implemente luego una clase de prueba que cree un polinomio de 3er grado y lo evalúe en algunos puntos inventados por usted. Para ello necesitará guardar como atributos los tres coeficientes y disponer de un método calcularValor(double x) que evalúe el polinomio en dicho valor de x. desplegando sus resultados. un método constructor e implemente otros métodos para calcular el perímetro y el área de un triángulo. Implemente luego una clase de prueba que genere dos valores aleatorios. Para realizar las potencias podrá utilizar la función Math. 5. proporcione métodos de consulta. Para ello. uno para ingresar un nuevo número. Implemente luego una clase de prueba que permita ingrese algunos valores y muestre el promedio. los muestre y luego ejecute las cinco operaciones. llamado obtenerPromedio().Estructura de Datos primero menos el segundo y análogamente para los demás métodos. Implemente una clase en Java que permita evaluar un polinomio de grado 3 en una abscisa determinada. Computación. La misma debe tener dos métodos. Determine qué atributos son necesarios para implementarla. Implemente una clase en Java que permita realizar promedios. 6. El siguiente diagrama de clases. Incluya métodos que permitan acceder a la información del producto. Informática & Sistemas 141 .modificar(4)+" "). Dada la siguiente relación de asociación entre las clases A y B.print(obj1.modificar(5)+" "). 8. Computación.out.out. int x) { System.p2.println(obj2. ¿Cuál es el resultado del siguiente programa? class Ejercicio { public static void main(String [ ] args){ Clase1 obj1=new Clase1().5).8. public Clase1 (int i. System. ¿Qué imprime el siguiente programa? class Ejercicio { public static void main (String [] args) { Clase1 obj1= new Clase1(5. obj2=obj1. }//fin main } class Clase1{ int p1.print(obj2.4).out. System. private int x=7.3.out.print(valor+” “+this. public void imprimir(double valor. obj1.imprimir(24. Indique como se implementaría a) Un objeto de A hereda de B b) Un método de B tiene como parámetro un objeto A c) Un atributo de ejemplar de B es un objeto A d) Ninguna de las anteriores es cierta 9. Clase1 obj2= new Clase1(5.x).modificar(5)+" "). System.4). int j){ p1=i.Estructura de Datos Escriba una versión en Java de la clase Producto. } } class Clase1 { private double valor=9. } } 10. saldo = inicial. 2505.saldo. Realice el diseño de clases e indique qué métodos tendría cada clase. Cada función tiene un nombre y un precio. public Cuenta(int cuenta. }//del main }//de la clase Banco 13. p2=p2+i.print(p2+" "). return p1. Un teatro se caracteriza por su nombre y su dirección y en él se realizan 4 funciones al día.Estructura de Datos p2=j. } public int modificar(int i){ p1=p1+i.out. Informática & Sistemas 142 . double inicial) { numero_cuenta=cuenta. } // Fin método saldo }//fin clase Cuenta class Banco { public static void main(String [] args) { //Se crea la cuenta Cuenta cuenta_1 = new Cuenta(123456.32).out. protected double saldo.println(“Total actual en la cuenta: “ +total_cuenta +” Euros”). } // Fin método deposito public double saldo(){ return saldo. cuyo grado y coeficientes se introducen por teclado. 12. ¿Cuál es el error del siguiente programa? class Cuenta { protected int numero_cuenta. System. Computación. } } 11. } // Fin constructor cuenta public void depositar(double cantidad) { saldo = saldo + cantidad. Implemente dichas clases. Desarrolle un programa que sirva para evaluar el valor de un polinomio. System. en un valor de abscisa determinado. // Se consulta el saldo double total_cuenta=cuenta_1. teniendo en cuenta que se pueda cambiar el nombre del teatro y el nombre y precio de la función. this. } } class Libro { private String titulo. uno con precio 900 y otro con precio 1100 15.out. sobremesa = null. } } class Autor { private String nombre.precio(900).Estructura de Datos 14. portatil. autor). System. Libro libro= new Libro ("La trilogía de Nueva York". private Autor autor. portatil = sobremesa.autor = autor. sobremesa. portatil = new Ordenador().getTitulo()+" de " + (libro. sobremesa = new Ordenador(). Dado el siguiente fragmento de código: Ordenador sobremesa.apellido=apellido. this.toString()). public Libro(String titulo. Autor autor) { this. String apellido) { this.getAutor()). } public String toString () { Computación. private String apellido. } public String getTitulo() { return titulo.precio(1100). Ordenador portatil. "Auster"). public Autor (String nombre.nombre = nombre. ¿Qué afirmación es cierta? a) Al final tanto el objeto sobremesa como el objeto portátil apuntan anull b) Al final sólo queda un objeto de tipo Ordenador con precio 1100 c) Al final sólo queda un objeto de tipo Ordenador con precio 900 d) Al final hay dos objetos de tipo Ordenador. } public Autor getAutor() { return autor.titulo = titulo.println (libro. Informática & Sistemas 143 . ¿Qué imprime el siguiente programa? class Principal { public static void main(String[] args) { Autor autor =new Autor ("Paul". println("Objeto a1:\n-----------\n"). ¿ Qué imprime el siguiente programa? class Alumno { String nombre = "Alumno 1". a2. System.println("\nEn main: Fuera ya del metodo prueba2. char devolvergrupo() { return grupo.println("\nObjeto a2:\n-----------\n"). a1. a1. b.println("Nombre: " + nombre). Informática & Sistemas 144 .out. } static void prueba2(Alumno b) { b = new Alumno().out. } } 16.\n"). prueba1(a1). } static void prueba1(Alumno b) { b.\n").Estructura de Datos return nombre+ " " +apellido. prueba2(a2).out. Alumno a2 = new Alumno().imprimir().println("\nDentro del metodo prueba2.imprimir(). } } class Principal { public static void main (String[] args) { Alumno a1 = new Alumno(). char grupo ='A'. \n").out.out.out.out.out. } void imprimir() { System.cambiargrupo('B'). b. \n"). } } Computación. System. System.println("\nLlamada al metodo prueba1(a1).cambiargrupo('B'). System.println("Grupo: " + devolvergrupo()).println(" "). System.imprimir().println("\nLlamada al metodo prueba2(a2).imprimir(). System. } void cambiargrupo(char nuevogrupo) { grupo = nuevogrupo.imprimir(). System. System.out. a2. util. Un objeto ArrayList sólo contiene referencias a objetos. Esto es común entre las aplicaciones como las tiendas online. Un ArrayList contiene tantos objetos como necesitemos. Para almacenar tipos primitivos como double . por lo tanto. ArrayList tiene varios constructores. se puede hacer de dos formas usando el método add(…) que recibe por parámetro un objeto de tipo Object: • La primera forma sería insertalo sin darle una posición específica. Los arrays sirven bien para este propósito. Informática & Sistemas 145 . pero algunas veces necesitamos incrementar o reducir dinámicamente el número de elementos del array. Un cliente añade una mercancía a su carro de la compra. por defecto lo agregará de último mi_lista. o la reciente clase ArrayList del paquete java. Los siguientes dos constructores nos ayudarán a empezar: ArrayList() construye un ArrayList con capacidad cero por defecto. ArrayList(int initialCapacity) construye un ArrayList vacío con una capacidad inicial especificada: ArrayList al2 = new ArrayList(5). y detrás de la escena. long . la lista. Si se da el caso de que el elemento que vamos a insertar en un índice donde ya hay un elemento. o float . • La segunda forma sería dándole una posición específica en él la lista. podemos usar la clase Vector. Nota: Los objetos ArrayList se comportan igual que un objeto Vector desincronizado. entonces. los ítems son almacenados y eliminados automáticamente. ya que el ArrayList no tiene que implementar los métodos de sincronización de procesos. Agregar elementos El ArrayList contendrá diversos elementos que debemos gestionar. pero crecerá según le vayamos añadiendo: ArrayList al = new ArrayList(). por defecto el elemento será agregado al final: // instanciamos un nuevo ArrayList ArrayList mi_lista = new ArrayList(). para agregar elementos. por definición el elemento insertado y todos a la derecha de él se correrán una posición a la derecha: Computación. // agregamos el elemento. Para esta clase de grupos de datos crecientes y menguantes. o hacer que contenga distintos tipos de datos. dependiendo de cómo necesitemos construir el ArrayList.Estructura de Datos Tema 8: ArrayList de Objetos Las aplicaciones frecuentemente necesitan almacenar un grupo de datos en un sólo objeto. un ArrayList se ejecuta más rápido que un Vector.add("elemento 1"). usamos una clase envoltura. el objeto) o eleminar el elemento conociendo su índice el índice (posición). ArrayList mi_lista = new ArrayList().Estructura de Datos // Instanciamos un nuevo ArrayList ArrayList mi_lista = new ArrayList(). ya que la lista forza a correr todos los elementos a al izquierda para que ocupe ese espacio eliminado. por defecto lo agregará de último mi_lista. Informática & Sistemas 146 . Persona persona_2 = new Persona("Bety". 20). entonces el tamaño de la lista se reduce a 2 elementos únicamente • La otra forma sería si le enviamos el objeto para que la lista lo identifique.add(1.add(persona_1). "elemento A"). mi_lista. para que deba ser igual deber tener la misma instancia y/o la misma posición en memoria Persona persona_1 = new Persona("Julian". Eliminar Elementos Para eliminar elementos se dispone de el método remove(…) en el cual se recibe como argumento el objeto (sí. insertaremos unas cuantas personas en la lista y luego eliminaremos una de ellas usando las dos formas • Eliminado según su índice en la lista Persona persona_1 = new Persona("Julian".add(persona_2). mi_lista. Computación. mi_lista. // agregamos el elemento. Aclaro. Persona persona_2 = new Persona("Bety". que tiene nombre y edad. 17). ingresar un nuevo elemento con los mismos datos no significa que sea el mismo elemento. ArrayList mi_lista = new ArrayList(). 20).remove(1) // el 1 pertenece al índice o posicion de Betty en la lista // la estructura de a lista ha quedado asi: 0 = [Julian] 1 = [Marta] Marta ha pasado a la posición 1. 22). Persona persona_3 = new Persona("Marta".add(persona_3). // agregamos unos cuantos elementos mi_lista.add(persona_2). Para este ejemplo supongamos que tenemos una clase Persona.add(persona_1). 22). Persona persona_3 = new Persona("Marta". // la estructura de a lista ha quedado asi: 0 = [Julian] 1 = [Bety] 2 = [Marta] // si queremos eliminar a "Betty" por su índice seria asi: mi_lista. 17). // agregamos unos cuantos elementos mi_lista. String cad=(String)mi_lista. Ejemplo de ArrayList de Objetos Computación.remove(persona_1) // se envia la instancia de Juan // la estructura de a lista ha quedado asi: 0 = [bety] 1 = [Marta] Recuperar elementos Para recuperar datos de un arraylist se hará mediante la función “get”.get(2). es decir. mi_lista. Persona obj=(Persona)mi_lista. // instanciamos un nuevo ArrayList mi_lista. Otras funciones importantes • Para determinar la cantidad de elementos de la lista solo se llama al método size() int total = mi_lista.clear().isEmpty(). boolean existencia = mi_lista.contains(elObjetoBuscado). Informática & Sistemas 147 .add(persona_3).get(2) //Aquí recuperando la fila 2 del ArrayList. si no tiene elementos usamos isEmpty() que devuelve true si hay elementos o un false si está vacía boolean vacia = mi_lista.get(2).clear(). Si el contenido del ArrayList fuera un objeto “persona” se deberá de transformar a “persona”.isEmpty(). // la estructura de a lista ha quedado asi: 0 = [Julian] 1 = [Bety] 2 = [Marta] // si queremos eliminar a "Julian" debemos "enviarle a Juan" de nuevo mi_lista.size().Estructura de Datos mi_lista. el cual devuelve true si existe o un false si sucede lo contrario boolean existencia = mi_lista. para lo cual tendremos que pasar un índice. Si el contenido del ArrayList fuera un “string” se deberá de transformar a String. • Para saber si un objeto ésta insertado en lista usamos el método contains(…). int total = mi_lista.contains(elObjetoBuscado). • Para vaciar la lista y dejarla sin ningún elemento en ella se usa el método clear() mi_lista. boolean vacia = mi_lista.toArray(). • Para saber si la lista está vacía. • Para pasar o copiar los elementos a un arreglo de objetos (TipoObjeto objetos []) se usa el método toArray() Object objetos [] = mi_lista.size(). Informática & Sistemas 148 .Estructura de Datos Y le vamos a Llamar a nuestro Proyecto. Manejo de ArrayList y le damos finalizar Por defecto nos quedara de la siguiente Manera: Computación. el cual tendrá una clase EmpleadoBeans. Informática & Sistemas 149 .Estructura de Datos Ahora vamos a crear nuestro paquete Beans. dicha clase emplearemos el encapsulamiento de nuestros Datos Y le damos finish Ahora nuestras declaramos variables que Computación. Informática & Sistemas 150 .Estructura de Datos vamos a utilizar en nuestra clase EmpleadoBeans Ahora procederemos a encapsularlos. para ello seleccionamos nuestras variables y clic derecho Y seleccionaremos todas las casillas de verificación y le daremos clic en Refactor Computación. Estructura de Datos Y como nos daremos cuenta nos ha generado nuestros métodos Get y Set. el método Get me va a devolver el valor de mi objeto y el método Set le voy a asignar un valor a mi objeto. Informática & Sistemas 151 . le damos F9 y se debe compilar correctamente Ahora vamos a crear nuestro paquete Data y una clase dentro de ella llamada EmpleadoData Computación. Informática & Sistemas 152 .Estructura de Datos Ahora implementaremos lo siguiente y finalmente le damos F9 y se debe generar Correctamente Computación. Informática & Sistemas 153 .Estructura de Datos Ahora vamos a probar desde nuestro Main() Computación. Informática & Sistemas 154 .Estructura de Datos Computación. Estructura de Datos Tema 9: Listas enlazadas Listas enlazadas en Java Para empezar. Es un vector de dimensión variable. // Si la lista está completamente vacía if (aux == null) { // Creamos el primer elemento aux = new Nodo(N). habrá que explicar lo que es una lista enlazada. supongamos que tenemos un programa que gestiona los datos de los alumnos de una asignatura y el programa está diseñado para una cantidad máxima de 50 plazas. Esto es que solamente utiliza la cantidad de elementos mínima necesaria. Public Node next. La forma que tiene de almacenar los valores es a través de nodos. la memoria que necesitaría es mucho menor si se manejan las listas que si utilizamos vectores. Si en un año solamente hay 4 alumnos. */ public void add(int N) { Nodo aux = start. next = null. // Primer nodo de la lista /** * Añade un nodo al final de la lista. Public Node (int n) { dato = n. Por ejemplo. } else { Computación. } } public class Lista { private Nodo start. En Java viene a ser algo parecido a: Clases Nodo { Public int data. donde guarda todos los datos del elemento más una referencia a otro nodo que representa el siguiente elemento de la lista. no hay necesidad de declarar un vector de 50 elementos si solo vamos a usar 4. Informática & Sistemas 155 . Otra ventaja es que el límite de elementos no está definido. la forma de añadir o quitar Computación. Este sistema tiene múltiples ventajas.next != null && aux.next.next. Además de tener ventajas. añadir en una posición distinta al final.next. } aux. Primero. solo quiero que entendáis como funciona esto).next = new Nodo(N).next.next. etc. solamente usa la cantidad de memoria estrictamente necesaria. // Comprobamos si es el primer nodo if (aux.dato != N) { aux = aux.next != null) { // saltamos al siguiente aux. Por ejemplo. } } } } Este ejemplo es una forma sencilla y simplona de manejar listas. no os voy a dar todo el trabajo hecho.dato == N) { // Si lo es entonces hacemos que el primer nodo sea el segundo start = aux.next = aux.next. (que esperabais. pero tiene muchas lagunas como el acceso a un nodo. } else { // Vamos saltando los nodos que no coincidan hasta // que encontremos uno o se acabe la lista while (aux. Informática & Sistemas 156 . esto quiere decir que puede haber tantos elementos como memoria que pueda conservarlos.next != null) { aux = aux.Estructura de Datos // En caso contrario buscamos el último y lo añadimos while (aux. } // Si la lista no ha acabado if (aux. } } /** * Borra el primer nodo cuyo dato coincida con el parametro N */ public void remove(int N) { Nodo aux = start. también tiene sus desventajas. y otra al nodo anterior de la lista o nulo si es el inicio de esta. al igual que acceder a un elemento para utilizar su información. una al siguiente nodo o nulo si es el final de la lista. ya que a la hora de programar esto se puede volver un trabajo bastante tedioso. pero hay más tipos de listas: Las doblemente enlazadas y los árboles. es decir. se usen. y esto en una lista larga con muchos datos en cada elemento puede ralentizar el programa bastante. Mi consejo es que si se pueden usar vectores y matrices. Computación. Un árbol tiene como mínimo dos referencias a nodos. hay que buscarlo antes de forma secuencial.Estructura de Datos elementos hay que definirla a través de métodos. de principio a fin. pero existen porque a veces es mejor usar listas y otras estructuras dinámicas a usar vectores con un tamaño fijo. A la hora de acceder a un elemento. Esta es la estructura de una lista enlazada. uno al nodo Padre y los otros a el/los nodo/s hijo. Esto significa que un nodo no puede tener más de un padre. Informática & Sistemas 157 . pero no significa que no pueda tener más de un hijo. Una lista doblemente enlazada tiene dos referencias a dos elementos. Estructura de Datos En java hay una clase que ya se encarga del funcionamiento de listas enlazadas que es la clase java.util.LinkedList. Listas circulares doblemente enlazadas Una lista doblemente enlazada es una lista lineal en la que cada nodo tiene dos enlaces, uno al nodo siguiente, y otro al anterior. Las listas doblemente enlazadas no necesitan un nodo especial para acceder a ellas, pueden recorrerse en ambos sentidos a partir de cualquier nodo, esto es porque a partir de cualquier nodo, siempre es posible alcanzar cualquier nodo de la lista, hasta que se llega a uno de los extremos. El nodo típico es el mismo que para construir las listas que hemos visto, salvo que tienen otro puntero al nodo anterior: Implementar en Java una clase de listas circulares de enteros doblemente encadenadas. En concreto, la práctica contendrá la siguiente clase de nodos: class nodo { int valor; nodo ant; nodo sig; } y también ha de contener la clase de listas con las operaciones siguientes: public class L_circular { nodo acceso=null; public void insertar(int N) { //código de insertar } public void suprimir() { //código de suprimir } public boolean buscar(int N) { //código de buscar } } Más concretamente, la estructura de datos a implementar ha de tener una forma como la siguiente: Computación, Informática & Sistemas 158 Estructura de Datos La referencia acceso ha de apuntar a un nodo cualquiera de la lista. La operación insertar, dado un número N, ha de insertar un nodo con el valor N en la posición siguiente a la apuntada por acceso. La operación suprimir ha de eliminar el nodo apuntado por acceso. Finalmente, la operación buscar nos debe contestar si un elemento N está o no en la lista y, en caso en que esté, nos ha de dejar a acceso apuntando al nodo que contiene a N... class nodo { int valor; nodo ant; nodo sig; } public class L_circular { nodo acceso = null; public void insertar(int N) /*dado un número N, ha de insertar un nodo con el valor *N en la posicion� siguiente a la apuntada por acceso.*/ { nodo nuevo = new nodo(); nuevo.valor = N; if (acceso == null) { nuevo.sig = nuevo; nuevo.ant = nuevo; acceso = nuevo; } else { nuevo.sig = acceso.sig; nuevo.ant = acceso; acceso.sig.ant = nuevo; acceso.sig = nuevo; } } Computación, Informática & Sistemas 159 Estructura de Datos public void suprimir() /*eliminar el nodo apuntado por acceso. Acceso apunta al *siguiente nodo*/ { if (acceso != null) { //hay como mínimo un nodo nodo if (acceso.sig == acceso) { //solo hay un nodo acceso = null; } else {//hay más de un nodo acceso.sig.ant = acceso.ant; acceso.ant.sig = acceso.sig; acceso = acceso.sig; } } } Computación, Informática & Sistemas 160 se puede ver qué libro se encuentra hasta arriba y de esta misma forma si se desea retirar uno. Otros nombres con los que se conoce a las pilas son 'lista empuja hacia abajo' (pushdown list) y UEPS (últimas entradas primeras salidas). por ejemplo: suponga que la estructura que se utilizará para entrar al cine fuera del tipo pila. que se estudiará más adelante. Por ejemplo. se puede añadir un libro a una pila poniéndolo hasta arriba de todos. Las pilas son estructuras que se encuentran frecuentemente en la vida diaria. el cual se conoce como tope de la pila. la manera en que se colocan libros en un escritorio. Informática & Sistemas 161 . eliminaciones y accesos toman lugar en un solo extremo de la lista. el último en formarse sería el primero en entrar. el nombre que recibe esta estructura es el de cola (queue). el último en entrar será el primero en salir y al que se tenga acceso. Para este tipo de situaciones existe otra estructura la cual funciona como FIFO ( First In First Out). existen casos para los cuales no son convenientes. se tomará el último que se colocó. Algunos ejemplos se encuentran en la forma en que se acomodan los platos en algunas cafeterías. (¿?). es decir. es decir. La forma en la cual se acostumbra representar una pila es la siguiente: Computación.Estructura de Datos Tema 10: Pilas y Colas Manejo de Pilas Una pila es un tipo especial de lista. La propiedad anterior se conoce como LIFO (Last In First Out). es decir. el primero en entrar es el primero en salir. Aunque las pilas resuelven muchos problemas que se encuentran en la vida diaria y dentro de la ciencia de la computación. una colección ordenada de elementos en la cual todas las inserciones. la forma en que se acomodan los libros en un escritorio puede verse de la siguiente manera: Así. una lata de pelotas de tenis o bien algunas tareas que se desean realizar. la pila se vería como: La función miembro de la clase pila pueden ser las siguientes: Nombre pila () bool vacía () Crea una pila vacía Función Determina si la pila se encuentra vacía. esto se logra incrementando en uno el tope de la pila y guardando en esa posición el valor del elemento que se está insertando. no contiene elementos void push (Objeto e) void pop () Objeto valTope() Inserta el elemento e en el tope de la pila Elimina el elemento ubicado en el tope de la pila Regresa el valor del elemento que se encuentra en el tope de la pila. es decir. en este caso. Se acostumbra que el tope de la pila indique al último elemento que fue insertado. sin embargo.Estructura de Datos Nótese que la posición del tope es arbitraria. Vacía: Para determinar si una pila se encuentra vacía basta con preguntar dónde señala su tope. en caso contrario la pila por lo menos contiene un elemento y no es vacía: Insertar: Para introducir un elemento en una pila en representación secuencial es necesario que ocupe una nueva posición. sin modificarlo. pero puede señalar la primera posición que se encuentra vacía. Operaciones sobre una pila en representación secuencial Las operaciones básicas sobre una pila en representación secuencial son las siguientes: Crear: Para crear una pila en representación secuencial es necesario inicializar el tope en una posición que indique que se encuentra vacía y que no se encuentra señalando ningún elemento. dependiendo de la aplicación se acerca o aleja de la base. en forma estática es necesario Computación. Informática & Sistemas 162 . Si éste no señala a ninguna posición válida dentro del arreglo la pila no contiene elementos y está vacía. . if(A[Cabeza]==0) res=true. static int[] x=new int[MaxPila]. } static int Nuevo(){ int Nro. } static boolean PilaLLena(int A[]){ boolean res=false.parseInt(JOptionPane. lo cual se logra preguntando si el valor del tope de la pila es igual al número máximo de elementos que se puede almacenar en el arreglo. Computación. Borrar: Para eliminar un elemento almacenado en la pila."Pila est LLena no meter otro elemento"). Nro=Integer."Elemento sacado "+A[A[Cabeza]]). primero debe verificarse que exista ya que de lo contrario no puede ser eliminado. static void LimpiaPila(int A[]){ A[Cabeza]=0.showMessageDialog(null.")). static int i.Estructura de Datos comprobar que todavía existe espacio disponible. import javax. sin embargo debe tenerse cuidado cuando la pila se encuentra vacía ya que en este caso no puede accesarse ningún elemento: package Clases. static int Cabeza=0. A[A[Cabeza]]= Nuevo().showInputDialog("Ingrese Nuevo Elemento. if(A[Cabeza]==MaxPila) res=true. return res. return (Nro). j. Cuando al menos existe un elemento la única operación que debe realizarse es decrementar en uno el valor del tope de la pila: Accesar: Recuerde que en las pilas el único elemento al que se tiene acceso es el señalado por el valor del tope de la pila.swing. } static void Meter(int A[]){ if (!(A[Cabeza]==MaxPila)){ A[Cabeza] =A[Cabeza]+1. } static boolean PilaVacia(int A[]){ boolean res=false.JOptionPane.showMessageDialog(null. } } static void Sacar(int A[]){ if (!(A[Cabeza]==Cabeza)){ JOptionPane.. return res. } else{ JOptionPane. Informática & Sistemas 163 . public class Pilas{ static int MaxPila=10. break.showMessageDialog(null. Informática & Sistemas 164 ."Elementos de la Pila"). public static int cima = -1.Salir"+ "\nDigite su Opcion .. } } static void Lista(int A[]){ if (!(A[Cabeza]==Cabeza)){ JOptionPane. for (int i=1.Meter Elemento (Push)"+ "\n2. case 4:Lista(x).} } else{ JOptionPane. i<= A[Cabeza].showMessageDialog(null. } }while(Op!=5).io. } } public static void main(String args[]){ int Op.. break... } else{ JOptionPane. import java.".”). do{ String cad=""+ "\n1. public static String Pila[] = new String[MAX_LENGTH].out.showInputDialog(cad)).showMessageDialog(null.."Pila esta Vacía no Listar la Pila. Computación..break."Pila est Vacia no Sacar otro elemento"). i++) {System. case 2:Sacar(x).Sacar Elemento (Pop)"+ "\n3.in)).. public static final int MAX_LENGTH = 5. case 3:LimpiaPila(x)..println(A[i]). public class Pila{ public static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.Estructura de Datos A[Cabeza]=A[Cabeza]-1.parseInt(JOptionPane. switch(Op){ case 1:Meter(x).. } } Otro ejemplo de pilas Package IDAT.*. Op = Integer.. break.Limpia Pila (Vacia)"+ "\n4.Lista de Elementos"+ "\n5. Actualizar valor en pila =").parseInt(entrada. System. case 6: System. Informática & Sistemas 165 .readLine().out. } public static void Menu()throws IOException{ System.println("\n\n\t\t\t=========Menu Manejo Pila=============").out.out. Opciones(op).out. break. case 5: Actualizar(). System.print("\t\t\tOpcion: "). case 4: Imprimir(). break.out.readLine()). int op = Integer.Eliminar elemento ="). System.Insertar elemento ="). System.Imprimir pila =").Buscar elemento ="). case 3: Buscar(). System. } public static void Opciones(int op)throws IOException{ switch(op){ case 1: Insertar(). case 2: Eliminar(). break.exit(1). break.println("\t\t\t= ="). System.print("\nDigite algo para la pila: ").println("\t\t\t= 6. Computación.Salir ="). break. } } public static void Insertar()throws IOException{ System.println("\t\t\t= 3.Estructura de Datos public static void main(String args[])throws IOException{ Menu().println("\t\t\t======================================"). String dato = entrada.out. default:Menu(). Crear(dato).println("\t\t\t= 1.out. break. System.out. break.println("\t\t\t= 5.out. System.out.println("\t\t\t= 2. System.out.println("\t\t\t= 4. println(Pila[i]).println("\n\n\nNo se puede eliminar.i--){ System.out.println("Elemento no encontrado :("). } Menu(). break.readLine().i>=0. Imprimir().out.out. --cima. }else{ ++cima. Informática & Sistemas 166 .println("\n\n\nDigite la cadena a buscar: ").println("Capacidad de la pila al limite\n\n\n"). }else{ System. String cad = entrada.out.length-1)==cima){ System. } Menu(). pila vacia !!!" ).i++){ if(cad.length-1.equals(Pila[i])){ System. } public static void Eliminar()throws IOException{ if(cima== -1){ System.println("Elemento encontrado. Menu().out.Estructura de Datos } public static void Crear(String dato)throws IOException{ if ((Pila. Computación. for(int i=0. } Agregar(dato).posicion "+i). } public static void Buscar()throws IOException{ System.length-1. } public static void Agregar(String dato)throws IOException{ Pila[cima]=dato.i<Pila. }else{ Pila[cima] = null.out. } public static void Imprimir()throws IOException{ for(int i=Pila. } public static void Actualizar()throws IOException{ System.i++){ if(actual. } } Computación.out.out.out. String actual = entrada.readLine(). Informática & Sistemas 167 . break.Estructura de Datos } } Menu().i<Pila.print("Digite el nombre del valor que desea actualizar: "). System. for(int i=0.equals(Pila[i])){ Pila[i]=nuevo.readLine(). }else{ System. String nuevo = entrada.println("Elemento no encontrado :(").print("Digite el nombre del nuevo valor: "). } } Menu().length-1. Ver datos introducidos\n" + "4. Salir\n" "---------------------------------------\n" + "Teclea el numero de la accion a relizar:" )). break. En un banco (idealmente) la primera persona que llega será la primera en ser atendida y así cada persona que llega se forma en la cola y se atienden en el orden en el que llegaron. Las colas son una estructura de datos que sirve para modelar situaciones que se encuentran frecuentemente. que es una de las principales funciones de un sistema operativo.Introducir(). "---------------------------------------\n" + "Cola en Java\n" "---------------------------------------\n" + "1.Mostrar(). en los bancos y cines.*. + + + + Computación. while(true){ opc=Integer.Estructura de Datos Manejo de Colas Definición: Una cola (queue) es una lista lineal en la cual todas las inserciones son hechas en un extremo y todas las eliminaciones y accesos se realizan en el otro extremo de la lista. public class ColaJava { static Cola accion=new Cola(). como por ejemplo. es decir que el primero en entrar es el primero en salir (PEPS). Borrar los datos de la cola\n" + "---------------------------------------\n" + "5.Sacar(). Introducir dato\n" "2. case 2: accion. También se pueden utilizar para administrar los recursos de una computadora. Nótese que las colas trabajan bajo la propiedad de FIFO (First In Fist Out). switch(opc){ case 1: accion. public static void main(String[] args) { int opc=0.parseInt(JOptionPane.swing. por ejemplo en la forma de utilizar la impresora. Sacar dato\n" "3. case 3: accion.showInputDialog(null. Informática & Sistemas 168 . break. Las operaciones que pueden realizarse sobre una cola son las siguientes: Ejemplo de colas import javax. length-1){ JOptionPane. public void Introducir(){ if(ultimo==cola. } else{ ultimo++. JOptionPane."La cola está vacía\nNo hay datos que mostrar"). ultimo--. break."Se saco el dato ( "+cola[frente]+" )")."La cola esta vacía\nIntroduce un nuevo dato para poder sacar uno"). default: JOptionPane. Computación. JOptionPane.Estructura de Datos break."Que dato deseas introducir:"). case 5: System.showMessageDialog(null.i++){ cola[i]=cola[i+1].showMessageDialog(null. cola[ultimo]=JOptionPane. Informática & Sistemas 169 . } else{ String mostrar="". String cola[]=new String [tamaño]."No se realizo ninguna acción"). case 4: accion.showMessageDialog(null.Borrar().showMessageDialog(null.i<ultimo. } } public void Mostrar(){ if(ultimo==-1){ JOptionPane.showMessageDialog(null. } } } } class Cola{ int tamaño=5.showMessageDialog(null. int frente=0. } } public void Sacar(){ if(ultimo==-1){ JOptionPane. break. } cola[ultimo]=null. } else{ JOptionPane."No se realizo ninguna acción")."La cola está llena\nSaca un dato para poder introducir uno nuevo").showInputDialog(null. for(int i=frente."No se realizo ninguna acción\nOpcion no valida"). break. int ultimo=-1.exit(0).showMessageDialog(null. } JOptionPane.Estructura de Datos for(int i=frente. } } Computación. ultimo=-1. JOptionPane."Los datos almacenados son:\n"+mostrar)."El dato frente es: "+cola[frente]).showMessageDialog(null. } } public void Borrar(){ frente=0."Todos los datos fueron borrados:\n"). Informática & Sistemas 170 . JOptionPane. JOptionPane.showMessageDialog(null."El dato ultimo es: "+cola[ultimo]).i<=ultimo.showMessageDialog(null.showMessageDialog(null.i++){ mostrar=mostrar+cola[i].
Copyright © 2024 DOKUMEN.SITE Inc.