Fundamentos de Informática Hoja de Problemas 8 – Archivos (junto con todo lo visto durante el curso) Ejercicio 1 Escribir una función que reciba un valor entero y lo devuelva con las cifras al revés. Suponed que el valor siempre tiene 4 cifras. Por ejemplo, si recibe: 1234 devolverá 4321; si recibe 12 devolverá 2100. Ejercicio 2 Escribir un ejemplo de declaraciones con typedef y de definición de la variable var, para que las expresiones siguientes tengan sentido: var[3].num_notas = 7; var[5].nota[6] = 8.4; var[0].fecha.dia=16; Ejercicio 3 Como parte del mantenimiento de la aplicación de Personal de una gran compañía inmobiliaria te ha tocado el fichero de vendedores denominado comerciales.bin. Los registros, todos iguales, clasificados por orden alfabético de acuerdo con los apellidos del vendedor, contienen los siguientes campos: Nombre (20 caracteres máximo); Apellidos (40 caracteres máximo); DNI (10 caracteres); Edad (entero) Sexo (1 carácter) Antigüedad en la empresa (entero) Se pide: Escribir una función Baja_Vendedor ( ) que reciba el DNI del vendedor y lo elimine del fichero, siendo necesario reorganizar la información que existe a continuación hasta el final del fichero. La función devolverá un código de resultado de la operación ya que hay que contemplar la posibilidad de que se pretenda dar de baja un vendedor que no está en el fichero. Para poder probar el correcto funcionamiento de este programa, es necesario crearse el fichero comerciales.bin con otro programa que lo genere, ya que se trata de un fichero binario. Ejercicio 4 Escribe la función void InvertirCadena (char *cadena) que invierte el orden de los caracteres de la cadena especificada en el argumento y devuelve un puntero a la cadena resultante. Nota: no se puede utilizar una cadena auxiliar para invertir la cadena original. Ejercicio 5 Insertar un valor entero en un vector ordenado de menor a mayor, siempre que exista espacio suficiente, y modificando el tamaño real del vector si se ha insertado. El valor de retorno es: -2: si no caben más elementos -1: si ya estaba el elemento Posición de inserción, en caso de haberlo podido insertar. Fundamentos de Informática Ejercicio 6 Un programa en C tiene la función Procesar_Informacion() que se encarga de leer de un archivo binario llamado “reumaticos.bin” la información de los pacientes de un hospital. A medida que se va leyendo información de pacientes, se debe ir creando un fichero texto cuyo nombre es el parámetro formal nombre_archivo_salida en el que se va a guardar la información de los reumáticos que vivan en una dirección con el código postal 28015. La información que se va a guardar en el fichero texto de estos pacientes es únicamente su nombre y teléfono. Además, la función Procesar_Informacion() debe devolver la información de cuántos pacientes reumáticos con estas características ha encontrado y escrito en el fichero. #define N 30 typedef struct { char calle[N]; int numero; int piso; int codigo_postal; }direccion; typedef struct { char nombre[N]; direccion domicilio; int telefono; int reumático; /* 1 indica que sí es reumático y 0 que no */ }paciente; /* Guarda los datos de un paciente */ Realizar el código de la siguiente función: int Procesar_Informacion(char *nombre_archivo_salida); Ejercicio 7 Dada la siguiente definición de tipo de datos: typedef struct { char nombre[50]; float notas[5]; }T_Alumno; /* Guarda los datos de un alumno */ typedef struct { T_Alumno alumnos[100]; int n_alumnos; }T_Alumnos; /* Guarda los datos de todos los alumnos de una clase */ Escribir el cuerpo de la siguiente función: void insertar_alumno (T_Alumno alumno). Que reciba los datos de un alumno y lo añada al final del fichero binario “alumnos.bin”. Fundamentos de Informática Ejercicio 8 En un curso hay matriculados un número nat de alumnos. En dicho curso se imparten 3 asignaturas. Por tanto, de cada alumno se tiene la información de su nombre, número de teléfono y nota de cada una de las tres asignaturas y nota media de las tres asignaturas. Al comienzo del programa, será necesario solicitar al usuario el número de alumnos de la clase para asignar memoria dinámicamente a un vector que contendrá la información de todos los alumnos. Posteriormente, para rellenar la información se va a utilizar la función Leer_Info_Alumnos(). Esta función va a leer la información de los alumnos de un fichero texto cuyo nombre será solicitado al usuario. En el fichero por cada alumno existe información de: nombre de cada alumno, su número de teléfono y la nota de cada una de las asignaturas. Una vez leídas las notas de cada alumno, se calculará y rellenará el campo correspondiente a la media de las tres notas. La función debe devolver el índice del alumno cuya nota media es la mejor de la clase (¡no es necesario volver a recorrer el vector con la información de los alumnos para conseguirlo!). El prototipo de esta función es: void Leer_Info_Alumnos(alumno *vec_alu, int nat, int *mejor_alum); En el programa principal, se mostrará la información del alumno con la mejor nota media. A continuación, es necesario solicitar al usuario el número de la asignatura (1. Álgebra, 2. Cálculo, 3. Programación) de la que se desea obtener la lista de los alumnos que hayan superado una nota determinada (que también le será solicitada al usuario) y llamando a la función Obtener_Lista() obtenga una matriz de caracteres en la que se encuentre en cada fila el nombre de un alumno que haya superado esa nota. Además, devolverá el número de alumnos que han superado esa nota. La matriz en la que se han de guardar los nombres se puede crear estáticamente en el programa principal. El prototipo de la función es: int Obtener_Lista(alumno *vec_alu, int nat, char matriz[][N], float nota_a_superar, int num_nota); La función Mostrar() será la encargada de informar al usuario de cuántos alumnos han superado dicha nota y el nombre de todos ellos. El prototipo de la función será: void Mostrar(char matriz[][N], int num_mejores); Para almacenar los datos, se va a hacer una llamada a GuardarInformacion() que deberá almacenar en un fichero binario, cuyo nombre se solicitará al usuario, la información de todos los alumnos almacenada en el vector. Fundamentos de Informática Ejemplo de ejecución del programa: Introduzca el numero de alumnos: 4 Introduzca el nombre del fichero: prueba.txt El mejor alumno es Luisa Rodriguez con una nota media de 6.966667 Introduzca si quiere: 1. Algebra 2. Calculo 3. Programacion 2 Nota a superar: 4 Hay 3 buenos alumnos que son: Pepe Lopez Arturo Perez Luisa Rodríguez El fichero “prueba.txt” contiene: Pepe Lopez 912345677 4.5 6.7 8.9 Arturo Perez 947554367 1.23 4.56 3.4 Alberto Gonzalez 927654321 4.3 2.3 4.6 Luisa Rodriguez 938787886 5.6 7.5 7.8 Fundamentos de Informática Ejercicio 9 El Instituto Nacional de Meteorología ha encargado el diseño e implementación de un sistema para el control de un conjunto de estaciones meteorológicas repartidas a lo largo de la geografía de España. Cada estación meteorológica almacenará la información relativa a las temperaturas recogidas a lo largo de un mes (supondremos meses de 30 días). Las estructuras propuestas para dicho sistema son las siguientes: typedef struct { char nombre_estacion[50]; /* Almacena el nombre de la estación */ float temperaturas[30]; /* Temperaturas obtenidas a lo largo de un mes */ }T_estación; typedef struct { T_estacion lista_estac[100]; /* Almacena todas las estaciones en España */ int n_estaciones; /* Numero real de estaciones. Debe ser < 100 */ }T_estaciones; Se pide: a) Realizar una función crear_datos() que cree un archivo binario estaciones.dat y que almacene la información relativa a las estaciones y temperaturas a lo largo de un mes de todas las estaciones existentes en el territorio español. La función deberá solicitar al usuario el número de estaciones existentes antes de comenzar a introducir los datos. b) Realizar una función cargar_datos(T_estaciones *estaciones) que lea el fichero estaciones.dat y cargue los datos en memoria. c) Realizar una función float calculos(T_estaciones *estaciones) que muestre en pantalla las temperaturas máximas de cada una de las estaciones y que devuelva al programa principal la media de dichas temperaturas máximas. d) Completar la siguiente función void main(): void main (void) { T_estaciones estaciones; float media_máximas; ...................... /* Llamada a crear_datos() */ ...................... /* Llamada a cargar_datos() */ ...................... /* Llamada a calculos() */ ...................... /* Muestra la media de máximas */ } Fundamentos de Informática Ejercicio 10 (Examen Práctico Junio 08) Escribir un programa para leer un archivo de texto que contiene números de teléfono y nombres de personas, y escribir en otro archivo de texto los datos aquellas personas que viven en Barcelona. El alumno debe crear al archivo de texto "lista.txt" utilizando un editor de texto (como por ejemplo Inicio/Programas/Accesorios/Bloc de Notas). El archivo debe contener el número de teléfono (sin guiones ni espacios) y el nombre (una palabra) para cada persona. Ver ejemplo: 915236845 935432109 939876543 629458742 934567890 Fernando Juan Pepe Manuel Luisa Al principio del programa, este archivo debe leerse para almacenar toda la información en un vector de estructuras de tipo T_PERSONA. Dicho vector deberá crearse dinámicamente en función del tamaño del fichero. Por lo tanto 1- Debe leerse el archivo para contar el número de personas que contiene: int Contar(FILE *fp); 2- Asignar memoria dinámica 3- Leer el archivo para almacenar la información en el vector, mediante la función LeerArchivo() Una vez cargado el vector, llamar a la función Barcelona() en la cual debe inspeccionarse el vector, elemento por elemento, buscando las personas que viven en Barcelona, prefijo 93 (93XXXXXXX). Los datos de cada persona con número de teléfono de 9 dígitos que empiece por 93 se copiarán a un nuevo archivo de texto "barcelona.txt". Este fichero de salida debe contener una cabecera y la lista de números de teléfono y nombres, por ejemplo: Phone Name ===================== 935432109 Juan 939876543 Pepe 934567890 Luisa La función Barcelona() devolverá el número de personas guardadas en barcelona.txt, y el programa principal mostrará este valor al usuario. Fundamentos de Informática Ejercicio 11 (Examen Práctico Septiembre 08) Escribir un programa para leer un archivo binario productos.bin que contiene los productos de un almacén ordenados según el código del producto, de menor a mayor. De cada uno de los productos, se tiene almacenado su código de producto (valor de tipo entero), su precio (valor real), y el nombre del producto (cadena de caracteres de tamaño 25). El fichero productos.bin se encuentra disponible para el alumno en el directorio D:\examen, de manera que cada uno deberá copiarlo desde ese directorio a su directorio de trabajo (manteniendo una copia de seguridad del archivo original en D:\examen). El programa del alumno realizará las siguientes tareas: 1. Mediante la función MostraryContar() se debe leer el archivo de productos (productos.bin) mostrando por pantalla la información de cada uno de los producto que no se deben introducir en un vector. Además, la función debe ir contando el número de productos del archivo. El número de productos leídos debe mostrarse desde el programa principal. 2. Posteriormente, se solicitará al usuario desde el programa principal el código y precio de un nuevo producto a introducir en el archivo binario productos.bin y se llamará a la función Buscar() que es la encargada de buscar la posición en el archivo donde se debe introducir el nuevo producto (recordar que el archivo productos.bin está ordenado por código de producto de menor a mayor). El valor de retorno de Buscar() será: -1 en caso de que el producto ya se encontrara en el archivo productos.bin, y por lo tanto, no se deba introducir de nuevo. i, indicando que el nuevo producto se debe introducir en la posición i-ésima del archivo productos.bin. 3. Posteriormente, si se ha de introducir el nuevo producto, se llamará a la función InsertarProducto() que se encargará de insertar el nuevo producto en una posición determinada que se proporciona como argumento a la función. 4. Fin del programa Aclaración: Para insertar un registro en una posición determinada, será necesario copiar previamente los siguientes registros una posición más abajo. Ver figura: Puntuación: 2 puntos – Estructura general: cabeceras, includes, typeder, prototipos 3 puntos – Función MostraryContar() 2 puntos – Función Buscar() 3 puntos – Función InsertarProducto() Fundamentos de Informática Ejercicio 12 (Examen Práctico Septiembre 09) Se quiere disponer de un programa para eliminar un dato de una agenda de teléfonos que se encuentra almacenada en un archivo binario. La estructura T_AGENDA almacena los datos de una persona: typedef struct{ char nombre[30]; int telef; }T_AGENDA; El programa deberá realizar los siguientes pasos: Leer el archivo binario mediante la llamada a int o LeerContar LeerContar(void) devuelve el número de registros o -1 en caso de error Asignar memoria dinámica a un vector de estructuras, para poder almacenar toda la información de la agenda Leer todos los datos del fichero y almacenarlos en el vector dinámico, mediante la llamada a void LeerAlmacenar(T_AGENDA *vec, int n); Mostrar un menú con la lista de nombres para que el usuario pueda elegir qué registro quiere borrar (indicando el número de índice, comprobando que está dentro de rango). Borrar el registro del vector mediante la función void Borrar(T_AGENDA *vec, int n, int posicion_borrar) Rehacer el fichero binario mediante la función void Guardar(T_AGENDA *vec, int n);