Programación 1 Tema III – Clase de problemas Diseño de algoritmos que trabajan con ficheros de acceso directo y de lectura y escritura 1 Sintaxis de un fichero binario que almacena una secuencia de NIF de ciudadanos <ficheroBinarioNif> ::= <número> { <unNif> } <número> ::= int <unNif> ::= Nif El valor de <numero> define el número de NIF almacenados en el fichero 2 Restricciones en el diseño de las funciones En los problemas que se plantean se debe trabajar exclusivamente con ficheros binarios de NIF, sin que se permita utilizar tablas o vectores de datos auxiliares de tipo Nif o de cualquier otro tipo para almacenar una secuencia de NIF. Para ello se deberá hacer uso de las posibilidades : • de acceso directo a los datos del fichero • de trabajo con un fichero en modo entrada (lectura) y salida (escritura) 3 Recordatorio de las funciones visibles del módulo nif que quizás convenga tener presentes en la resolución de alguno de los problemas que se van a plantear. • • • • • Nif crearNif (int dni, char letra); Nif crearNif (int dni); int dni (Nif unNif); char letra (Nif unNif); bool esValido (Nif unNif); 4 Problema 1º Diseñar el código de esta función. /* * Pre: [nombreFichero] es un fichero binario de NIF en el cual * es posible que haya algún NIF con la letra asociada * equivocada * Post: [nombreFichero] es un fichero binario de NIF que almacena * tantos NIFs como al inicio de la ejecución de la * función, con los mismos números de DNI, pero ahora la * letra de cada NIF es correcta * * Restricción importante sobre el diseño: En este problema no * se van a poder definir tablas o vectores auxiliares * para almacenar en ellos datos de tipo Nif */ void corregirNif (const char nombreFichero[]); 5 Problema 2º Diseñar el código de esta función. /* * Pre: [nombreFichero] es un fichero binario de NIF * Post: [nombreFichero] es un fichero binario de NIF que almacena * los mismos NIFs que al inicio de la ejecución de la * función, pero ahora están dispuestos en el fichero de * forma que cualquier NIF cuyo número de DNI sea par, * debe preceder a todos los NIF cuyo DNI sea impar * * Restricción importante sobre el diseño: En este problema no * se van a poder definir tablas o vectores auxiliares * para almacenar en ellos datos de tipo Nif */ void distribuirNifPorParidad (const char nombreFichero[]); 6 Problema 3º Diseñar el código de esta función. /* * Pre: [nombreFichero] es un fichero binario de NIF * Post: [nombreFichero] es un fichero binario de NIF que almacena * los mismos NIFs que al inicio de la ejecución de la * función, pero ahora están dispuestos en el fichero * de forma que la letra de cualquier NIF es igual o * anterior en el alfabeto que las de los NIF que le siguen * * Restricción importante sobre el diseño: En este problema no * se van a poder definir tablas o vectores auxiliares * para almacenar en ellos datos de tipo Nif */ void ordenarNifPorLetra (const char nombreFichero[]); 7 20