Facultad de Ciencias Exactas, Ingeniería y Agrimensura Departamento de Sistemas e Informática Escuela de Electrónica Informática II Práctica Nº 4 – Entrada / Salida Problema 1: Escriba un programa que se invoque desde la línea de comandos con un argumento. Dicho argumento deberá ser numérico y validado convenientemente. El programa deberá pedir el ingreso de tantas cadenas de texto (Strings) como indique el citado argumento y luego listar por pantalla las mismas. Problema 2: (*) Diseñar una “base de datos” de los empleados de una compañía y un sistema que permita ingresar los datos por teclado, visualizarlos por pantalla, obtener el valor de los datos miembros y cambiar los mismos según los siguientes lineamientos: Crear un arreglo del tipo usado para representar a un empleado y llenarlo luego con los datos correspondientes a 10 empleados ingresados por teclado. Hacer un menú que tenga las siguientes opciones: a) Calcular el sueldo mínimo (del arreglo de empleados) y la cantidad de veces que ocurre dicho sueldo en el arreglo b) Dado un sueldo (que el usuario ingresará por teclado) retornar la primera ocurrencia del mismo en el arreglo (su índice) o en el caso de que ningún empleado del arreglo tenga un sueldo igual al ingresado, mostrar un -1 c) Calcular el sueldo promedio de los empleados, mostrar en pantalla este valor y los datos del empleado cuyo sueldo esté más cerca de este promedio d) Salir Problema 3: Grabar los empleados del ejercicio anterior en un archivo ingresando el nombre del mismo por teclado. Debe mostrarse en pantalla nombre y apellido de cada empleado a medida que se va grabando. Problema 4: Dada la siguiente clase abstracta: Informática II – Laboratorio: entrada/salida 1 abstract class Figura{ double area(); int esMenorQue(Figura obj); } a) Definir las clases Rectángulo, Círculo y Triángulo que extiendan Figura. Implementar en estas clases todos los métodos y variables necesarios para ello, siempre al nivel más alto posible de la jerarquía de clases. Es posible modificar la clase Figura, siempre que siga siendo abstracta. b) El método esMenorQue(Figura obj) permite ordenar Rectángulos, Círculos y Triángulos por su área. c) Definir una clase Test que tenga un método main() que realice lo siguiente: Permita que el usuario cree una cantidad arbitraria de objetos círculos, triángulos y rectángulos, solicitando la entrada por teclado de los valores necesarios para crear estas instancias. Muestre un mensaje por pantalla indicando cuál es la figura (tipo y área) de menor área. Problema 5: Escriba un programa que busque en un archivo de texto, la primera ocurrencia de un carácter particular e imprima por pantalla el número de línea y posición dentro de la misma de dicha ocurrencia. El programa debe tomar dos argumentos de la línea de comando, el primero de ellos es el nombre del archivo de texto y el segundo de ellos es el carácter buscado. El programa deberá mostrar por pantalla un mensaje de error en caso que se introduzca un número incorrecto de argumentos por línea de comando o si el segundo argumento es un String de longitud mayor a un carácter. Problema 6: Similar al problema anterior pero buscando ahora una cadena e indicando la cantidad de veces que esta cadena aparece en el archivo y las posición de cada ocurrencia. Problema 7: Hacer un programa que permita administrar los datos de aseguramiento de vehículos de una compañía de seguros. El programa debe permitir: Informática II – Laboratorio: entrada/salida 2 a) Dar de alta un asegurado, incluyendo nombre y apellido, número de póliza (debe ser único), fechas de vigencia de la póliza (inicio y final de la cobertura), tipo de póliza(terceros, todo riesgo, responsabilidad civil), tipo de vehículo (automóvil, camión, etc.), patente. b) Guardar en un archivo “polizas.dat” los datos c) Dado el número de póliza, recuperar del archivo el objeto que lo representa y mostrar sus datos en pantalla. Problema 8: Dado el siguiente programa, analizarlo, correrlo y realizar un programa para leer el archivo que produjo: import java.io.*; class prome { public static void main(String args[]) throws IOException { InputStream in=System.in; DataInputStream inputStream=new DataInputStream(in); DataOutputStream miarchivo = new DataOutputStream (new FileOutputStream("promedio.txt")); double promedio = 0.0; int numero1, numero2, numero3; System.out.println("Enter the first number:"); numero1 = Integer.valueOf(inputStream.readLine().trim()).intValue(); System.out.println("Enter the second number:"); numero2 = Integer.valueOf(inputStream.readLine().trim()).intValue(); System.out.println("Enter the third number:"); numero3 = Integer.valueOf(inputStream.readLine().trim()).intValue(); miarchivo.writeUTF("El promedio de "); miarchivo.writeInt(numero1); miarchivo.writeUTF(", "); miarchivo.writeInt(numero2); miarchivo.writeUTF(" y "); miarchivo.writeInt(numero3); miarchivo.writeUTF(" es "); promedio = (numero1 + numero2 + numero3) / 3; miarchivo.writeDouble(promedio); miarchivo.close(); String line=inputStream.readLine(); } Informática II – Laboratorio: entrada/salida 3 } Problema 9: Reescribir el programa anterior reemplazando los metodos obsoletos por actuales. ¿Porqué no deberían utilizarse estos métodos obsoletos? Problema 10: Se pretende crear una aplicación Java para procesar información acerca de una lista de libros. De cada libro interesa almacenar información acerca de su título y nombre del autor. a) Escriba una clase Libro que pueda ser usada para crear objetos que representen libros. La clase debe tener un constructor que tome dos argumentos de tipo String para inicializar el título y autor del libro. Debe incluir métodos de acceso y actualización para título y autor y un método toString() para mostrar información sobre el libro en forma textual. b) Escriba el código de una clase ListaLibros que use un array para almacenar una lista de objetos Libro. La clase debe tener un constructor que inicialice una lista de libros vacía, un método para añadir un nuevo objeto Libro a la lista y un método toString() que produzca información de la lista (cada libro debe listarse en una línea separada). Puede suponer que el número máximo de libros es 100. c) Se requiere poder leer información sobre libros que se encuentra en un archivo texto. En tal archivo cada libro está representado por dos líneas de texto, la primera donde figura el título y la segunda donde figura el autor del mismo. La primera línea del archivo contiene un entero que representa el número de libros listados en el archivo, por ejemplo: 2 Lord of the Rings Tolkien, J R R Java in a Nutshell Flanagan, David Escriba en la clase ListaLibros un método cargarDe() que tome como argumento un String que representa el nombre del archivo desde donde leerá datos de libros y los añadirá en ListaLibros. d) Escriba en la clase ListaLibros un métod grabarA(). Este método debe tomar como argumento un String que será el nombre de un archivo donde escribirá todos los datos de los libros de ListaLibros. El archivo tendrá el formato indicado más arriba. Informática II – Laboratorio: entrada/salida 4 Problema 11: Agregar un menú de opciones al ejercicio 5 de la práctica 2 con las siguientes opciones: - Seleccionar un ítem de CheckBox. Deseleccionar un ítem de CheckBox. Modificar la selección de RadioButton. Mostrar el estado actual de los Boxes. Salir Problema 12: Resolver el problema 10 haciendo que métodos grabarA() y cargarDe() trabajen ahora exclusivamente con las clases ObjectInputStream y ObjectOutputStream. Problema 13: Dadas las clases e interface a implementar suministradas, completarlas con lo MINIMO necesario a fin de darle funcionalidad, sin agregar ni cambiar propiedades (campos). Luego completar la clase "prueba" para leer el archivo "personas.dat" (que contiene 2 hombres y 2 mujeres como objetos), cargar los datos en un arreglo y luego mostrar en pantalla nombre, peso real y estado según la OMS de cada persona del arreglo. interface estado{ double peso_teorico(); double IMC(); String estado_segun_OMS(); } class persona { private String nombre; protected double estatura; protected double peso; persona(String nom, double altura, double p){ nombre=nom; estatura=altura; peso=p; } public double IMC(){return ... ;} public String nombre(){return nombre;} Informática II – Laboratorio: entrada/salida 5 ... } class mujer{ private int cantidad_de_hijos; mujer(String nom, double alto, double peso, int hijos){ ... } ... } class hombre{ boolean corpulento; ... } class prueba { public static void main (String [] z)throws IOException, ClassNotFoundException { … } } Debe tenerse en cuenta que: a) El peso teórico se calcula como: Mujeres: 50 kg para los primeros 1.5 m de altura más 2.5 kg por cada 2.5 cm adicionales, mas 0.65 Kg por un hijo ó 1.3 Kg por 2 hijos o mas. Hombres: 53 kg para los primeros 1.5 m de altura más 3 kg para cada 2.5 cm adicionales, mas 10% si el hombre es corpulento. b) El Indice de Masa Corporal (IMC) se calcula dividiendo los kilogramos de peso por el cuadrado de la estatura en metros y da origen a la siguiente clasificación acorde a la OMS: < 18,5: Peso Bajo (Indica delgadez, desnutricion o algún problema de salud) hasta 24,9 (hombres) o 23,9 (mujeres). Peso normal (Está catalogado como saludable) hasta 29.9 hombres ó 28.9 mujeres: Sobrepeso (u Obesidad leve) hasta 40 hombres ó 37 mujeres: Obesidad grado 2. > 40 hombres ó > 37 mujeres: Obesidad severa o grado 3. Nota: Para grabar archivos como el que debe leer este programa puede hacer otro programa utilizando el siguiente código (incompleto): ObjectOutputStream salida= new ObjectOutputStream(new FileOutputStream("personas.dat")); arreglo[0]= new hombre("Javier",1.75,83.0,false); arreglo[1]= new mujer("Marisa",1.80,72.0,0); Informática II – Laboratorio: entrada/salida 6 arreglo[2]= new hombre("Juan",1.70,92.0,false); arreglo[3]= new hombre("Pedro",1.95,110.0,true); for (int i=0;i<=3;i++) salida.writeObject(arreglo[i]); Problema 14: Escribir una clase que posea un método que muestre por pantalla los resultados de examinar un archivo que contiene objetos de diferentes clases, que cuente el número de objetos Integer que contiene el mismo y que ignore objetos de otras clases. Problema 15: En cada linea de un archivo de nombre “datos.txt” se encuentran los datos de una función evaluada en los puntos dados en forma de pares x;f(x). Por ejemplo: 0,25 ;12,0 0,45 ; 24,5 0,75 ; 30,0 1,05 ; 40,3 2,00 ; 55,0 3 ; 83,0 ... Leer el archivo y calcular el polinomio de interpolación de Lagrange evaluándolo en puntos ingresados por teclado. Informática II – Laboratorio: entrada/salida 7 Solución del problema 2: import java.io.*; class empleado { private String nombre; private int leg; private int edad; private int seccion; private float sueldo; private static int nro=100; empleado(){leg=nro++;} empleado(String n,int e,int sec, float s) { this(); nombre = n; edad = e; seccion = sec; sueldo = s; } void setNombre(String n){nombre=n;} void setedad(int e){edad=e;} void setseccion(int d){seccion=d;} void setsalario(float s){sueldo=s;} String devnombre(){return nombre;} int devedad(){return edad;} int devseccion(){return seccion;} int devleg(){return leg;} float devsueldo(){return sueldo;} public String toString(){ String d="\n NRO.LEGAJO: " + leg + "\nNOMBRE: " + nombre + "\nEDAD: " + edad; d += "\nSECCION:" + seccion + "\nSUELDO: " + sueldo; return d; } } class prueba_empleado { static String scanf() { BufferedReader d = new BufferedReader(new InputStreamReader (System.in)); try { return d.readLine(); } catch (Exception e){ return "error"; } } public static void main(String []args) { empleado e[]= new empleado [5]; for (int i=0; i<=4;i++){ System.out.println("\nIngrese nombre del empleado "); String nom=scanf(); System.out.println("\nIngrese edad del empleado "); String ed=scanf(); int edn=Integer.valueOf(ed).intValue(); Informática II – Laboratorio: entrada/salida 8 System.out.println("\nIngrese sección en la que trabaja "); String se=scanf(); int nse=Integer.valueOf(se).intValue(); System.out.println("\nIngrese sueldo del empleado "); String su=scanf(); float sl=Float.valueOf(su).floatValue(); e[i]=new empleado(nom, edn, nse, sl); } int opcion=0; while (opcion!=4) { // IMPRIME MENU DE OPCIONES System.out.println("\n1.- SUELDO MINIMO"); System.out.println("\n2.- BUSCAR"); System.out.println("\n3.- SUELDO PROMEDIO"); System.out.println("\n4.- SALIR"); String op=scanf(); opcion =Integer.valueOf(op).intValue(); int i; switch (opcion) { case 4:break; case 1: //BUSCA EL SUELDO MINIMO float smin; smin= e[0].devsueldo(); for(i=0;i<=4;i++) { if (e[i].devsueldo()<smin) smin=e[i].devsueldo(); } // CUENTA LA CANTIDAD DE SUELDOS MINIMOS int cant=0; for(i=0;i<=4;i++) { if (e[i].devsueldo()==smin) cant++; } // MUESTRA RESULTADOS System.out.println("\nEl sueldo mínimo es:"+ smin); System.out.println (" y se repite " + cant + "veces"); String x=scanf(); break; case 2: System.out.println("\nIngrese sueldo a buscar"); String su=scanf(); float sue=Float.valueOf(su).floatValue(); for(i=0; i<=4 && e[i].devsueldo()!= sue;i++); if (i==5) System.out.println("-1"); else System.out.println (i); break; case 3: float promedio=0; for (i=0;i<=4;i++) promedio += e[i].devsueldo(); promedio/=5; float dif,menordif=e[0].devsueldo(); int imenor=0; for (i=1;i<=4;i++) { Informática II – Laboratorio: entrada/salida 9 dif = Math.abs(e[i].devsueldo() - promedio); if (dif < menordif) { menordif = dif; imenor = i;} } System.out.println ("\nSueldo promedio: " + promedio); System.out.println ("\nEl empleado que difieremenos del promedio es: \n"); System.out.println(e[imenor]); // SE USA toString } // cierra el switch } //cierra el while } //cierra el main } // cierra la clase Informática II – Laboratorio: entrada/salida 10