Академический Документы
Профессиональный Документы
Культура Документы
FUNDAMENTOSDEPROGRAMACIN BOLETNDEPRCTICAS
PedroSnchezPalma CristinaVicenteChicote
readeLenguajesySistemasInformticos Dpto.TecnologasdelaInformacinylasComunicaciones ETSIT.ITTEspecialidadTelemtica
Boletn de Prcticas
NDICE
Ttulo
Introduccin Cuestiones bsicas para manejar la entrada/salida Sesin 2 Tipos de datos (I) Sesin 3 Tipos de datos (II) Sesin 4 Estructuras de seleccin Sesin 5 Estructuras de repeticin Sesin 6 Estructuras Estticas de Datos: Arrays Sesin 7 Estructuras Estticas de Datos: Arrays (II) Sesin 8 Estructuras Estticas de Datos: Arrays (III) Sesin 9 Mtodos (I) Sesin 10 Mtodos (II) Sesin 11 Mtodos (III) Sesin 12 De los mtodos a la PBO Sesin 13 Clases e Interfaces Sesin 14 Aspectos bsicos de la Prog. Orientada a Objetos: la herencia Sesin 15 Aspectos Avanz. de la Prog. Orientada a Objetos: Constructores y visibilidad Sesin 16 Aspectos Avanz. de la P. OO (II): Composicin, Herencia, Interfaces y Patrones Sesin 17 Aspectos Bsicos del Manejo de Excepciones en Java Sesin 18 Manejo de Excepciones en Java (II) Sesin 19 Introduccin a Swing. Aplicacin a los Tanques (I) Sesin 20 Introduccin a Swing. Aplicacin a los Tanques (II) Sesin 21 Introduccin a las Estructuras Dinmicas de Datos: Aplicacin a los tanques Anexo I. Ayuda de la clase Teclado
Pgina
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 26 27
Boletn de Prcticas
Introduccin
El presente documento recoge los distintos boletines de prcticas que se desarrollan durante el curso acadmico para la titulacin de Ingeniero Tcnico de Telecomunicacin, especialidad Telemtica en su asignatura Fundamentos de Programacin, de segundo curso y con doce crditos asignados. Al final del curso el alumno habr abordado tanto los aspectos fundamentales de la programacin como otros ms avanzados que tradicionalmente quedaban postergados a cursos avanzados. Las caractersticas del lenguaje de programacin utilizado (Java), as como las posibilidades que se ofrecen en aspectos relacionados con las Telecomunicaciones, hacen que el aprendizaje de esta materia sea fundamental y sirva de soporte aplicado a gran parte de las asignaturas de cursos posteriores de la carrera. Cada sesin se corresponde normalmente con dos horas de prcticas en la mayora de los casos excepto en algunas que por su complejidad necesita de cuatro horas para su realizacin. El profesor indicar durante el curso la utilizacin real del tiempo para adaptarse adecuadamente al esfuerzo requerido en cada uno de los ejercicios. Se ha priorizado el buscar ejemplos sencillos tanto en enunciado como en la solucin de cara a enfocar como objetivo la puesta en prctica de los conceptos vistos en clase de teora. La entrada/salida desde Java no es trivial en parte porque este lenguaje da un tratamiento uniforme a todos los flujos de datos (tanto de entrada como de salida). Desde este punto de vista, la sencilla operacin de leer un nmero entero por teclado puede resultar compleja para un alumno recin iniciado en la programacin. Para facilitar esta tarea, se aporta una clase llamada Teclado (disponible en el Aula Virtual) para facilitar la entrada de cualquier dato primitivo Java. El detalle de funcionamiento de los mtodos implicados est documentado al final de este boletn. En la pgina siguiente se ofrece unos ejemplos sencillos de interaccin. Otra cuestin importante es que las sesiones estn organizadas para ir sincronizadas con el desarrollo de las clases de teora. En este sentido, los primeros ejercicios de programacin no involucran la creacin de objetos porque suelen ser conceptos abordados en la segunda mitad del primer semestre. La sesin 1 no figura en este documento porque se corresponde con la introduccin al entorno de programacin. Aunque el contenido de este documento ha sido revisado por los profesores de la asignatura y contrastado durante varios curso acadmicos, es indudable que en un futuro recoger las mejoras y comentarios que recibamos por parte de los alumnos, principales usuarios del mismo y de los que esperamos contribuyan a consolidarlo. Los Profesores de la asignatura. Cartagena, Septiembre de 2009.
Boletn de Prcticas
String nombre=Pepe; int edad = 15; System.out.println(Mi nombre es + nombre + y mi edad es + edad + aos); que imprimir: Mi nombre es Pepe y mi edad 15 aos. Para leer por teclado un valor entero (igual con double, float, ...). // Teclado.readDouble(), readFloat(), ....
// ms detalle de la clase Teclado al final de este boletn. Detalle de la clase Math. // calcula el seno de 2.3 radianes. // guarda en v el seno de x. // el valor absoluto. // x elevado a 5. // la raz cuadrada de x.
Boletn de Prcticas
o Sealar la clase calculadora como main, compilarla y ejecutarla en modo consola. Qu ocurre si el segundo operador un 0? Ejercicio 2 o Aadir al proyecto un fichero ConversorRadianes.java y escriba un mtodo main en el que: Se solicite al usuario que introduzca un valor double por Teclado (consulte qu mtodo de la clase Teclado emplear). Este valor representarn un ngulo medido en grados sexagesimales: Transforme este ngulo a radianes: ang_rad = ( * PI)/180 Observe que la clase Math proporciona el valor de la constante PI. Calcule el seno, coseno y tangente del ngulo transformado y muestre los resultados por pantalla. Ejercicio 3 o Aadir al proyecto un fichero Ecuacion.java y escriba un mtodo main en el que: Se solicite por Teclado al usuario tres enteros: a, b y c, que sern los coeficientes de la ecuacin de segundo grado: y = ax2 + bx + c Se calculen y se muestren por pantalla los valores de de x que resuelven la ecuacin.
Boletn de Prcticas
Modifique el programa para que el usuario pueda introducir por Teclado el instante (t) en el que se quiere calcular la posicin y la velocidad del objeto lanzado. Ejemplo 2 o Aadir al proyecto un fichero Booleanos.java. Dentro de esta clase, escribir un mtodo main en el que: Se declaren e inicialicen 2 variables booleanas b1=true y b2=false. Se calculen y se muestren por pantalla los resultados de aplicar los operadores boolanos AND (&), OR (|), XOR (^) y NOT(!). Se muestre por pantalla el resultado de la siguiente operacin: (b2 or ((b1 and b2) and !b1)) xor (b2 or (!b1 and b2)) Ejemplo 3 o Aadir al proyecto un fichero Triangulos.java. Dentro de esta clase, escribir un mtodo main en el que: Se pida al usuario los valor de , , A y B, del tringulo mostrado en la figura (valores de ejemplo: =30, =100, A=3 y B=6) Deduzca las ecuaciones que permiten calcular los valores de y C, y mustrelos por pantalla (en el ejemplo: =50 y C=4.675).
h b2 B b1 A
Boletn de Prcticas
Ejemplo 1 o Modifique el programa Ecuacion.java (Sesin 2) de modo que si las races son complejas se muestre: La ecuacin tiene races complejas. Ejemplo 2 o Modifique el programa Calculadora.java (Sesin 2) de modo que las operaciones de divisin y mdulo slo se realicen si el segundo operando es distinto de cero. En caso contrario, se debe mostrar el mensaje Imposible dividir por cero. Ejemplo 3 o Modifique el programa Triangulo.java (sesin 3) de modo que se compruebe que los ngulos y introducidos por el usuario son positivos y que su suma es menor de 180. De no ser as, debe mostrarse el mensaje Imposible definir tringulo. o Aada el clculo del rea del tringulo y muestre su valor por pantalla. Ejemplo 4 o Modifique el programa Tiro.java (sesin 3) de modo que: - Si la velocidad es negativa se muestre el mensaje Velocidad vlida > 0 - Si el ngulo es negativo se muestre el mensaje ngulo vlido > 0 - Si el ngulo mayor de 80 muestre el mensaje HEY!: ngulo vlido < 80 - Se calcule el alcance mximo de tiro: valor de x cuando y = 0 en t0 Obtener el valor NO CERO de t que resuelve la ecuacin y = Vo t sen() g t2 = 0 t_max_alcance Sustituir ese valor de t en la ecuacin x = Vo t cos() = max_alcance - Se pida al usuario el instante de tiempo (positivo!) en el que calcular (x,y) y (Vx,Vy) de modo que si el instante que introduce es mayor que t_max_alcance se muestre el mensaje t < tiempo de alcance
Boletn de Prcticas
Ejemplo 1 o Modifique el programa Tiro.java (Sesin 3) para que se impriman por pantalla los valores x(t), y(t), Vx(t) e Vy(t), para los valores discretos de t = {1, 2, 3, t_final}, donde t_final es el instante de alcance mximo. Hgalo empleando: a) Un bucle FOR. b) Un bucle WHILE. c) Un bucle DOWHILE. d) Un bucle infinito (condicin de terminacin siempre true) que termine (sentencia break) cuando y(t) pase a ser negativo. Observacin: el segundo trmino del clculo de y tiene un error: donde dice *g*t*t debe decir 0.5*g*t*t porque se redondea a cero el un medio. Ejemplo 2 o Realice un nuevo programa que muestre por pantalla todos los nmeros divisibles por 11 existentes en el rango (1..N), donde N es un valor solicitado al usuario por teclado que se debe comprobar que es mayor o igual que 11. Hgalo empleando: a) Un bucle FOR. b) Un bucle WHILE. c) Un bucle DOWHILE. o Modifique el programa para que slo muestre los divisores PARES de 11.
Boletn de Prcticas
Ejemplo 1 o Modifique el programa Tiro.java para que se creen sendos arrays tablaX y tablaY (tablas de valores double) que almacenarn los valores x(t) e y(t) para t = {1, 2, 3, t_final}, donde t_final es el instante de alcance mximo. Una vez calculados los valores, mustrelos por pantalla con el siguiente formato (los datos empleados son slo un ejemplo): (x0, y0) = (3, 5) (x1, y1) = (6, 7) (x2, y2) = (9, 8) o Obtenga y muestre la altura mxima alcanzada en el disparo (hmax). o Ample el programa para que al final se imprima para cada punto del plano (almacenado en los arrays de antes) la distancia lineal a ese punto desde el origen (d).
Ejemplo 2 o Escriba un programa Serie.java en el que, dado un array Entrada de valores enteros, se calcule y muestre por pantalla otro array Salida de la misma longitud cuyos elementos se calculan como:
n-1
Salida[i] = Entrada[j]
j=i
Boletn de Prcticas
Ejemplo 1 o Escriba un programa Matriz.java que solicite al usuario por teclado el nmero de filas (n) y de columnas (m) que desea que tenga su matriz. A continuacin, solictele los n*m valores con los que deber rellenar la estructura. o Aada al programa anterior las sentencias necesarias para calcular el valor mximo, mnimo y medio de los elementos de la matriz. Ejemplo: n=3 m=3 El maximo es 9 El minimo es 1 La media es 5.0 Ejemplo 2 (Opcional) o Aada al programa anterior las sentencias necesarias para que: El usuario introduzca dos matrices de tamao n x m (matrices A y B) Se cree adems otra matriz de tamao n x m en la que se almacenar la suma de las dos matrices anteriores (matriz C = A+B) Se muestre por pantalla la matriz C Ejemplo: n=3 m=3 A= 1 4 7 10 10 10 2 5 8 10 10 10 3 6 9 10 10 10 B = 9 6 3 8 5 2 7 4 1 Matriz = 1 4 7 2 5 8 3 6 9
C=
10
Boletn de Prcticas
Ejemplo 1 o Dado el programa Matriz.java de la sesin anterior en el que se permita al usuario introducir por Teclado una matriz Anxm, aada las lneas de cdigo necesarias para: Mostrar las diagonales de la matriz A si y slo si es cuadrada. Crear una nueva matriz At que sea la transpuesta de A y mostrarla por pantalla de forma bidimensional (utilice el carcter \t como tabulador). Se incluye el producto de ambas para usarse en el ejemplo 2. n=3 m=4 1 4 7 14 32 50 2 5 8 1 2 3 4 5 6 7 8 9
A=
3 6 9
At =
A*At =
Ejemplo 2 (Opcional) Mostrar la diagonal de la matriz A en el caso de que no sea cuadrada. Calcular y mostrar el resultado de A(nxm) * At(mxn). Obsrvese que el resultado es una matriz simtrica y cuadrada de tamao nxn. n=3 m=4 1 5 9 2 6 10 3 7 11 4 8 12 1 2 3 4 5 6 7 8 9 10 11 12
A=
At =
11
Boletn de Prcticas
Ejemplo 1 Se pide que implemente una calculadora con las operaciones suma, resta, multiplicacin, divisin, potencia, valor absoluto y mdulo(%). Debe considerar un mtodo para cada una de las operaciones. Debe considerar valores double en todos los casos excepto en la potencia en la que el exponente debe ser int. Desde main debe hacer todas las llamadas para demostrar el uso de dichos mtodos. Es decir, los argumentos pueden estar inicializados en la misma declaracin.
Ejemplo 2 Ample el ejemplo anterior de manera que: Se incluya un mtodo que muestre el mensaje correspondiente y lea un valor double que retorne a quien lo llam. Se incluya en main el cdigo necesario para que aparezca un men que solicite el tipo de operacin (utilice una sentencia switch) y despus lea los valores para el clculo (fjese que en las operaciones mdulo y valor absoluto slo se lee un valor). El programa debe estar funcionando hasta que el usuario introduzca la opcin terminar ejecucin.
12
Boletn de Prcticas
13
Boletn de Prcticas
(0 0) (1 0) (1 1) (2 0) (2 1) (2 2) (3 0) (3 1) (3 2) (3 3) (4 0) (4 1) (4 2) (4 3) (4 4)
escribimos (a b) para representar a sobre b
Definicin 1: Haciendo uso de la definicin de la funcin factorial, n n! k n, = k k!(n k )! Definicin 2: Haciendo uso de la identidad de Blaise Pascal (1623-1662) n n = =1 0 n n n 1 n 1 k n 1, = k k + k 1 Casos base
Definicin recursiva
Deber implementar los siguientes mtodos estticos: factorial ( n ) n 0 debe ser un entero largo. Implemente la definicin recursiva de este mtodo: 1 n=0 factorial (n) = n * factorial (n - 1) n > 0 coeficiente ( n, k ). Haga uso de la Definicin 1 coeficiente_pascal ( n, k ). Haga uso de la Definicin 2 Cree un mtodo main dentro de esta clase que compruebe el correcto funcionamiento de todos los mtodos anteriores. Cuestin: Hasta qu valor de n se puede calcular el resultado de los tres mtodos anteriores? D una explicacin. Opcional: Escriba el cdigo necesario para generar y mostrar el tringulo de Pascal.
14
Boletn de Prcticas
A partir del cdigo anterior, implemente una clase Ejemplo2.java en el que se definan cuatro mtodos estticos que permitan sumar, restar, multiplicar y dividir enteros. Todos los mtodos toman como argumento los dos enteros a operar y devuelven un entero como resultado. Modifique adecuadamente el mtodo main para que, empleando estos mtodos, se comporte como el main del Ejemplo1. A partir del resultado anterior, disee e implemente una clase Entero.java cuya nica variable de instancia sea un valor del tipo int. Cree el/los constructor/es que considere adecuados. Cree los mtodos de consulta (get) y modificacin (set) que considere adecuados. Cree tambin los mtodos adecuados para sumar, restar, multiplicar y dividir objetos de la clase Entero (no int).
Para probar la correccin de esta clase, modifique el mtodo main de la clase Ejemplo1, creando sendos objetos de tipo Entero a partir de los datos ledos por teclado y oprelos para que produzcan el mismo resultado que antes.
15
Boletn de Prcticas
Ejemplo 4. Escriba el cdigo main de una clase de Prueba que defina dos arrays del tipo Ordenable, de manera que uno contenga coches y otro aviones. Utilizando la implementacin del mtodo ordenable, aplique el mtodo de la burbuja para ordenar cada uno de los arrays. El programa de prueba deber imprimir los datos de los objetos antes y despus de ser ordenados (de manera ascendente).
16
Boletn de Prcticas
vehiculo terrestre
vehiculo areo
camion
coche
avion
helicoptero
Paso 1. Implemente en Java el esqueleto de todas las clases del ejemplo junto con sus relaciones de herencia. Hgalas sin cdigo (slo con { }) y complelas. Paso 2. Aada a cada clase un mtodo toString() que muestre en pantalla un mensaje del tipo soy un camin, soy un coche, soy un vehculo terrestre, etc. Paso 3. Cree una clase Prueba con main() en la que se creen objetos de las clases: camin, coche, avin y helicptero. Compruebe qu se imprime en pantalla al invocar a cada objeto el mtodo toString(). Paso 4. Aada a vehculo terrestre el atributo kilmetros y a la clase vehculo areo el atributo horas de vuelo. Aada tambin mtodos para cambiar y acceder dicho atributo en las clases mencionadas. Aada los siguientes atributos especficos de las clases mencionadas: para camin el nmero mximo de kilogramos; para coche el nmero mximo de ocupantes; para avin si es militar o no; y para helicptero el nmero de horas de autonoma en vuelo. Haga que todos estos atributos queden dichos en el constructor de cada clase y modifique la implementacin del mtodo toString para mostrar dicha informacin en cada caso. Ample la clase de prueba anterior demostrando la creacin de objetos con los nuevos constructores y el uso de los mtodos definidos. Los mtodos definidos en la superclase estn disponibles en las subclases: se heredan!. Paso 5. Cree en la clase de Prueba un objeto de la clase vehculo terrestre. Intente acceder al mtodo toString(). Qu ocurre?. Paso 6. Cree un objeto de la clase camin pero almacene la referencia en una variable del tipo vehculo terrestre. Qu pasa si pide toString()?. Qu pasa si pide los kilmetros?. Y si le pide el numero mximo de kilogramos?. Asigne (mediante el cast apropiado) la referencia anterior a un identificador de la clase camin. Cuntos objetos camin tiene entonces?. Qu ocurre ahora con las invocaciones?. Paso 7. Cree un objeto de la clase vehculo areo y gurdela en un identificador de dicha clase. Qu pasa si intenta guardar la referencia en una variable de la clase avin, en compilacin o en ejecucin?. Paso 8. Defina una array de vehculos. Cree una decena de objetos de las distintas clases (camin, coche, avin y helicptero) y almacnelas en dicho array. Escriba un bucle for que recorra el array y muestre en pantalla el mtodo toString() de cada uno. Qu se muestra?. Lo esperaba?.
17
Boletn de Prcticas
Vehculo terrestre descripcin = Soy un vehculo Terrestre caballosDePotencia toString() arrancar() parar()
Vehculo Areo horasDeVuelo : Integer horasAutonomaEnVuelo : Integer descripcin = Soy un vehic. Areo despegar() aterrizar() toString()
Visibilidad soy atributo privado soy atributo pblico soy atributo protected soy atributo paquete soy operacion publica() soy operacion privada() soy operacion protected() soy operacin de paquete()
Parte I. Dada la jerarqua anterior implemente en Java las clases involucradas teniendo en cuenta: Las visibilidades indicadas en la clase Visibilidad. La presencia de constructores en todas las clases que inicialicen adecuadamente todas las variables de instancia y entre ellas el correspondiente atributo descripcin. Impedir que se puedan crear objetos en las clases Vehculo y Vehculo Areo. Impedir que se especialicen ms las clases Vehculo terrestre, Avin y Helicptero. Cada toString retorna el valor del atributo descripcin. Parte 2. - Prepare ejemplos que intenten acceder a las propiedades privadas y protected (no hace falta que sea para todas las clases). - Cree objetos donde sea posible y juegue con las referencias asignndolas a identificadores de las superclases para demostrar los efectos de la invocacin del mtodo toString Ocurre lo que esperaba? Pruebe a eliminar el mtodo toString de todas las clases salvo de Vehculo. Qu ocurre entonces? - Cambie la visibilidad del atributo descripcin en todas las clases para que sea protected. Cree un objeto de la clase Avin y haga que le apunten dos referencias: una de la clase Avion y otra de la clase Vehiculo. Muestre por pantalla el descriptor de dicho objeto desde ambas referencias Qu aparece? - Prepare tambin algn ejemplo donde se haga downcasting y upcasting, provocando situaciones correctas, con error en compilacin y con error en ejecucin.
18
Boletn de Prcticas
Sesin 16 Aspectos Avanzados de la P. Orientada a Objetos (II): Composicin, Herencia, Interfaces y Patrones
Objetivos: una vez se conocen los mecanismos bsicos que proporciona la orientacin a objetos, se pretende que el alumno sea capaz de conjugar todos ellos desarrollando un ejemplo ms completo y complejo que los anteriores y en el que deber integrar todo lo aprendido hasta ahora. Tambin se pretende que el alumno advierta la importancia de la fase de diseo que debe preceder a todo desarrollo de software, as como familiarizarle con la notacin UML (Unified Modeling Language) y en particular con sus Diagramas de Clases. Parte I. Dado el Diagrama de Clases UML mostrado en la Fig. 1, implemente en Java las clases involucradas teniendo en cuenta: La presencia de constructores en todas las clases que inicialicen adecuadamente las variables de instancia. Adems de los mtodos pblicos declarados en cada clase, proporcione mtodos get y set para la consulta / modificacin de cada una de las variables de instancia. En la jerarqua de Clases relacionadas con Figura, cada toString retorna la concatenacin de los atributos de la clase correspondiente, as como el resultado del rea y el permetro. Observe las etiquetas <<abstract>> y <<final>> (estereotipos UML) en cada una de las clases.
Punto int x int y String toString() <<abstract>> Figura tipo : String = "Figura" tiene 1 String toString() <<abstract>> double calcularArea() <<abstract>> double calcularPeri()
centro 1
Fig. 1. Cree un programa de Prueba en el que se almacenen 2 Crculos y 2 Cuadrados en una tabla de Figuras. Recorra la tabla mostrando el toString de todas las Figuras (Polimorfismo). Parte 2. Partiendo de la implementacin anterior y dado el Diagrama de Clases UML mostrado en la Fig. 2, implemente en Java las nuevas clases teniendo en cuenta que: A el/los constructor/es de la clase Aplicacin se le/s debe proporcionar el nmero mximo de Figuras (maxFiguras) que es capaz de gestionar la aplicacin. Si no, por defecto se asumir que el mximo es de 10 Figuras. Al construir una Aplicacin numFigActual se inicializar a cero, incrementndose su valor cada vez que se aada una nueva Figura mediante el mtodo addFigura (Figura f).
19
Boletn de Prcticas
El mtodo addFigura (Figura f) insertar la Figura f en la siguiente posicin libre (numFigActual) y mostrar un mensaje de error cuando se intente insertar ms figuras de las que puede gestionar la aplicacin (maxFiguras). El mtodo dibujarFiguras ( ) delega en el mtodo dibujar asociado al Contexto de la Aplicacin. As, si el Contexto es Textual, este mtodo mostrar en la salida estndar lo que devuelve el mtodo toString de cada Figura. En el caso de que el Contexto sea Grfico aparecer una ventana en la que se dibujarn las Figuras correspondientes. La clase ContextoGrafico la pueden encontrar ya implementada en la web de la asignatura (material docente) y en el Aula Virtual.
<<abstract>> Figura tipo : String = "Figura" Aplicacion int numFigActual int maxFiguras 1 1 void addFigura() void dibujarFiguras() void cambiarContexto (Contexto)()
tiene
tiene 1
Contexto Grafico
Contexto Textual
Fig. 2. Escriba un programa Prueba2 en el que: Se cree una Aplicacin (inicialmente en modo Texto). Se aadan varias Figuras a la Aplicacin. Dibuje todas las Figuras aadidas. Cambie el Contexto de Textual a Grfico Vuelva a dibujar todas las Figuras.
A continuacin:
20
Boletn de Prcticas
21
Boletn de Prcticas
La empresa TANQUES S.A. se dedica a la fabricacin de tanques de aluminio de gran volumen. Uno de sus clientes, la empresa LECHERA ESPAOLA S.A., se ha mostrado interesado en adquirir junto con los tanques algn tipo de programa que les permita controlar los niveles de leche en cada tanque. Los requisitos expuestos por el cliente son los siguientes: Inicialmente la empresa comprar 5 Tanques para su Planta cuyas capacidades (en miles de litros) sern [25, 10, 10, 5, 5], si bien en la instalacin podran instalarse hasta 10 tanques ms si las condiciones del mercado fueran favorables. El programa conocer la capacidad de cada tanque (volumen_total) e inicialmente establecer sus lmites de llenado/vaciado como volumen_mximo = volumen_total y volumen_mnimo = 0. Estos lmites podrn ajustarse (siempre dentro del rango [0, volumen_total]) si los requisitos de seguridad as lo recomiendan. El programa deber llevar cuenta del volumen_actual de leche almacenado en cada tanque. Cada vez que la Planta reciba un cierto volumen de leche a almacenar, ste se colocar en el primer Tanque en el que quepa completo sin sobrepasar el lmite mximo de llenado. Del mismo modo, cada vez que la Planta facture un cierto volumen de leche, ste se obtendr del primer Tanque en el que la extraccin no viole el lmite mnimo de vaciado. Adems de las operaciones de llenado y vaciado de cada Tanque, es posible trasvasar un cierto volumen de leche de un tanque a otro. En este caso ser necesario controlar que no se viole el volumen mximo del tanque de destino pero no el volumen mnimo del tanque de origen, que podr quedar vaco.
Para modelar este sistema, la empresa TANQUES S.A. ha decidido aprovechar el potente mecanismo de excepciones proporcionado por Java, de modo que cada vez que durante el llenado/vaciado/trasvase de los tanques se intente una operacin que viole los lmites mximo/mnimo establecidos, se producir una excepcin de tipo TanqueLLenoException/TanqueVacioException, ambas derivadas de la excepcin predefinida en Java SequrityException. Estas excepciones debern ser apropiadamente capturadas y procesadas en la aplicacin principal. Ejercicio: Modele el sistema expuesto en el enunciado y cree una aplicacin principal que permita simular la siguiente secuencia1 {IN 22.500, IN 8000, IN 2000, IN 2500, IN 1000, OUT 23.000, OUT 8000, OUT 2000, TRANS 2-0 500, OUT 2000, OUT 1000}
IN x: Llenar x litros, OUT x: Vaciar x litros, TRANS A-B x: trasvasar x litros del tanque A al tanque B
22
Boletn de Prcticas
Pantalla de Ejecucin deseada. Consideraremos tres paneles (JPanel) exteriores. El primero englobar dos subpaneles (JPanel), uno para el tanque origen y otro para el tanque destino. Cada uno de estos subpaneles englobar una etiqueta (JLabel) y un conjunto de botones de radio (JRadioButton). El Layout debe ser el por defecto, es decir, no debe indicar nada al respecto. Los botones de radio han sido agrupados utilizando la clase ButtonGroup que permite que slo uno de ellos est activado en un momento dado. El segundo panel engloba una etiqueta (JLabel) ms un campo de texto (JTextField) para introducir los litros. La clase Intenger tiene el mtodo parseInt(String s) para convertir a entero el contenido (getText()) del campo de texto. Deber manejarse la excepcin posible por no introducir un nmero vlido entero. El tercer panel tiene a los tres botones que se muestran. Se pide: I. Con las indicaciones anteriores confeccione un JFrame (size = 500x500) que en ejecucin tenga un aspecto similar y se hayan seguido los pasos anteriores. II. Incorporamos gestin de eventos muy sencilla para todos los componentes (botn, botn de radio y campo de texto) implementando el interfaz ActionListener y su mtodo asociado donde identificaremos la fuente del evento (getSource()) y haremos System.out.println indicando qu evento ocurri. He seleccionado el tanque origen 1 He seleccionado el tanque destino 2 12 litros seleccionados para transferir 0 litros seleccionados para transferir Una posible traza en la salida textual sera: 0 litros seleccionados para transferir No es un nmero vlido 0 litros seleccionados para transferir He pulsado botn de llenar He pulsado botn de trasvasar He pulsado botn de vaciar
23
Boletn de Prcticas
Paso 1: Aada a la aplicacin de la sesin GUI(I) un componente texto de la clase JTextArea para poder mostrar el estado de los tanques y la traza de las operaciones que se llevan a cabo. El contenido de este componente no podr ser modificado por el usuario (consulte el mtodo setEnabled en la ayuda). Para conseguir mostrar tantas lneas de texto como se desee, aada el componente a un objeto de la clase JScrollPane y pegue este en el panel2. Consulte en la ayuda cmo se coloca la barra. Bsicamente es decirle al JScrollPane como argumento el JTextArea en el que se aplica. Paso 2: Modifique el mtodo actionPerformed implementado en la sesin anterior para que muestre la salida de todas acciones en el nuevo rea de texto (consulte el mtodo append en la ayuda de la clase JTextArea) cada vez que se haga un movimiento de litros, en lugar de en la salida estndar. Paso 3: Aada al proyecto las clases TanqueVacioException, TanqueLLenoException y Tanque implementadas en la sesin 18 (puede descargarlas de la pgina web de la asignatura o del Aula Virtual). Declare e inicialice convenientemente una tabla de 3 tanques con capacidades para almacenar 500, 1000 y 1500 litros respectivamente. Paso 5: Implemente en la clase un mtodo mostrarTanques que muestre en el rea de texto el estado de los 3 tanques (capacidad, volumen mnimo y mximo y volumen actual).
24
Boletn de Prcticas
Paso 4: Modifique de nuevo el mtodo actionPerformed para que al pulsar los botones Llenar, Traspasar o Vaciar se ejecuten las correspondientes acciones sobre el/los tanque/s seleccionado/s como origen (y destino). Tras cada una de estas tres operaciones, muestre el estado de los tanques haciendo uso del mtodo implementado en el paso 5. Nota 1: Asegrese de manejar las excepciones que se pudieran producir. Nota 2: Recuerde que en Java las tablas se indexan desde 0. // Ejemplo del cdigo de vaciado de un tanque donde aparece el mtodo mostrar tanques. if (ae.getSource()==boton3) { texto.append("He pulsado botn de vaciar\n"); texto.append ("Vaciando tanque "+origen+" " +cantidad +" l\n"); try { tanques[origen].vaciar(cantidad); mostrarTanques(); // recorrido por el estado de cada uno y mostrarlo } catch (Exception e){ texto.append (e.getMessage()); }
25
Boletn de Prcticas
Objetivos: El alumno implementar una Estructura Dinmica de Datos (EDD) de tipo lista doblemente enlazada capaz de almacenar objetos de cualquier clase y analizar las ventajas e inconvenientes de este tipo de estructuras frente a las estticas (tablas). Enunciado: Cree un nuevo proyecto y adale los ficheros java de esta sesin que podr descargar de la pgina de la asignatura o del Aula Virtual: Nodo, Lista, ListaException, PlantaLechera, Tanque, TanqueVacioException, TanqueLLenoException y Principal (contiene el mtodo main). Algunas de estas clases ya estn implementadas y otras deben completarse, ya que slo se facilita su esqueleto. Complete por este orden el esqueleto de las siguientes clases: 1) Clase Nodo: estructura doblemente auto-referenciada capaz de almacenar objetos de cualquier clase (Object). 2) Clase ListaException: excepcin lanzada por algunos mtodos de la clase Lista. 3) Clase Lista: lista lineal doblemente enlazada con referencias al primer y ltimo nodos, tal y como se muestra en la figura siguiente. Recuerde que los Nodos de la Lista almacenan Object y por lo tanto cada vez que recupere un elemento deber hacer el cast correspondiente para trasformarlo en un Tanque.
inicio final null null
Object
Object
Object
Tanque
Tanque
Tanque
4) Clase PlantaLechera: en sesiones anteriores cada Planta contena un array de Tanques que ahora deber sustituirse por una Lista de Tanques. Ejecute la clase Principal para comprobar la correcta implementacin de las clases anteriores. Cuestiones: En este problema concreto Qu ventajas presenta el uso de una estructura dinmica frente a un array? Qu inconvenientes? Hay alguna ventaja / desventaja en el hecho de que la lista sea doblemente enlazada? En este caso hemos utilizado una Lista de Tanques, pero podramos crear una Lista de Plantas Lecheras? y una Lista de int?
26
Boletn de Prcticas
ANEXO I.
Class Tree Deprecated Index Help
PREV CLASS NEXT CLASS SUMMARY: INNER | FIELD | CONSTR | METHOD FRAMES NO FRAMES DETAIL: FIELD | CONSTR | METHOD
Class Teclado
java.lang.Object | +--Teclado
Field Summary
static byte BYTE_ERR static char CHAR_ERR static double DOUBLE_ERR static float FLOAT_ERR static int INT_ERR static short SHORT_ERR static java.lang.String STRING_ERR
Constructor Summary
Teclado()
Method Summary
static byte readByte()
Mtodo que lee una lnea de teclado y devuelve el byte escrito por el usuario. 27
Boletn de Prcticas
Mtodo que lee una lnea de teclado y devuelve el char escrito por el usuario.
static double readDouble()
Mtodo que lee una lnea de teclado y devuelve el int escrito por el usuario.
static short readShort()
Field Detail
BYTE_ERR
public static final byte BYTE_ERR
SHORT_ERR
public static final short SHORT_ERR
INT_ERR
public static final int INT_ERR
28
Boletn de Prcticas
DOUBLE_ERR
public static final double DOUBLE_ERR
FLOAT_ERR
public static final float FLOAT_ERR
CHAR_ERR
public static final char CHAR_ERR
STRING_ERR
public static final java.lang.String STRING_ERR
Constructor Detail
Teclado
public Teclado()
Method Detail
readByte
public static byte readByte()
Mtodo que lee una lnea de teclado y devuelve el byte escrito por el usuario. Returns: Devuelve el byte introducido por el usuario o Teclado.BYTE_ERR si no se introdujo un byte.
readShort
public static short readShort()
Mtodo que lee una lnea de teclado y devuelve el short escrito por el usuario. Returns: Devuelve el short introducido por el usuario o Teclado.SHORT_ERR si no se introdujo un byte.
29
Boletn de Prcticas
readInt
public static int readInt()
Mtodo que lee una lnea de teclado y devuelve el int escrito por el usuario. Returns: Devuelve el int introducido por el usuario o Teclado.INT_ERR si no se introdujo un byte.
readDouble
public static double readDouble()
Mtodo que lee una lnea de teclado y devuelve el double escrito por el usuario. Returns: Devuelve el double introducido por el usuario o Teclado.DOUBLE_ERR si no se introdujo un byte.
readFloat
public static float readFloat()
Mtodo que lee una lnea de teclado y devuelve el float escrito por el usuario. Returns: Devuelve el float introducido por el usuario o Teclado.FLOAT_ERR si no se introdujo un byte.
readChar
public static char readChar()
Mtodo que lee una lnea de teclado y devuelve el char escrito por el usuario. Returns: Devuelve el char introducido por el usuario o Teclado.CHAR_ERR si no se introdujo un byte.
readString
public static java.lang.String readString()
Mtodo que lee una lnea de teclado y devuelve el String escrito por el usuario. Returns: Devuelve el String introducido por el usuario o Teclado.STRING_ERR si no se introdujo un byte.
30