Hoja 8

Anuncio
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);
Descargar