Solución al Examen de Prácticas de Programación (Ingeniería Informática)



Documentos relacionados
Examen de Prácticas de Programación Ingeniería Informática

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Uso de excepciones en Java

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Programación Orientada a Objetos en Java

Práctica sobre compartición de instancias remotas.

Programación Orientada a Objetos. Java: Excepciones

Solucion al Examen de Fundamentos de Computadores y Lenguajes

Prof. Dr. Paul Bustamante

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Programación Orientada a Objetos con Java

Primer Parcial Septiembre 5 de 2009

Ejercicio 1 (3 puntos).-

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Programación Orientada a Objetos. Java: Excepciones

Árboles AVL. Laboratorio de Programación II

Constructores y Destructores

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Programación Orientada a Objetos en JAVA

Tema 3. Test Driven Development

Excepciones. Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial. Excepciones

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Examen escrito de Programación 1

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Estructuras de Datos. Montículos. Montículos. Montículos. Tema 3. Montículos. Definiciones básicas: Definiciones básicas:

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:

Patrones para persistencia (I) Ingeniería del Software II

AGRUPA P R OBJET E OS 1

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Programación Orientada a Objetos en Java

Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el C.

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Árboles binarios de búsqueda

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Prof. Dr. Paul Bustamante

Elementos léxicos del lenguaje de programación Java

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Prof. Dr. Paul Bustamante

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Prof. Dr. Paul Bustamante

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

1. Qué tipos de relación hay entre las siguientes clases?

Trabajo Práctico N 4: Diseño por Contratos

Programación en Java. Programación en OO

Introducción - por qué usarlas?(1)

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Clase 32: Árbol balanceado AVL

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Programación Avanzada SOLUCIÓN EXAMEN FEBRERO 2011

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Definición de clases: Herencia, polimorfismo, ligadura dinámica

Aplicación de protección con contraseña para los dispositivos flash USB de Verbatim

Estructuras de datos: Árboles binarios de

Repaso de las características más importantes de la programación Java y su adaptación a Android

Instituto de Computación - Facultad de Ingeniería - Universidad de la República

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Modulo 1 El lenguaje Java

Examen Septiembre Curso Programación en C++ Pág. 1

Técnicas de Desarrollo de Programas Ingeniería Informática Curso 2008 / Ejercicios de Patrones de Diseño:

11. Algunas clases estándar de Java (II)

Programación Orientada a Objetos

Ampliación de Estructuras de Datos

Pruebas de unidad con JUnit

Tema 2. El lenguaje de programación Java (Parte 1)

Manual de Usuario: Administrar Listas de Distribución

Solución Examen Junio 2007 (a) Ejercicio GeoTaxi (1h 20 min.) Diagrama de Casos de Uso y. Casos de uso (2,5 puntos) Modelo de Dominio (1,5 puntos)

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

8. Sentencia return y métodos

3.9 Patrón Distributed callback

Hoja 4: Solución. public String tostring() { return "("+getx()+", "+gety()+")"+" Lado: "+getlx();

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO. Introducción FACULTAD DE INGENIERÍA. Ordenación

Primer Parcial de Programación 3 (1/10/2009)

Instantáneas o Shadow Copy

SERVIDOR WEB PARA ACCESO EN TIEMPO REAL A INFORMACIÓN METEOROLÓGICA DISTRIBUIDA

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

Manual del Protocolo XML-RPC de Mensajería Negocios

Ingeniería del Software Arquitectura Física en 3 niveles

Capítulo 6. ÁRBOLES.

Programación Orientada a Objetos en C#.NET CAPÍTULO 8 E V E N T O S. Ing. Bruno López Takeyas, M.C.

15. Parámetros o argumentos

Soluciones al Examen de Fundamentos de Computadores y Lenguajes

axtpv - Manual del usuario axtpv Profesional

efactura Online La fibra no tiene competencia

Accede a su DISCO Virtual del mismo modo como lo Hace a su disco duro, a través de:

Práctica 2 Gráficos Vectoriales con SVG (versión )

Java Inicial (20 horas)

Departamento CERES Área de Tarjetas Inteligentes Manual de Usuario

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Software Criptográfico FNMT-RCM

Árbol binario. Elaborado por Ricardo Cárdenas cruz Jeremías Martínez Guadarrama Que es un árbol Introducción

Primera Escuela de la Red Temática SVO. Madrid, Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.

Transcripción:

Solución al Examen de Prácticas de Programación (Ingeniería Informática) Junio 2006 Parte I. Cuestiones (3 puntos=50% nota del examen) 1) Se desea crear un conjunto de clases para representar en un programa las personas pertenecientes a la Universidad. Existen tres tipos de universitarios: alumnos, profesores, y personal de administración y servicios (PAS). Los dos últimos son empleados de la Universidad (los alumnos no). Se pide hacer el diseño arquitectónico de una jerarquía de clases que representen a estas personas, teniendo en cuenta los siguientes datos (todos de tipo texto) y operaciones: Todos los universitarios tienen nombre y dirección, y operación para mostrar datos Los alumnos tienen centro y operación para matricularse en un centro Los profesores tienen departamento y operación para adscribirse a él Los PAS tienen unidad administrativa y operación para adscribirse a ella Los empleados tienen número de registro y operación para obtenerlo Se pide también el diseño detallado de los constructores de cada clase, a los que se pasarán como parámetros los valores iniciales de cada atributo. Diseño arquitectónico Universitario nombre: texto dirección: texto Universitario (nombre,direccion: texto) mostrar() Alumno centro: texto Alumno (nombre,direccion,centro: texto) matricularse(centro:texto) mostrar()* Empleado numeroregistro: texto Empleado (nombre,direccion,numreg: texto) numregistro() retorna texto() mostrar()* PAS unidadadministrativa: texto PAS (nombre, direccion numreg,unidad: texto) adscribirse(unidad:texto) mostrar()* Profesor departamento: texto Profesor(nombre,direccion, numreg,dpto: texto) adscribirse(dpto:texto) mostrar()* * operación redefinida Página 1

Diseño detallado de los constructores método Universitario(nombre,direccion : texto) this.nombre:=nombre; this.direccion:=direccion; método Alumno(nombre,direccion,centro : texto) super(nombre,direccion); this.centro:=centro; método Empleado(nombre,direccion,numRegistro : texto) super(nombre,direccion); this.numeroregistro:=numregistro; método PAS(nombre,direccion,numReg,unidad : texto) super(nombre,direccion,numreg); this.unidadadministrativa:=unidad; método Alumno(nombre,direccion,numReg,dpto : texto) super(nombre,direccion,numreg); this.departamento:=dpto; 2) Decimos que una pila p es sombrero de otra pila q si todos los elementos de p están en q en el mismo orden y en las posiciones más próximas a la cima. La pila nula se considera sombrero de cualquier otra pila. Por ejemplo, si A:=[7,9,4,2], B:=[7,9,4,2,5,3,6] y C:=[7,9,2,4,5,3,6], entonces A es sombrero de la pila B, pero no de la pila C. Se supone que el tipo genérico elemento dispone de una operación de comparación: x.equals(y) que aplicado a dos elementos x e y retorna cierto si y sólo si x e y son iguales. Se pide: Especificar y diseñar un método estático recursivo essombrero(p,q) que determine si la pila p es sombrero de la pila q. Diseñar el método anterior mediante un bucle. Página 2

definimos la función essombrero como sigue: essombrero(p.pilavacia(),q)=cierto, essombrero(p.apilar(x),q)=falso si q.esvacia(), essombreo(p.apilar(x),q.apilar(y))= (x=y) && (essombrero(p,q)). Ahora implementamos la función essombrero mediante un método impessombrero: método estático impessombrero(p, q: Pila) retorna essomb: booleano Pre.- p=p && q=q si p.esvacia() entonces essomb:= cierto si no si q.esvacia() entonces essomb:= falso si no essomb:=(p.cima().equals(q.cima()))&& impessombrero(p.desapilar(),q.desapilar()); fsi fsi retorna essomb; Post.- b=essombrero(p,q) Finalmente, implementamos la misma función de forma iterativa método estático essombreroiterativo(p,q : pila) retorna essomb:booleano essomb:=cierto mientras no p.esvacia() && essomb hacer si q.esvacia() entonces essomb:=falso sino essomb:= cima(p).equals(cima(q)) p.desapilar() q.desapilar() fsi fmientras retorna essomb * Nota: Ambos métodos modifican las pilas p y q. Si fuese necesario no modificarlas, habría que copiarlas (clonarlas) y trabajar con las copias, o usar algún tipo de iterador 3) Se dispone de la siguiente clase ya realizada, que representa una red de comunicación: Clase que contiene una operación para recibir * mensajes de texto por un canal de comunicación public class CanalComunicacion Página 3

* Recibir un mensaje de texto del puerto y emisor indicados public String recibe(int puerto, int emisor) throws NoDisponible... Se pide escribir un método para esa clase, con los mismos parámetros y valor de retorno que recibe() y que llame a éste un máximo de 5 veces (usando en la llamada los parámetros obtenidos). Si alguna de las llamadas tiene éxito (porque no se lanza NoDisponible), finalizar el método retornando el valor retornado a su vez por recibe(). Después del 5 intento sin éxito, lanzar la excepción Imposible. Ambas excepciones están declaradas en clases aparte en la forma: public class NoDisponible extends Exception public class Imposible extends Exception public String recibereintentando (int puerto, int emisor) throws Imposible // 5 reintentos for (int i=0;i<5;i++) try // si va bien, finaliza el metodo return recibe(puerto,emisor); catch (NoDisponible e) // Si falla no hacemos nada // si llega aquí ha fallado 5 veces throw new Imposible(); 4) Escribir en Java la implementación del método inserta() de la clase siguiente: * Clase que representa una lista de nombres public class ListaNombres // atributo, que contiene la lista private LinkedList<String> lista=new LinkedList<String>(); * Inserta sin repeticiones los strings del array nombres * en la lista, añadiéndolos uno por uno al final. Aquellos que * ya están en la lista no se añaden. public void inserta(string[] nombres)... public void inserta(string[] nombres) // recorrido del array nombres for (String s:nombres) // lo añade si no está ya incluido if (!lista.contains(s)) lista.addlast(s); Página 4

5) Un árbol binario (como el A1 o el A2 de la figura) puede recorrerse de muchas formas, en particular en inorden, es decir, primero se lista el hijo izquierdo en inorden, luego la raíz y luego el hijo derecho en inorden. Esta definición recursiva se completa definiendo el inorden del árbol vacío como la lista vacía. En la figura se muestra a modo de ejemplo el recorrido en inorden de A1. v,w,y,x,z,r,t,u,p,s,q Responder a la siguiente pregunta: puede recuperarse un árbol binario conociendo la lista de sus nodos en inorden?. Si la respuesta es negativa exhibir un contraejemplo. Si es afirmativa argumentar la razón. La lista de nodos en inorden no permite recuperar el árbol binario, tal como puede verse en el contraejemplo de los árboles A1 y A2 de la figura. El desarrollo en inorden de A2 es v,w,y,x,z,r,t,u,p,s,q, idéntico al de A1. Sin embargo, A1 y A2 son árboles diferentes. Página 5

Examen de Prácticas de Programación (Ingeniería Informática) Junio 2006 Parte II. Problema (3 puntos=50% nota del examen) Se desea hacer parte del programa de gestión del inventario de los artículos que se venden en una tienda. Para ello, se dispone de la siguiente clase ya realizada, cuya interfaz es: * Clase que representa un artículo que se vende en una tienda public class Articulo * Constructor al que se le pasan los datos del artículo public Articulo(String nombre, int cantidad, double preciounidad)... * Retorna el nombre public String nombre()... * Retorna el número de unidades disponibles public int cantidad()... * Retorna el precio de una unidad public double preciounidad()... * Vende num artículos (restándolos de la cantidad disponible), si los * hay. En caso contrario, no modifica la cantidad y * lanza NoDisponible. public void vende(int num) throws NoDisponible... Lo que se pide es hacer una clase que almacene la lista de artículos y que responda a la siguiente interfaz * Clase que contiene una lista con los artículos en venta en una tienda public class Tienda * Constructor al que se le pasa el nombre de la tienda * y que deja la lista vacía public Tienda(String nombre)... * Añade un artículo a la lista public void inserta (Articulo a)... * Busca y retorna el artículo cuyo nombre se indica * Lanza NoExiste si no se encuentra public Articulo busca (String nombre) throws NoExiste... Página 6

* Vende num unidades del artículo del nombre indicado. Para ello busca * el articulo en la lista y usa su método vende. Si no encuentra * el artículo lanza NoExiste. Si la cantidad queda a cero o si se ha * lanzado NoDisponible, elimina el artículo de la lista. Retorna el * valor total de las unidades vendidas. public double vende (String nombre, int num) throws NoExiste... * Escribe en el fichero de texto cuyo nombre se indica * aquellos artículos de la lista de los que queden menos * de min unidades. Se escriben uno por línea, cada uno * con sus tres datos. En la primera línea se escribirá el * nombre de la tienda public void escribepedido(string nombrefichero, int min)... La clase tendrá como atributos privados una lista de artículos (usar por ejemplo la clase LinkedList), y el nombre de la tienda (texto). Las excepciones están declaradas en clases aparte en la forma: public class NoDisponible extends Exception public class NoExiste extends Exception Nota: Se valorará cada parte de la clase Tienda según su dificultad. import java.io.*; import java.util.*; * Clase que contiene los artículos en venta en una tienda public class Tienda // atributos private LinkedList<Articulo> lista; private String nombre; * Constructor al que se le pasa el nombre de la tienda public Tienda(String nombre) this.nombre=nombre; lista= new LinkedList<Articulo>(); * Añade un artículo a la lista public void inserta (Articulo a) lista.add(a); * Busca y retorna el artículo cuyo nombre se indica * Lanza NoExiste si no se encuentra Página 7

public Articulo busca (String nombre) throws NoExiste int i=0; boolean encontrado=false; Articulo a=null; // esquema de busqueda en tabla while (i<lista.size() &&! encontrado) a=lista.get(i); if (nombre.equals(a.nombre())) encontrado=true; else i++; // retorna valor o lanza excepcion if (encontrado) return a; else throw new NoExiste(); * Vende num unidades del artículo del nombre indicado. Para ello busca * el articulo en la lista y usa su método vende. Si no encuentra * el artículo lanza NoExiste. Si la cantidad queda a cero o si se ha * lanzado NoDisponible, elimina el artículo de la lista. Retorna el * valor total de las unidades vendidas. public double vende (String nombre, int num) throws NoExiste // No hace falta lanzar NoExiste, pues ya lo hace busca Articulo a=busca(nombre); int disponible=a.cantidad(); int vendidos=num; try // vende las unidades pedidas a.vende(num); if (disponible==num) // ya no quedan articulos lista.remove(a); catch (NoDisponible e) // no habia suficientes vendidos=disponible; lista.remove(a); return vendidos*a.preciounidad(); * Escribe en el fichero de texto cuyo nombre se indica * aquellos artículos de la lista de los que queden menos * de min unidades. Se escriben uno por línea, cada uno * con sus tres datos. En la primera línea se escribirá el * nombre de la tienda public void escribepedido(string nombrefichero, int min) try // Abrir el fichero FileWriter f = new FileWriter(nombreFichero); PrintWriter p = new PrintWriter(f); // Escribir la primera linea p.println("nombre tienda: "+nombre); // recorrer todos los articulos Articulo a; for (int i=0; i<lista.size(); i++) a=lista.get(i); // escribir el articulo si la cantidad es menor que min Página 8

if (a.cantidad()<min) p.println("articulo:"+a.nombre()+ " cantidad:"+a.cantidad()+ " precio:"+a.preciounidad()); // Cerrar el fichero p.close(); catch (IOException e) System.out.println("Error inesperado: "+e); Página 9