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: (C++) 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: (*) (C++) 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 de objetos del tipo 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 Informática II – Práctica nº 4: E/S Pág. 1 Problema 3: (C++) Escribir un programa que lea desde un archivo matrices y escriba en otro las matrices transpuestas. El nombre del archivo de entrada y el de salida se especifican como argumentos por línea de comando, y el formato de los archivos es el siguiente: ************ elementos de la primera fila separados por espacio (carácter “ “) elementos de la segunda fila “ . . . elementos de la última fila “ ************ Un ejemplo: ************ 12 0.25 -10 87 1.2 3 128 -17 -6 12 57 42 -1 7 15 41 -5 -87 -0.2 6 65 -7 4 0 0 ************ Problema 4: (C++) Dada la siguiente clase abstracta: class Figura{ public: double area(); virtual int esMenorQue(Figura &obj) = 0; } a) Definir las clases Rectángulo, Círculo y Triángulo derivadas de Figura. Implementar en estas clases todos las funciones y variables necesarias 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) La función miembro esMenorQue(Figura &obj) permite ordenar Rectángulos, Círculos y Triángulos por su área. c) Crear un programa 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. Informática II – Práctica nº 4: E/S Pág. 2 Muestre un mensaje por pantalla indicando cuál es la figura (tipo y área) de menor área. Problema 5: (C++) 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 una cadena de longitud mayor a un carácter. Problema 6: (C++) 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: (C++) Escribir un programa que muestre la siguiente pantalla, tome la entrada que tipea el usuario, la valide -es decir, que introduzca cadenas de caracteres en los nombres y números en las edades, por ejemplo- y luego guarde la pantalla completa en un archivo llamado pantalla.txt. El programa debe hacerse en dos versiones: a) Utilizando printf() y scanf() exclusivamente b) Utilizando “>>” y “<<” exclusivamente Datos del Ingresante --------------------------Apellido: Fecha de nacimiento: Localidad: País: Fecha de Ingreso: Edad: Legajo: Nombres: Dirección: Provincia: Nacionalidad: Carrera: DNI: Problema 8: (C++) Informática II – Práctica nº 4: E/S Pág. 3 Dado el siguiente programa, analizarlo, correrlo y realizar un programa para leer el archivo que produjo, y muestre por pantalla los tres números ingresados: #include <iostream> #include <fstream> using namespace std; void main(){ double promedio = 0.0; int numero1, numero2, numero3; ofstream miArchivo; miArchivo.open("promedio.txt"); cout << "Ingrese el primer número: "; cin >> numero1; cout << "Ingrese el segundo número: "; cin >> numero2; cout << "Ingrese el tercer número: "; cin >> numero3; miArchivo << "El promedio de "; miArchivo << numero1 << ", "; miArchivo << numero2 << " y "; miArchivo << numero3 <<" es: "; promedio = (numero1 + numero2 + numero3) / 3; miArchivo << promedio; miArchivo.close(); } Problema 9: (C++) Un archivo de texto contiene datos de personas con su fecha de nacimiento en el siguiente formato: Pérez, Juan 04/05/1987 Galeano, Ignacio Ramón 12/08/1999 ... Hacer un programa que liste por pantalla los nombre y su edad exacta (Años-mesesdías) Informática II – Práctica nº 4: E/S Pág. 4 Problema 10: (C++) Crear una aplicación 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 char* para inicializar el título y autor del libro. Debe incluir funciones de acceso y actualización para título y autor y una función 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, una función para añadir un nuevo objeto Libro a la lista y una función toString() que produzca información textual 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 de 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 Rayuela Cortázar, Julio Ficciones Borges, Jorge luis Escriba en la clase ListaLibros una función cargarDe() que tome como argumento una cadena que representa el nombre del archivo desde donde leerá datos de libros y los añadirá en ListaLibros. d) Escriba en la clase ListaLibros una función grabarA(). Esta función debe tomar como argumento una cadena 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, y los datos deben agregarse a los ya existentes en el archivo. e) Si el archivo tiene ahora el formato siguiente, ¿qué y cómo debería cambiar en su programa? 2 Rayuela:Cortázar, Julio Informática II – Práctica nº 4: E/S Pág. 5 Ficciones:Borges, Jorge luis Problema 11: (C++) Analice que sucede si en el programa del ejercicio 8 se suplanta la línea miArchivo.open("promedio.txt"); por esta: miArchivo.open("promedio.txt", ios::binary); Problema 12: (C++) Modifique el problema 10 creando agregando a la clase ListaLibros una función miembro que permita obtener los datos de un Libro específico dado su título, con la siguiente forma: Libro * ListaLibros::buscarLibro(char *nombre_archivo, char * titulo) Problema 13: (C++) Dadas las siguientes definiciones de clases, escribir la implementación con lo MINIMO necesario a fin de darle funcionalidad, sin agregar ni cambiar propiedades. Luego escribir un "main()" para leer el archivo "personas.dat", que contiene los datos de dos hombres y dos mujeres, cargar los datos en un arreglo y mostrar en pantalla nombre, peso real y estado según la OMS de cada persona del arreglo. Para resolver el problema, tener 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 c) La clasificación según IMC acorde a la OMS: Informática II – Práctica nº 4: E/S Pág. 6 < 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. Código: class Persona { public: Persona(void); ~Persona(void); Persona(char *nom, double altura, double p); char * nombre(); double peso_teorico(); double IMC(); char * estado_segun_OMS(); private: char []nombre; double estatura; double peso; //... }; class Mujer : public Persona { public: Mujer(void); ~Mujer(void); Mujer( char *nom, double altura, double p, int num_hijos); private: int nroHijos; }; class Hombre : public Persona { public: Hombre(void); ~Hombre(void); Hombre(char *nom, double altura, double p, bool corpu); Informática II – Práctica nº 4: E/S Pág. 7 private: bool corpulento; }; Problema 14: (C++) 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 – Práctica nº 4: E/S Pág. 8