Examen escrito de Programación 1

Documentos relacionados
Examen escrito de Programación 1

Examen escrito de Programación 1. Jueves 5 de febrero de Problema 1 o (3.5 puntos)

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Ficheros y streams. Desde el punto de vista de Java, cada fichero no es más que una secuencia o flujo de bytes [stream].

Examen escrito de Programación 1

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

EXAMEN PROGRAMACIÓN 21 de Septiembre de 2007 INGENIERÍA INFORMÁTICA Primera parte: Cuestiones 1,5 horas

Un breve resumen del lenguaje Java

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

GUÍA DE ESTILO EN JAVA

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Ejercicios de Programación Tema 7. Programación Orientada a Objetos

Ejercicios de evaluación de fundamentos de programación en Java

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Práctica III: Streams, Readers y Writers

Ficheros de acceso aleatorio

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

CLASES QUE UTILIZAN OBJETOS. RELACIÓN DE USO ENTRE CLASES JAVA. CONCEPTO DE DIAGRAMA DE CLASES. (CU00641B)

Definición de Memoria

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote METODOS CONSTRUCTORES Y LA REFERENCIA THIS

Guía - Taller # 2 (JAVA)

IIC1103 Introducción a la Programación. Ayudantía: Archivos

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

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

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

FUNCIONES PHP: DECLARACIÓN Y LLAMADAS. PARÁMETROS, RETURN. EJERCICIOS EJEMPLOS RESUELTOS. (CU00827B)

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Clase adicional 2. Estructuras básicas de control. Temas

Elementos léxicos del lenguaje de programación Java

Examen Parcial de Programación II Ejercicio Práctico

Ejercicios del tema 7: Clases y objetos

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

Objetivo de aprendizaje del tema

Programación Orientada a Objetos. Java: Excepciones

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Creación de un objeto. Creación de un objeto. Creación de un objeto

La sintaxis básica para definir una clase es la que a continuación se muestra:

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

4. Operadores Operador asignación

Programación Orientada a Objetos. Java: Excepciones

QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B)

Introducción al lenguaje Java

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

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

Principios de Computadoras II

Aplicación Android de Asistencia al Caminante

Metodología y Tecnología de la Programación

Primer Parcial Septiembre 5 de 2009

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Entrada y Salida con Java

Práctica 4: Herencia. Objetivos:

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Manual de turbo pascal

FUNDAMENTOS DE PROGRAMACIÓN Curso: 2013/14 EXAMEN PARA ALUMNOS PRESENTADOS AL PRIMER PARCIAL PRIMERA PARTE. EJERCICIO 1 Cuestiones (1 punto)

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

CONCEPTOS BASICOS DEL LENGUAJE JAVA

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Tutorial de uso de Android Asynchronous HTTP Client (LOOPJ) Programación en Internet

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Introduciendo datos desde el

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Programación. Test Autoevaluación Tema 3

Programación Orientada a Objetos. Tema 7: Persistencia

Excepciones y E/S Java y Servicios Web I Master en Ingeniería Matemática

PROGRAMACIÓN EN JAVA

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Tema 4. Excepciones en Java

Profesor(a): M. A. Zeferino Galarza Hernández

Universidad Nacional del Santa FACULTAD DE INGENIERIA E.A.P. Ingeniería de Sistemas e Informática NETBEANS 7.0 MI PRIMER PROYECTO

Clases en Java. Declaración de clases en Java 02/09/16. Ing. Roberto Martínez Román - public class Alumno { private int matricula;

Unidad Nº V Listas Enlazadas

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.

Programación Avanzada SOLUCIÓN EXAMEN FEBRERO 2011

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Fundamentos de programación

Boletín 7 Herencia. String Titular; Nombre del dueño de la cuenta double Saldo: Dinero disponible en la cuenta

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

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Un identificador le da nombre único a un elemento en un programa (Variables, procedimientos, etc.). No puede contener operadores como + - * /

Estructuras de control

Curso Introducción JAVA Pág.: 1

Laboratorio JDBC - Base de datos con Java

Pero nos están faltando otros operadores imprescindibles:

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

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

Tema: Arreglos de Objetos en C++.

2.2 Nombres, Ligado y Ámbito

Transcripción:

Examen escrito de Programación 1 Escuela de Ingeniería y Arquitectura Departamento de Informática e Ingeniería de Sistemas 12 de septiembre de 2013 Disponer sobre la mesa en lugar visible un documento de identificación provisto de fotografía. Escribir nombre y dos apellidos en cada una de las hojas de papel que haya sobre la mesa. Comenzar a resolver cada una de las partes del examen en una hoja diferente para facilitar su corrección por profesores diferentes. El tiempo total previsto para realizar el examen es de dos horas y media. No está permitido consultar libros ni apuntes, excepto los dos documentos facilitados por los profesores de la asignatura: Un breve resumen del lenguaje Java y Documentación de las clases Java utilizadas en la asignatura. En todos los métodos a diseñar en este examen se valorará de forma destacada la adecuada especificación de los mismos. Problema 1.º (2,5 puntos) Se debe diseñar una clase Java, de nombre Producto cuyos objetos permitan representar productos de consumo que pueden ser perecederos o no. El diagrama UML de dicha clase se muestra a continuación, seguido de explicaciones sobre sus atributos y métodos: 1

examenseptiembre.producto - nombre: String - calidad: int - esperecedero: boolean - diasparacaducar: int + Producto(nombre: String; calidad: int; esperecedero: boolean; diasparacaducar: int) + nombre(): String + esperecedero(): boolean + diasparacaducar(): int + calidad(): int + actualizar(): void + hacaducado(): boolean Todos los productos se caracterizan por un nombre determinado, representado a través de un objeto de la clase String, y una determinada calidad, representada por un entero no negativo. Los productos perecederos están caracterizados además por un entero positivo que representa el número de días que les falta para caducar. Los productos no perecederos también cuentan con este último atributo, aunque su valor puede ser ignorado. El paso de los días disminuye la calidad de los productos perecederos, que pierden 6 unidades de calidad cada 5 días, hasta que alcanzan su fecha de caducidad, momento a partir del cual su calidad es igual a 0. La calidad de los productos no perecederos no sufre variación aunque pasen los días. Además de un método constructor y de los métodos de acceso a sus atributos (nombre(), esperecedero(), diasparacaducar() y calidad()), los objetos de la clase Producto dispondrán de un método público denominado actualizar() que, cuando es invocado sobre un determinado producto, representa el hecho de que ha pasado un día para el producto y, en consecuencia, en el caso de que se trate de un producto perecedero, actualiza el número de días que le quedan para que caduque y el valor de su calidad. En primer lugar, disminuye en un día el número de días que le falta para caducar y, a continuación, rebaja en dos o una unidades de calidad en función de que el nuevo número de días hasta que caduque sea o no múltiplo de 5, respectivamente. En todo caso, la calidad de un producto tras haber sido actualizado nunca es inferior a cero y si el producto ha caducado (es decir, le quedan 0 días o menos para caducar), su calidad es igual a 0. La calidad de los productos no perecederos no varía nunca, incluso si se invoca su método actualizar(). Los objetos de la clase Producto tendrán, además, un método denominado hacaducado() que indicará si el objeto sobre el que se invoca ha caducado o no. Es decir, devolverá true si y solo si se trata de un producto perecedero al que le quedan 0 días para caducar o menos. Se pide escribir el contenido completo del fichero de código fuente Java «Producto.java», ubicado en el paquete examenseptiembre, cuyos métodos públicos tengan un comporta- 2

miento acorde con la especificación proporcionada en este enunciado. El código debe estar adecuadamente documentado. Problema 2.º (1 punto) Utilizando objetos de la clase Producto definida en el problema anterior, se pide completar el siguiente método: Pre: «inventario»!= null e «inventario».length > 0 Post: Ha devuelto la referencia al producto de mayor calidad de entre todos los productos referenciados en la tabla tabla «inventario». Las referencias a los productos de la tabla «inventario» no han sufrido cambios. public static Producto mejor(producto[] inventario) Problema 3.º (2,5 puntos) Utilizando objetos de la clase Producto definida en el problema 1.º, se pide completar el siguiente método: Pre: «inventario»!= null Post: Ha devuelto la referencia a una nueva tabla de productos en la que están todas referencias a los productos no caducados de la tabla «inventario» y solo esas. Las referencias a los productos de la tabla «inventario» no han sufrido cambios. public static Producto[] nocaducados(producto[] inventario) { Problema 4.º (4 puntos) La información de productos representables como objetos de la clase Producto definida en el problema 1.º se almacena, por motivos históricos y de mantenimiento, en dos tipos de ficheros: ficheros de texto y ficheros binarios. Por una parte, en los ficheros de texto, cada línea representa un producto en el que, separados por comas, se encuentran los atributos de cada producto en este orden: nombre, calidad, si es perecedero y el número de días que faltan para que caduque. En los nombres de los productos no hay comas. La estructura de los ficheros de texto de productos es la siguiente: 3

<fichero_productos_txt> ::= {<producto_txt> <producto_txt> ::= <nombre_txt> "," <calidad_txt> "," <perecedero_txt> "," <caducidad_txt> <nombre_txt> ::= literal_string (sin comas) <calidad_txt> ::= literal_entero <perecedero_txt> ::= literal_booleano <caducidad_txt> ::= literal_entero Por otra parte, en los ficheros binarios, por cada producto la información almacenada es, en el orden que se indica a continuación, un dato int que representa la longitud del nombre nombre del producto, seguido de tantos datos de tipo char como la longitud del nombre indique, que representan cada uno de los caracteres que forman el nombre; un dato de tipo int que representa la calidad del producto; un dato de tipo boolean que representa si el producto si es perecedero o no y un dato de tipo int que representa el número de días que faltan para que el producto caduque. La estructura de los ficheros binarios de productos es la siguiente: <fichero_productos_bin> ::= {<producto_bin> <producto_bin> ::= <nombre_bin><calidad_bin><perecedero_bin> <caducidad_bin> <nombre_bin> ::= int {char <calidad_bin> ::= int <perecedero_bin> ::= boolean <caducidad_bin> ::= int Se pide completar el siguiente método que, partiendo de la información de un lote de productos almacenada en un fichero de texto, actualiza sus calidades y días para caducar y almacena la información de los productos actualizados como un fichero binario: Pre: «nombreficherotexto» es distinto de null y hace referencia a un fichero de texto existente con la estructura establecida en el enunciado; «nombreficherobinario» es distinto de null y hace referencia a un fichero que no existe o que, si existe, puede ser reescrito. Post: Ha leído el contenido del fichero «nombreficherotexto», interpretando cada línea del mismo como un producto que, tras haber sido actualizado de acuerdo con las especificaciones de la clase producto establecidas en el enunciado del problema 1.º, ha sido escrito como dato binario en el fichero «nombreficherobinario». public static void convertirdetextoabinario(file nombreficherotexto, File nombreficherobinario) Al diseño de este método se le debe aplicar la metodología de diseño descendente utilizada en el curso, plasmada en el desarrollo de, al menos, un par de métodos privados auxiliares. 4

Solución al problema 1.º package examen.curso2012_13.septiembre; Los objetos de esta clase representan productos que pueden ser perecederos o no. Todos los productos se caracterizan por un nombre determinado y una cierta calidad, representada por un valor entero no negativo. Los productos perecederos están caracterizados además por el número de días que les falta para caducar. El paso de los días disminuye la calidad de los productos perecederos, que pierden 6 unidades de calidad cada 5 días, hasta que alcanzan su fecha de caducidad, momento a partir del cual su calidad es igual a 0. La calidad de los productos no perecederos no sufre variación aunque pasen los días. public class Producto { Nombre de este producto private String nombre; Entero positivo que representa la calidad de este producto private int calidad; Booleano que indica si este producto es perecedero o no private boolean esperecedero; Entero positivo que representa el número de días que falta para que caduque este producto perecedero. Si este producto no es perecedero, el valor de este atributo puede ser ignorado. private int diasparacaducar; Pre: «nombre»!= null; «calidad» >= 0; si «esperecedero», entonces «diasparacaducar» >= 0 Post: Ha inicializado los atributos de un nuevo objeto de esta clase a partir de los valores de los parámetros public Producto(String nombre, int calidad, boolean esperecedero, int diasparacaducar) { this.nombre = nombre; this.esperecedero = esperecedero; this.diasparacaducar = diasparacaducar; this.calidad = Math.max(calidad, 0); 5

Post: Ha devuelto el nombre de este producto. public String nombre() { return nombre; Post: Ha devuelto true si y solo si este producto es perecedero. public boolean esperecedero() { return esperecedero; Pre: Este producto es perecedero Post: Ha devuelto el número de días que quedan para que caduque este producto perecedero. Si este producto no es perecedero, ha devuelto un valor indeterminado. public int diasparacaducar() { return diasparacaducar; Post: Ha devuelto un entero positivo que representa la calidad de este producto. public int calidad() { return calidad; Post: Una invocación a este método representa el hecho de que ha pasado un día para el producto y, en consecuencia, en el caso de que se trate de un producto perecedero, ha actualizado el número de días que quedan para que caduque este producto y su valor de calidad. Primero habrá disminuido en un día el número de días que le faltan para caducar y, a continuación, habrá rebajado en dos o una unidades de calidad en función de que el nuevo número de días hasta que caduque sea o no múltiplo de 5, respectivamente. En todo caso, la calidad de un producto tras haber sido actualizado nunca es inferior a cero y si el producto ha caducado (es decir, le quedan 0 días o menos para caducar), su calidad es igual a 0. Si este producto no es perecedero, su valor de calidad no ha variado. public void actualizar() { if (esperecedero) { diasparacaducar = diasparacaducar - 1; 6

if (diasparacaducar <= 0) { calidad = 0; else if (diasparacaducar % 5 == 0) { calidad = Math.max(calidad - 2, 0); else { calidad = Math.max(calidad - 1, 0); Post: Ha devuelto true si y solo si este producto ha caducado, es decir, si se trata de un producto perecedero al que le quedan 0 días para caducar o menos. public boolean hacaducado() { return esperecedero && diasparacaducar <= 0; 7

Solución a los problemas 2.º, 3.º y 4.º package examen.curso2012_13.septiembre; import java.io.dataoutputstream; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.util.scanner; public class Problemas { Pre: «inventario»!= null e «inventario».length > 0 Post: Ha devuelto la referencia al producto de mayor calidad de entre todos los productos referenciados en la tabla tabla «inventario». Las referencias a los productos de la tabla «inventario» no han sufrido cambios. public static Producto mejor(producto[] inventario) { // Referencia al producto de mayor calidad de la tabla «inventario», // inicialmente, el referenciado por la primera componente Producto mejor = inventario[0]; // Recorrido del resto de las componentes de la tabla «inventario», // actualizando la referencia «mejor» cada vez que se encuentra un // elemento de calidad mayor for (int i = 1; i < inventario.length; i++) { if (inventario[i].calidad() > mejor.calidad()) { mejor = inventario[i]; // Devolución del resultado return mejor; Pre: «inventario»!= null Post: Ha devuelto la referencia a una nueva tabla de productos en la que están todas referencias a los productos no caducados de la tabla «inventario» y solo esas. Las referencias a los productos de la tabla «inventario» no han sufrido cambios. public static Producto[] nocaducados(producto[] inventario) { // Contador del número de elementos no caducados de «inventario» int numeronocaducados = 0; // Recorrido completo de la tabla para averiguar el número de // productos no caducados 8

for (int i = 0; i < inventario.length; i++) { if (!inventario[i].hacaducado()) { numeronocaducados++; // Creación de la tabla que contendrá las referencias a los // productos no caducados Producto[] nocaducados = new Producto[numeroNoCaducados]; // Recorrido de las componentes de la tabla «inventario», copiando a // la componente adecuada de la tabla «nocaducados» las referencias // los productos no caducados int indicenocaducados = 0; for (int i = 0; i < inventario.length; i++) { if (!inventario[i].hacaducado()) { nocaducados[indicenocaducados] = inventario[i]; indicenocaducados++; // Devolución del resultado return nocaducados; Pre: «nombreficherotexto» es distinto de null y hace referencia a un fichero de texto existente con la estructura establecida en el enunciado; «nombreficherobinario» es distinto de null y hace referencia a un fichero que no existe o que, si existe, puede ser reescrito. Post: Ha leído el contenido del fichero «nombreficherotexto», interpretando cada línea del mismo como un producto que, tras haber sido actualizado de acuerdo con las especificaciones de la clase producto establecidas en el enunciado del problema 1.º, ha sido escrito como dato binario en el fichero «nombreficherobinario». public static void convertirdetextoabinario(file nombreficherotexto, File nombreficherobinario) { try { // Creación de los objetos para la lectura y escritura de los // ficheros Scanner texto = new Scanner(nombreFicheroTexto); DataOutputStream binario = new DataOutputStream(new FileOutputStream( nombreficherobinario)); // Lectura del fichero «nombreficherotexto», leyendo una línea // cada vez, creando un producto a partir de lo leído, // actualizándolo y escribiéndolo en el fichero // «nombreficherobinario» 9

while (texto.hasnextline()) { Producto p = leerproducto(texto.nextline()); p.actualizar(); escribir(binario, p); // Liberación de los recursos utilizados por «texto» y «binario» texto.close(); binario.close(); catch (IOException ex) { // En caso de producirse un error, se informa de ello por // pantalla System.out.println("Error al leer o escribir en los ficheros: " + ex.getmessage()); Pre: «linea» es distinto de null y tiene el formato de una línea de fichero de texto que representa un producto, según el enunciado. Post: Ha devuelto la referencia a un nuevo objeto de la clase Producto de acuerdo con el contenido de «linea». private static Producto leerproducto(string linea) { // Creación de un objeto de la clase Scanner para procesar «linea» Scanner s = new Scanner(linea); // Establecimiento de la coma como separador de elementos s.usedelimiter(","); // Lectura de los cuatro atributos del producto representado por // «linea» String nombre = s.next(); int calidad = s.nextint(); boolean esperecedero = s.nextboolean(); int diasparacaducar = s.nextint(); // Creación y devolución del producto representado por «linea» return new Producto(nombre, calidad, esperecedero, diasparacaducar); Pre: «f»!= null y «f» no ha sido cerrado; «p»!= null Post: Ha escrito en «f» los atributos de «p»: la longitud de su nombre, cada uno de los caracteres que forman el nombre, el entero que indica su calidad, un booleano que indica si es perecedero o no y el número de días que le faltan para caducar, en ese orden. El fichero «f» sigue sin haberse cerrado. 10

private static void escribir(dataoutputstream f, Producto p) { try { // Escritura de los cuatro atributos de «p» escribir(f, p.nombre()); f.writeint(p.calidad()); f.writeboolean(p.esperecedero()); f.writeint(p.diasparacaducar()); catch (IOException ex) { // En caso de producirse un error, se informa de ello por // pantalla System.out.println("Error al escribir este producto: " + ex.getmessage()); Pre: «f»!= null y «f» no ha sido cerrado; «cadena»!= null Post: Ha escrito en «f» la longitud de «cadena», seguido de cada uno de los caracteres que la forman. El fichero «f» sigue sin haberse cerrado. private static void escribir(dataoutputstream f, String cadena) { try { // Escritura de la longitud de «cadena» f.writeint(cadena.length()); // Escritura de cada uno de los caracteres que forman «cadena» for (int i = 0; i < cadena.length(); i++) { f.writechar(cadena.charat(i)); catch (IOException ex) { // En caso de producirse un error, se informa de ello por // pantalla System.out.println("Error al escribir el nombre este producto: " + ex.getmessage()); 11