




















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Exámenes desde 2004 a 2015 Junio y Sepriembre
Tipo: Exámenes
1 / 28
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!





















void descomposicion (int n, int * factores, int& num_factores)
Por ejemplo, para calcular la descomposici´on factorial de 360 (360 = 2^3 × 32 × 5) se har´a:
int v[100]; // 100 es un valor suficientemente grande int n; ... n = 0; descomposicion (360, v, n);
y el resultado ser´a:
n = 6 v = {2,2,2,3,3,5,?,...}
class Matriz { double * datos; int filas, columnas; public: Matriz(); Matriz(const Matriz & m); Matriz & operator = (const Matriz & m); void Set (int f, int c, double d); double Get (int f, int c) const; int Leer (const char * nombre); int Escribir (const char * nombre) const; };
a) (2 puntos) Escribir la implementaci´on del operador de asignaci´on. b) (2 puntos) Un objeto Matriz se almacena en un fichero, de forma que la primera l´ınea contiene el n´umero de filas y columnas (n,separador,m,salto de l´ınea), seguida de los los n ∗ m valores de la matriz, almacenados por filas y en binario. Escribir la implementaci´on de la funci´on “Leer”, teniendo en cuenta que devuelve un cero en caso de ´exito y un valor distinto de cero en caso de error. c) (2 puntos) Para cada elemento aij de la matriz, se define su residuo rij como:
rij = dIJ + aij − dIj − diJ donde dIJ =
∑m j=
∑n i=1 aij n∗m dIj^ =
∑n i=1 aij n diJ^ =
∑m j=1 aij m
Se define el residuo de la matriz como rIJ =
∑m j=
∑n i=1 ‖rij^ ‖ n∗m. Escribir un programa, que usando la clase Matriz, lea una matriz desde un fichero y muestre en la salida est´andar el resultado del c´alculo del residuo de la matriz.
a) (0.5 puntos) Insertar los valores 365, 275, 364, 272, 352. b) (1 puntos) A partir del ´arbol resultado anterior, borrar los valores 860, 810 y 600.
indicando cada uno de los pasos que se han seguido. 395510
260
113 310355
60 150220270 350 360370
450
427 470
400 435 456 491
710
600
590 610660760
810
860910
Duraci´on del examen: 2 horas y media.
class Conjunto { int * elementos; // No repetidos, desordenados int n; // N´umero de elementos public: ... };
a) (1 puntos) Implementar el constructor de copias. b) (1.5 puntos) Implementar el operador de asignaci´on. c) (1.5 puntos) Implementar una funci´on insertar que reciba un entero, lo inserte en el conjunto, y devuelva si ha tenido ´exito (si el conjunto ha crecido).
class Polinomio { float * coef; // Pos i: Coeficiente grado i int MaxGrado; // Indica el tama~no de coef public: ... };
a) (1 puntos) Sobrecargar el operador << para la salida de un polinomio a un flujo. b) (1.5 puntos) Sobrecargar el operador >> para la entrada de un polinomio desde un flujo. c) (1.5 puntos) Escriba el archivo cabecera que contiene la declaraci´on de la clase Polinomio, incluyendo las cabeceras de las dos funciones anteriores. No es necesario escribir las funciones p´ublicas que no se han mostrado aqu´ı (ind´ıquelas, igualmente, con los 3 puntos suspensivos).
Entero Entero Caracteres (var.) 100 caracteres Posici´on inicio marca Longitud de la marca Marca Descripci´on
y un ejemplo de contenido de este archivo es:
0 2 P5 Imagen PGM 0 2 P6 Imagen PPM 10 8 DAT Cien Datos cient´ıficos
donde podemos ver que si un archivo tiene la cadena “DAT Cien” (de 8 caracteres) a partir de la posici´on 10 del archivo, se trata de un archivo de datos cient´ıficos.
a) (1.5 puntos) Escriba una funci´on (Insertar) que recibe el nombre de un archivo de descripciones, junto con una nueva entrada (posici´on, cadena y descripci´on), y tiene como efecto que se a˜nade la entrada a dicho archivo (cre´andolo si es necesario). b) (1.5 puntos) Implementar una funci´on (TipoArchivo) que determine el tipo de un fichero. La funci´on recibe el nombre de este archivo junto con el nombre del archivo con las descripciones. Como resultado devuelve una cadena con la descripci´on asociada, o “Tipo desconocido” si no se ha localizado su tipo. La cabecera de la funci´on deber´a ser:
string tipo_fichero(string nombre_fichero, string nombre_descripcion) donde nombre fichero es el nombre del fichero de datos y nombre descripciones es el del fichero que propor- ciona la informaci´on para su reconocimiento. c) (1.5 puntos) Escribir un programa que, usando la funci´on del apartado anterior, reciba en la l´ınea de comandos el nombre de un archivo y escriba en la salida est´andar la descripci´on del archivo. Tenga en cuenta los posibles casos de error.
Duraci´on del examen: 2 horas y media.
void Reglar (double izq, double der, int min, int max, int n)
que dibuja las marcas de una regla. Los par´ametros corresponden a:
izq,der: posiciones horizontales donde dibujar las marcas. min,max: La altura de la marca m´as peque˜na y la m´as grande. n: n´umero de marcas de cada altura.
Por ejemplo, si llamamos Reglar(1,17,1,3,3) genera el siguiente dibujo:
10 11 12 13 14 15 16 17
1
2
3
1 2 3 4 5 6 7 8 9 Observe que el dibujo consiste en realizar tres marcas de altura m´axima en el intervalo [izq,der] (lo divide en 4 partes) y dibujar una nueva regla con marcas desde altura 2 a 1 en cada uno de los 4 subintervalos. Para realizar el ejercicio, suponga que dispone de la siguiente funci´on:
void DibujarMarca (double posicion, int altura);
que dibuja una l´ınea vertical de una determinada altura en una posici´on. Por ejemplo, la l´ınea central del ejemplo anterior se ha dibujado con la llamada DibujarMarca(9,3).
struct Celda { int elemento; Celda *sig; }; class Conjunto { Celda * lista; // No repetidos, desordenados public: ... };
a) (1 punto) Implemente el constructor por defecto y destructor. b) (1 punto) Implemente el constructor de copias. c) (1 punto) Sobrecargue el operador de asignaci´on. d ) (1 punto) Sobrecargue el operador “+” para realizar la uni´on de dos conjuntos.
a) La primera l´ınea contiene la cadena m´agica CJTMP2 seguida por un salto de l´ınea. b) Opcionalmente, puede haber una l´ınea que contiene un car´acter ’#’ seguido por una secuencia de hasta 100 caracteres que finalizan en un salto de l´ınea. c) Una l´ınea que contiene un n´umero entero (N) indicando el n´umero de elementos del conjunto seguido por un salto de l´ınea. d ) Una l´ınea que contiene N n´umeros enteros separados por espacios, y que corresponden a los elementos que contiene el conjunto.
Implemente las funciones miembro “Leer” y “Escribir” para la lectura y escritura de un conjunto en disco. Las funciones reciben como entrada el nombre de un fichero en disco y devuelven un c´odigo entero indicando si ha habido errores.
Duraci´on del examen: 2 horas y media.
Examen de teor´ıa. 29 Junio 2006.
Donde puede observar que la estructura de datos
0 1 2 c−
0 1 2 c−
0 1 2 c−
0
1
f−
Imag consiste en una lista de f celdas enlazadas en las que se almacenan vectores de c elementos (valores de 0 a 255) para cada una de las filas. Donde f es el n´umero de filas y c el n´umero de columnas. Existe una celda por cada fila, de forma que toda la estructura cuelga de un ´unico puntero (Imag), que podr´ıa ser cero en caso de que la imagen est´e vac´ıa. La ´ultima celda contiene un cero en el campo que corresponde al puntero siguiente.
a) (0.75 punto) Implemente el constructor por defecto (crea una imagen vac´ıa) y el destructor. b) (0.75 punto) Implemente el constructor de copias. c) (1 punto) Sobrecargue el operador de asignaci´on. d ) (1 punto) Implemente dos funciones Set y Get que permitan modificar y acceder al contenido de una posici´on de la imagen, respectivamente. Las cabeceras deben ser: void Imagen::Set(int f, int c, unsigned char dato); unsigned char Imagen::Get(int f, int c) const; e) (1 punto) Sobrecargue los operadores == y != para poder comprobar la igualdad de dos im´agenes.
= 255 = 128 = 0 = punto de partida
Situación inicial Situación final
3 3.1 0.0 2. 5 1.0 1.0 1.0 1.0 1. 2 5.2 4.
donde puede observar que cada l´ınea contiene un valor entero seguido por tantos elementos como indique ´este. Escriba un programa que obtenga en la salida est´andar los valores que corresponden a la sumatoria de cada fila. Por ejemplo, en el caso anterior, deber´a obtener los valores 5.2, 5 y 9.9. La forma de lanzar el programa desde la l´ınea de ´ordenes debe permitir:
a) Llamarlo sin ning´un argumento. Los datos con las sumas a realizar se leer´an desde la entrada est´andar. b) Llamarlo con un argumento. El argumento corresponde al nombre del archivo con los datos a sumar.
a) (0.75 punto) Un programa que transforme un fichero de texto a binario. b) (0.75 punto) Un programa que transforme un fichero de binario a texto.
Para ello, los programas recibir´an, en la l´ınea de ´ordenes, dos argumentos con los nombres del fichero de entrada y salida respectivamente. Tenga en cuenta que un fichero en formato binario contiene todos los datos de forma consecutiva de la siguiente forma.
.........
Finalmente, no olvide que debe optimizar el uso de recursos, y por tanto, no se permiten soluciones en las que se tenga, por ejemplo, todo el fichero en memoria.
Duraci´on del examen: 3 horas.
Universidad de Granada
Computación e I. A. Apellidos: Nombre: DNI:
1.- (1.5 puntos) Se desea construir una aplicación en la que se necesitan los siguientes módulos:
a) Escribe los #include necesarios en cada fichero ( hazlo en este mismo folio ).
b) Crea el fichero Makefile para compilar cada uno de los módulos descritos así como para crear un programa ejecutable (main) a partir de ellos.
c) Numera cada una de las reglas que has escrito en tu fichero Makefile y responde a las siguientes preguntas. Tras haber generado todo el proyecto ejecutando make (sin errores), considera que modificamos el contenido de algunos ficheros del proyecto. Di, en cada caso, y de manera independiente, qué reglas se aplicarán (escribe la lista con los números de las reglas que se aplican al lado de cada fichero) tras modificar:
● fecha.cpp
● profesor.h
● profesor.cpp
alumno.h #ifndef ALUMNO__H #define ALUMNO__H
class Alumno { private: Fecha fnacimiento; ... }; #endif
alumno.cpp
// Implementación del módulo ...
fecha.h #ifndef FECHA__H #define FECHA__H
class Fecha { ... }; #endif
fecha.cpp
// Implementación del módulo ...
profesor.h #ifndef PROFESOR__H #define PROFESOR__H
class Profesor { private: Fecha fnacimiento; ... }; #endif
profesor.cpp
// Implementación del módulo ...
vectoralumno.h #ifndef VECTORALUMNO__H #define VECTORALUMNO__H
class VectorAlumno { private: Alumno *dat; ... }; #endif
vectoralumno.cpp
// Implementación del módulo ...
main.cpp
// Se usan todas las clases int main(int argc, char *argv[]) { ... }
2.- (3.5 puntos) Suponga que tenemos la siguiente clase para almacenar una serie de alumnos en forma de lista enlazada simple:
struct Nodo { Alumno a; // Información del alumno almacenado en el nodo Nodo *sig; // Puntero al nodo siguiente de la lista }; class ListaAlumno { private: Nodo *primero; // Comienzo de la lista (0 si está vacía) int num; // Número de nodos de la lista public: ListaAlumno(); ListaAlumno(const ListaAlumno &orig); ListaAlumno & operator=(const ListaAlumno &orig); ~ListaAlumno(); Alumno Get(int pos) const; // Devuelve el alumno pos-ésimo de la lista void Set(int pos, const Alumno &alu); // Modifica el alumno pos-ésimo de la // lista (NO inserta nuevos nodos) };
Implemente los métodos indicados en la parte pública de la clase. Si lo necesita, puede implementar nuevos métodos privados en la clase. Tenga en cuenta que la clase Alumno ya dispone de métodos tales como constructor por defecto, constructor de copia, operator= y destructor.
3.- (1.5 puntos) Necesitamos sobrecargar dos operadores (<< y +) para realizar dos tareas adicionales con objetos de la clase ListaAlumno:
4.- (1.5 puntos) Implementa una función recursiva que reciba un número entero en base 10 y lo escriba por consola en una base N cualquiera (2≤N≤16).
5.- (2 puntos) Disponemos de un fichero que almacena múltiples listas de números enteros. Cada lista consiste en un valor N seguido de N valores enteros (que son los elementos de la lista). El formato del fichero binario que las almacena es el siguiente:
K N1 N2 ... N_K
Por ejemplo, las siguientes listas: (2,5,4), (8,9), (6,5,7,4,5,2) se almacenarían como: 3 3 2 5 4 2 8 9 6 6 5 7 4 5 2
Observa que el número subrayado es el número de listas y los números en negrita indican el número de elementos de cada lista. En el fichero no se almacenan separadores de ningún tipo (espacios, retornos de línea, etc.).
Escribe un programa que reciba por la línea de órdenes un nombre de fichero y un número entero N. Este programa debe abrir el fichero (que tiene el formato explicado) y mostrar la lista N-ésima de números (la numeración comienza en 1) en consola (cout). Además, si el programa recibe un tercer parámetro, lo interpretará como que el usuario desea escribir el resultado en ese fichero en lugar de en cout. En ambos casos la salida es con formato (texto ASCII).
Por ejemplo, si el programa se llama mostrar y los datos están almacenados en un fichero llamado datos.bin , la siguiente ejecución muestra en cout la segunda lista: > mostrar datos.bin 2 2 8 9
Examen de teoría. 16 de Junio de 2008
struct Celda{ char pieza; Celda *sig; }; class Tablero{ char **tablero;//situación del tablero Celda *perdidas;//colección de piezas perdidas, tanto blancas como negras bool turnoblancas;//true si le corresponde jugar a las blancas, false si le corresponde jugar a las negras. .... };
La posición inicial gura (A) se codica como caracteres según la gura (B):
(a) (1 punto) Implemente el constructor por defecto (inicializa el tablero según la gura anterior) y el destructor.
(b) (1.5 puntos) Implemente el constructor de copia y el operador de asignación.
(c) (1 punto) Supongamos que tenemos implementada la función bool Tablero::EsPosible (char co, int fo,char cd,int fd)const, que devuelve true si es posible mover la pieza en posición co-fo a cd-fd (haya o no captura de una pieza contraria) y false en caso contrario. Implemente la función: bool Tablero::Mover(char co, int fo,char cd,int fd) que dado un movimiento, lo realiza en caso de que sea posible, y devuelve si se ha podido realizar con éxito. NOTA: Observe que se pueden modicar todos los campos de la clase. Recuerde que la función EsPosible está implementada.
(d) (1 punto) Sobrecargue el operador + tal que dado un Tablero y una cadena de caracteres, devuelva un nuevo tablero con el resultado del movimiento correspondiente o el mismo tablero en caso de error. La cadena de caracteres debe contener cuatro caracteres que indican la posición origen y nal del movimiento. Por ejemplo, a1d4 codica el movimiento desde la posición de la casilla a1 a la d4. NOTA: Se pueden usar las funciones de los apartados anteriores.
pantalla los movimientos que puede hacer el caballo para comerse al peón. Los movimientos posibles del caballo se pueden ver en la imagen (A). Así, se puede observar que, suponiendo que el caballo está en la casilla d5, éste puede moverse a las casillas c3, b4, b6, c7, e7, f6, f4 y e3.
(A) (B) (C)
En la gura (B) se puede observar un caballo en la posición c5 y un peón en la posición f7. Una posible secuencia de movimientos para alcanzar el caballo al peón sería f7-e5-d7-c5 ( en sentido inverso, es decir c5-d7-e5-f7) como se muestra en la gura (C). La función a implementar tiene como cabecera:
bool Movimientos(char **tablero,char columC,int filaC,char columP,int filaP)
donde:
La función devuelve true si ha encontrado el camino (además de imprimir en la salida estándar el camino) o false en caso contrario.
un ujo. Tenga en cuenta que el formato será el siguiente:
tcarvact pppvvppp vvvvvvvv vvvvPvvv vvvvpvvv vvvvvvvv PPPvvPPP TCAvRACT DdPp 1
El chero siempre comienza por esta cadena
El estado del tablero en 8 líneas independientes
Lista de piezas perdidas Turno. 1:blancas 0:negras
de una partida, y la reproduzca en la salida estándar. El programa leerá los movimientos y, para cada uno, mostrará el estado del tablero después de realizarlo. El programa acaba cuando no hay más movimientos o alguno de ellos no es válido. La llamada será:
reproducir
NOTA: Para resolverlo puede usar las funciones que aparecen en las preguntas anteriores.
Duración del examen: 2 horas y 30 minutos
Examen de teor´ıa. 22 Junio 2009.
a) Un n´umero entero que indica la nueva base. Considere que los caracteres a usar para las bases superiores a 10 son las letras ’A’,’B’,etc. Podemos suponer que el n´umero no va a ser superior a 16, es decir, tendremos suficientes letras para representar cualquier d´ıgito en la nueva base. b) El n´umero entero a transformar, que est´a escrito en base 10.
Para resolverlo, deber´a crear una funci´on recursiva para que obtenga en una cadena de caracteres (terminada en ’\0’) la nueva representaci´on. El programa escribir´a en la salida est´andar en resultado obtenido en esta cadena.
class Menu { char *titulo; // Encabezado que damos al men´u (0 si men´u vac´ıo) char **opc; // Cadenas que describen cada una de las opciones (0 si men´u vac´ıo) int nopc; // N´umero de opciones actualmente en el men´u (0 si men´u vac´ıo) public: ... };
a) (1.5 puntos) Escriba la implementaci´on de las funciones miembro correspondientes al constructor por defecto (crea un men´u vac´ıo), destructor, constructor de copias y operador de asignaci´on. b) Escriba tres funciones: (0.25 puntos) SetTitulo que asigne un nuevo valor al t´ıtulo. (0.25 puntos) GetNumeroOpciones que devuelva el n´umero de opciones que hay actualmente en el men´u. (0.75 puntos) Sobrecargue el operador ’+’ de forma que se pueda a˜nadir una nueva opci´on. Esta funci´on devolver´a, dado un men´u y una cadena de caracteres, un nuevo men´u que tiene las mismas opciones que el de entrada, m´as una nueva situada despu´es de la ´ultima. c) (0.5 puntos) Sobrecargue el operador << para que podamos imprimir el men´u. Un ejemplo de llamada podr´ıa ser cout<> para que podamos cargar un men´u desde un flujo de entrada. Un ejemplo de llamada ser´a cin>>menu, que provoca la lectura del men´u desde la entrada est´andar. Tenga en cuenta que el men´u se dar´a como una l´ınea del t´ıtulo, seguida por una l´ınea con el n´umero de opciones, y finalizando con tantas l´ıneas como indique dicho n´umero (una para cada opci´on). e) (0.5 puntos) Escriba el fichero de cabecera (menu.h) correspondiente a la clase Menu. Para ello, incluya todas las funciones que hayan aparecido en los apartados anteriores.
3 3.1 0.0 2. 5 1.0 1.0 1.0 1.0 1. 2 5.2 4.
donde puede observar que cada l´ınea contiene un valor entero seguido por tantos elementos como indique ´este. Escriba un programa que obtenga en la salida est´andar los valores que corresponden a la sumatoria de cada fila. Por ejemplo, en el caso anterior, deber´a obtener los valores 5.2, 5 y 9.9. La forma de lanzar el programa desde la l´ınea de ´ordenes debe permitir:
a) Llamarlo sin ning´un argumento. Los datos con las sumas a realizar se leer´an desde la entrada est´andar. b) Llamarlo con un argumento. El argumento corresponde al nombre del archivo con los datos a sumar.
a) (0.75 punto) Un programa que transforme un fichero de texto a binario. b) (0.75 punto) Un programa que transforme un fichero de binario a texto.
Para ello, los programas recibir´an, en la l´ınea de ´ordenes, dos argumentos con los nombres del fichero de entrada y salida respectivamente. Tenga en cuenta que un fichero en formato binario contiene todos los datos de forma consecutiva de la siguiente forma.
.........
Finalmente, no olvide que debe optimizar el uso de recursos, y por tanto, no se permiten soluciones en las que se tenga, por ejemplo, todo el fichero en memoria.
Duraci´on del examen: 2 horas y 30 minutos.
1. Suponer la clase Inventario con la siguiente representación:
struct Libro { Class Inventario { char* Titulo; int NumLibros; char* Autor; Libro* Libros; char* Editorial; }; char* ISBN; int NumPags; float PrecioCompra; float PrecioVenta; char** observaciones; } que mantiene los libros de un negocio de compra-venta de libros usados.
a) ( 0.5 punto ) Implemente el constructor por defecto y el destructor. b) ( 1.5 puntos ) Implemente el constructor de copia y el operador de asignación.
2. Diariamente se carga la colección en memoria desde un fichero al inicio de la jornada y se guarda la colección en un fichero al finalizar la jornada. Implemente los métodos:
a) ( 1.5 puntos ) bool LeeInventario (const char* fichero); b) ( 1.5 puntos ) bool GuardaInventario (const char* fichero) const;
Ambos métodos devuelven true si la lectura y escritura, respectivamente, se realizan correctamente. En el fichero (de texto), los datos de cada libro se almacenan de forma consecutiva en el orden que se enumera en la pregunta 1 (un dato por línea, excepto las observaciones). En cuanto a las observaciones, su número es ilimitado (incluso puede no haberlas), aunque cada una de ellas tendrá un límite de 100 caracteres. Al finalizar un bloque con los datos de cada libro se encuentra una línea con cinco caracteres '*'.
3. ( 1 punto ) Sobrecargar el operador + para que, dado un inventario y un dato de tipo
Libro devuelva un nuevo inventario, resultado de añadir el libro al inventario.
4. ( 1.5 puntos ) Sobrecargar el operador - para que, dado un inventario y el nombre de un fichero -que contiene datos de de libros y que tiene el formato comentado anteriormente- devuelva un nuevo inventario, resultante de eliminar los libros cuyos datos están almacenados en el fichero (bastará con comprobar que el ISBN coincide). 5. ( 2.5 puntos ) El método de bisección usado para calcular el punto de corte de una función con el eje de abscisas se puede enunciar como sigue:
Sea f(x) una función real, estrictamente monótona en [ i,d ], donde f(i) y f(d) tienen distinto signo.
Implemente una función recursiva que reciba como datos de entrada los extremos del intervalo y que devuelva la raíz de la función. Se supone que se dispone de la función f(x) ya implementada en C++.
Universidad de Granada
Computación e I. A.
1.- (3.5 puntos) Deseamos crear un software que nos ayude a gestionar un parking de vehículos. Para ello debemos implementar los siguientes módulos:
struct Fecha { unsigned char dia, mes; unsigned short int anyo; unsigned char hor, min, seg; };
class Coche { private: char * matricula; Fecha hora_entrada; };
class Parking { private: Coche *coc; int ncoches; int nplazas; };
En la clase Parking, ncoches contiene el número de coches que hay en el interior del parking (inicialmente cero). El atributo nplazas indica el número de plazas libres que hay en el parking.
Debes implementar los siguientes métodos básicos:
partir de una matrícula (char*) y una hora de llegada al parking (Fecha).
dándole el número de plazas totales del parking.
2.- (1.25 puntos) Cuando llega un nuevo coche al parking, una cámara reconoce su matrícula y, a continuación, se procede a su registro. Para ello debes implementar el siguiente método:
bool Parking::EntraCoche(const char * matricula, const Fecha &horaentrada);
Dicho método debe almacenar los datos del nuevo coche en el objeto de tipo Parking siempre y cuando haya plazas disponibles. Si la operación ha tenido éxito devolverá true y si no (por ejemplo, en el caso de que no haya plazas) devolverá false.
3.- (1.25 puntos) Al salir un coche del Parking, debemos calcular el tiempo que ha pasado dentro y borrarlo de nuestro listado. Para ello debes implementar el siguiente método:
int Parking::SalirCoche(const char * matricula, const Fecha &horasalida);
Este método tiene como dato de entrada la matrícula del coche que abandona el parking (que ha sido reconocida mediante una cámara) y la hora y devuelve un entero que se corresponde con el número de segundos que ha estado en el interior del parking. Si la matrícula no ha sido reconocida o si existe algún tipo de error, el método devolverá un número negativo.
Nota: Puedes suponer que ya disponemos de una función que recibe como parámetros dos fechas y devuelve la diferencia en segundos.
4.- (2.5 puntos) El software necesita hacer copias de seguridad periódicas del estado del parking. También necesitamos un método que permita restaurar los datos del parking desde una copia de seguridad. Implementa los siguientes métodos:
Los datos se almacenan en un fichero binario. Dicho fichero comienza con dos enteros que indican el número de coches y el número de plazas. A continuación se almacenan (también en binario) los datos de cada uno de los coches. Observa que la matrícula es un dato de longitud variable.
5.- (1.5 puntos) Implementa una función que permita calcular el termino n-ésimo de la serie de los números de Catalán de acuerdo a la siguiente expresión recursiva:
{
Nota: Los primeros términos de la serie, desde el 0-ésimo, son 1, 1, 2, 5, 14, 42, 132, ...
Examen de teor´ıa. Grado en Ingenier´ıa Inform´atica. Julio 2011.
int NumMaxElems; // N´um. de casillas reservadas en v int NumOcupados; // N´um. de casillas ocupadas int * v; // Acceso a los datos
de manera que mediante v se accede a los datos almacenados en el vector din´amico. Construir el m´etodo privado:
bool redimensionar (int nuevotam);
que cambia el n´umero de casillas reservadas (NumMaxElems) al valor dado por nuevotam. El nuevo tama˜no puede ser mayor o menor que el que ten´ıa, y el vector debe conservar todos los elementos que sean posibles al cambiar el tama˜no. Devuelve un valor booleano indicando si se han conservado todos los elementos “ocupados”.
El c´odigo que declara la estructura de datos, as´ı como un ejemplo con 5 elementos son:
elementos primero nelems
1.0 4
siguiente
3.0 −
elem siguiente
2.0 3
elem siguiente
7.0 1
elem siguiente
5.0 2
elem elem siguiente
<1.0, 5.0, 2.0, 7.0, 3.0>
Representa la lista (en orden):
struct dato { float elem; int siguiente }; class Lista { private: dato *elementos; int primero; int nelems; public: ....... ....... };
donde el campo elem es el elemento de cada posici´on de una lista de float, y siguiente es el ´ındice en el vector elementos donde se encuentra el siguiente elemento de la lista (-1 si no hay m´as elementos). Para este nuevo tipo de dato que almacena listas de elementos float, implemente los siguientes m´etodos:
a) (1 punto) El constructor de copia. b) (1 punto) El operador de asignaci´on. c) (1.5 puntos) El operador l´ogico de igualdad ==. Dos listas son iguales si tienen el mismo n´umero de elementos y ´estos est´an dispuestos en el mismo orden l´ogico (esto es, si al recorrerlas se obtiene la misma secuencia de valores). d ) (1 punto) Un m´etodo que recibe un nombre de archivo (a trav´es de un par´ametro de tipo cadena estilo C) y almacena la Lista en dicho fichero y en formato binario. El fichero est´a compuesto por un int que corresponde al n´umero de elementos de la lista (sea n este n´umero), seguido de otro int que indica el ´ındice en el vector del primer elemento de la lista, y seguido finalmente por una secuencia de n parejas float-int. e) (1.5 puntos) Un m´etodo que, dado el nombre de un archivo con el formato indicado en el punto anterior, cargue el contenido de la lista almacenada en dicho fichero.
busca examen fich1 fich2 fich
busca la palabra examen en los ficheros fich1, fich2 y fich3. Cada vez que encuentre la cadena buscada, debe indicar el fichero en el que se ha localizado, el n´umero de l´ınea, y la l´ınea completa que la contiene. Un ejemplo de salida de este programa es:
fich1 (l´ınea 33): El examen ha sido f´acil fich3 (l´ınea 2): ya te dije ayer que hoy era el examen fich3 (l´ınea 242): finalmente, el examen tiene tres preguntas
Las restricciones que se imponen, y que se deben cumplir en la resoluci´on son:
a) El n´umero de ficheros que se pueden proporcionar es ilimitado. b) Cada uno de los ficheros s´olo puede ser le´ıdo una ´unica vez, y no pueden copiarse completos en memoria. c) Se desconoce a priori el n´umero de l´ıneas de los ficheros. d ) Las l´ıneas de los ficheros tienen una longitud indeterminada, aunque nunca mayor de 500.
Duraci´on del examen: 3 horas.
Convocatoria de Junio. Curso 2011/
15 de Junio de 2012
Para poder gestionar figuras planas en una aplicaci´on de gr´aficos 2D deseamos crear una estructura de datos capaz de representar adecuadamente esas figuras. La estructura escogida ser´a la de una l´ınea poligonal construida en base a una serie de puntos. Dispondremos de las clases Punto y PoliLinea
A continuaci´on mostramos la declaraci´on de ambas clases (s´olo la representaci´on interna) y un ejemplo de un punto en las coordenadas (3, −2) y de una polil´ınea definida por los puntos (− 4 , 2), (− 2 , −2), (1, −3), (2, 4) y (− 1 , 3)
Y
X
int x, y; // Coordenadas de un punto 2D
class Punto {
.... };
*class PoliLinea { Punto p; // Vector de puntos int num; // Número de puntos .... };
a) (0.5 punto) El constructor sin par´ametros (crea una l´ınea poligonal vac´ıa) y el destructor. b) (1.5 puntos) El constructor de copia y el operador de asignaci´on. c) (1 puntos) El operador de acceso [], que permite acceder (tanto para lectura como para escritura) a un dato de tipo Punto en una PoliLinea d ) (2 puntos) Los operadores l´ogicos de igualdad == y desigualdad !=. Dos datos PoliLinea son iguales si tienen el mismo n´umero de puntos, ´estos son iguales y est´an dispuestos en el mismo orden o en orden inverso (en definitiva, son iguales cuando al representarse gr´aficamente se obtiene la misma figura). e) (2 puntos) Sobrecargar el operador + para poder a˜nadir un punto a una l´ınea poligonal de manera que podamos ejecutar operaciones de la forma:
Si fuera preciso implementar alg´un m´etodo para la clase Punto, deber´a hacerlo. Escribir el c´odigo correctamente modularizado en ficheros .cpp y .h.
POLILINEA
N X1 Y X2 Y X3 Y ... Xn Yn
El fichero siempre comienza por la cadena POLILINEA El comentario es opcional y, en caso de estar: Comienza por el carácter # Sólo ocupa una línea No hay límite de caracteres N es el número de puntos que tiene la polilínea Despues de N tenemos la lista de coordenadas de cada punto Cada punto se escribe en una nueva línea y las coordenadas están separadas por un espacio
a) (2 puntos) Implementar un m´etodo para cargar en memoria una PoliLinea desde un fichero: void LeerPolilinea (const char *nombre); b) (1 puntos) Implementar un m´etodo para escribir en un fichero una PoliLinea: void EscribirPolilinea (const char *nombre, const char *comentario=0);
Duraci´on del examen: 2 horas y media.
Convocatoria de Septiembre. Curso 2011/
11 de Septiembre de 2012
Considere el tipo de dato Matriz, dise˜nado para almacenar una estructura bidimensional de elementos double, con la siguiente representaci´on:
5.0 6.2 1. 1.4 3. 1.0 2.3 3.2 4.7 5. 1.6 5.
0
class Matriz { int nfilas; // Número de filas de la matriz (ejemplo: 4) int *ncolumnas; // Número de columnas de cada fila (ejemplo: 3,2,5,2) double **datos; // Datos de la matriz public: ....... };
1 2 3
0 1 2 3 4
Observe que este tipo de dato difiere de las matrices 2D cl´asicas en que el n´umero de columnas puede ser distinto para cada fila. Para este tipo de dato, implemente los siguientes m´etodos de la clase:
MP
4
Cadena mágica: Dos caracteres seguidos por un separador (salto de línea) OPCIONAL: Comienza por el carácter '#', hasta salto de línea Un entero en texto con el número de filas, seguido por un separador Número de columnas más datos en binario (consulte detalles a continuación)
3 5.0 6.2 1.1 2 1.4 3.2 5 1.0 2.3 3.2 4.7 5.0 2 1.6 5.
double
int int int int
double double double
Contenido Binario
Observe que despu´es de las tres primeras l´ıneas de texto (dos si no hay comentario), aparece una lista de n´umeros en binario. Corresponde a las filas, desde la primera a la ´ultima, cada una con un int -que indica el n´umero de columnas- seguido de los correspondientes datos double.
Duraci´on del examen: 2 horas.