PEL- Tema 1
![]() |
![]() |
![]() |
Título del Test:![]() PEL- Tema 1 Descripción: Estructuras lineales |




Comentarios |
---|
NO HAY REGISTROS |
¿Cuál de las siguientes afirmaciones describe mejor un Tipo Abstracto de Datos (TAD)?. Es una estructura de datos implementada en lenguaje ensamblador. Es un conjunto de valores y las operaciones que pueden realizarse sobre ellos, definidos mediante una interfaz pública. Es una clase de C++ que tiene únicamente atributos públicos. Es una colección de algoritmos aplicables a datos primitivos. ¿Qué parte del TAD contiene únicamente el prototipo y comportamiento esperado de sus operaciones, sin mostrar la implementación?. La clase constructora. La sección privada. La interfaz pública. El método main(). En la especificación algebraica de un TAD, ¿qué representan los "axiomas"?. Las variables globales. Los métodos públicos del TAD. Las condiciones semánticas que deben cumplirse para validar las operaciones. Las operaciones que el TAD hereda de su clase base. ¿Cuál de las siguientes operaciones pertenece a la especificación algebraica del TAD booleano según el documento?. xor: Boolean x Boolean → Boolean. if: Boolean x Value → Value. not: Boolean → Boolean. cast: Integer → Boolean. En el TAD de números complejos, ¿qué devuelve la operación norm(init(re, im))?. sqrt(re^2 + im^2). re + im. re^2 + im^2. abs(re - im). ¿Qué propiedad cumple la operación operator+ en el TAD complejo cuando suma dos números complejos?. Conserva únicamente la parte real del segundo operando. Suma real con imaginaria cruzadas. Suma componente a componente: real con real, imaginaria con imaginaria. Realiza la suma en base 2. ¿Cuál de estas NO es una ventaja directa del uso de TAD según el documento?. Modularidad. Legibilidad del código. Encapsulación. Aumento del tamaño del programa. ¿Qué afirmación es verdadera respecto a los atributos en una clase C++ que implementa un TAD?. Deben ser públicos para maximizar su reutilización. Deben ser privados, especialmente si la clase no es de tipo POD. Se deben declarar en main(). Deben declararse como static siempre que sea posible. ¿Qué característica distingue a las clases en C++ respecto a las estructuras (struct)?. Las estructuras no pueden tener métodos. Las clases no pueden usar herencia. Las clases tienen miembros privados por defecto, a diferencia de las estructuras. Las estructuras tienen métodos virtuales por defecto. En el ejemplo de la clase Rectangle, ¿qué hace la función area()?. Suma la base y la altura. Devuelve la multiplicación de width() y height(). Establece nuevos valores para los atributos. Calcula el perímetro del rectángulo. ¿Qué representa esta notación algebraica en la especificación de un TAD? operator*: Complex x Complex → Complex. Multiplicación cruzada de reales e imaginarios. Definición de una operación binaria sobre números complejos. Inicialización automática de dos objetos Complex. Conversión implícita entre Complex y Real. ¿Cuál de las siguientes ecuaciones describe correctamente una propiedad de conmutatividad en la especificación algebraica?. init(a) = a. suma(a, b) = suma(b, a). not(not(p)) = p. a * (b + c) = a * b + a * c. ¿Cuál es el resultado de esta expresión según la especificación algebraica del TAD booleano? not(not(TRUE)). TRUE. FALSE. init(TRUE). Sintácticamente inválido. ¿Qué devuelve esta función en el ejemplo del PDF, si el rectángulo fue creado como Rectangle rect{3.0, 2.0};? std::cout << rect.area() << '\n';. 5.0. 6.0. 1.5. Error de compilación. ¿Cuál de las siguientes afirmaciones es correcta respecto a la visibilidad de miembros en C++?. Las funciones miembro siempre son privadas. Las variables declaradas en struct son privadas por defecto. En class, los miembros son privados por defecto. C++ no permite definir funciones miembro públicas. ¿Qué ocurre si un atributo de una clase no-POD se declara como público?. Mejora el rendimiento del programa. Se considera una buena práctica para la reutilización. Es un signo habitual de mal diseño. No hay diferencia si se usa en main(). ¿Cuál es la principal razón para usar clases en C++ como mecanismo de TAD?. Permite crear variables globales con facilidad. Facilita el uso de arrays dinámicos. Proporciona encapsulamiento y ocultación de información. Permite compilar sin necesidad de usar objetos. ¿Qué significa modularidad en el contexto de los TAD?. Crear una clase que contenga múltiples funcionalidades distintas. Repetir código para facilitar su mantenimiento. Dividir el programa en módulos independientes con alta cohesión y bajo acoplamiento. Es una forma de compactar todo el código en un único archivo. ¿Cuál es el resultado de esta operación según los axiomas del TAD booleano? TRUE and not(TRUE). TRUE. FALSE. not(FALSE). Error de tipo. ¿Cuál de las siguientes sentencias es verdadera sobre el constructor de la clase Rectangle según el PDF? Rectangle(double width, double height) : w_{width}, h_{height} { }. No permite inicializar los atributos. Es obligatorio invocarlo desde main() con punteros. Utiliza inicialización de lista de miembros para w_ y h_. Utiliza setters internos para asignar valores a w_ y h_. ¿Cuál es el propósito principal de usar TAD genéricos en C++?. Reducir el uso de punteros en estructuras. Evitar la herencia múltiple. Reutilizar código para múltiples tipos de datos con una única implementación. Implementar estructuras de datos en tiempo de ejecución. Dado el siguiente código, ¿qué representan T y N? template<typename T, int N> class Array { T matrix_[N]; // ... };. T es un objeto instanciado y N es su dirección. T es el tipo de dato almacenado, N es el tamaño del array. T y N son operadores que se evalúan en tiempo de ejecución. T representa una función y N una plantilla. ¿Cuál es la ventaja de una función plantilla como esta? template <typename T> T const& max(const T& a, const T& b) { return (a < b)? b : a; }. Solo puede ser utilizada con tipos primitivos. Obliga al usuario a especificar el tipo al llamar. Reduce duplicación de código y se adapta a múltiples tipos comparables. No puede usarse con objetos de clases personalizadas. ¿Qué valor mostrará el siguiente código? Array<int,4> m1; for (int i = 0; i < m1.size(); ++i) m1.at(i) = i + 1; std::cout << "Front: " << m1.front() << " Back: " << m1.back();. Front: 0 Back: 3. Front: 1 Back: 4. Front: 4 Back: 1. Error de compilación. ¿Qué ocurre si se intenta instanciar Array<T,N> sin proporcionar T o N?. El compilador asigna tipos por defecto. El código compila pero la ejecución falla. El compilador genera un error en tiempo de compilación. Se genera una especialización parcial. ¿Qué condición deben cumplir los tipos utilizados como argumento de max() en la plantilla vista en el documento?. Deben ser derivados de int. Deben sobrecargar el operador ==. Deben ser comparables mediante <. No pueden ser tipos primitivos. En el siguiente fragmento, ¿por qué se usa const en T const&? template <typename T> T const& max(const T& a, const T& b). Para que la función devuelva siempre una copia. Para evitar modificaciones y mejorar eficiencia evitando copias. Para evitar la compilación cruzada. Porque es obligatorio en plantillas. ¿Qué afirmación es correcta respecto al fichero pel_array.hpp?. Es obligatorio que contenga solo funciones inline. Debe contener únicamente las clases completas sin funciones. Contiene la declaración y definición de la clase plantilla Array<T,N>. Solo se usa para plantillas de funciones, no de clases. ¿Cuál es el resultado de esta llamada a empty() si N == 0? Array<double, 0> arr; std::cout << std::boolalpha << arr.empty();. false. true. Error en tiempo de ejecución. El valor depende de los datos internos. ¿Cuál es el papel del operador de ámbito :: en definiciones como esta? template<typename T, int N> T& Array<T,N>::at(int idx) { return matrix_[idx]; }. Establece visibilidad pública. Permite que at acceda a funciones estáticas. Indica que at pertenece a la plantilla Array<T,N>. Solo se usa con clases internas. ¿Qué ocurre si se intenta acceder a un método miembro fuera de la plantilla sin utilizar el operador :: y sin repetir los parámetros plantilla?. El código compila pero produce resultados inesperados. El compilador asume los tipos automáticamente. Se produce un error de compilación por ambigüedad. El método se transforma en static. ¿Qué tipo de especialización genera el compilador para la siguiente instancia? Array<float, 5> myArray;. Una instancia temporal de tipo float[5]. Una versión estática y fija de la clase plantilla para T ≡ float y N ≡ 5. Una subclase genérica con casting implícito. No se genera especialización, usa el genérico directamente. ¿Por qué no es viable cambiar el valor de N en Array<T,N> en tiempo de ejecución?. Porque N es una constante static. Porque N es parte del nombre del tipo y se define en tiempo de compilación. Porque T debe ser una clase concreta. Porque el compilador requiere instancias dinámicas. ¿Cuál de las siguientes funciones NO requiere uso explícito de plantillas en su definición externa?. Funciones no miembro. Métodos de clase plantilla definidos dentro de la clase. Métodos definidos en un .cpp. Métodos definidos con casting. ¿Qué diferencia fundamental hay entre declarar una clase plantilla y una función plantilla en C++?. Las funciones no permiten deducción de tipo. Las clases no pueden tener múltiples parámetros. Las funciones permiten deducción automática del tipo. Las clases deben usar herencia para ser plantillas. ¿Qué línea del siguiente código sería responsable de provocar un error si N se define como 0? Array<int, 0> arr; arr.at(0) = 42;. La creación de arr. La asignación de 42. La llamada a at(0). La definición del array en la plantilla. ¿Cuál es el propósito de incluir plantillas en ficheros .hpp en lugar de .cpp?. Para aprovechar la compilación cruzada. Porque las plantillas requieren que su definición esté disponible al compilar el código que las usa. Para que se compilen como bibliotecas compartidas. Porque los .cpp no soportan plantillas. ¿Qué ventaja ofrece Array<T,N> frente a un array tradicional T myArray[N]?. Permite herencia múltiple. Oculta el tipo de los datos. Ofrece una interfaz segura con control de acceso, como front() y at(). Permite definir arrays infinitos. ¿Qué imprime este código? Array<double, 7> m2; m2.at(3) = 8.97; m2.at(4) = 1.03; std::cout << m2.at(3) + m2.at(4);. 9.90. 10.0. 0.0. Error de compilación. ¿Qué afirmación es falsa sobre las plantillas en C++?. Pueden tener múltiples parámetros de tipo. Pueden tener parámetros no tipo (como enteros). Los tipos plantilla pueden deducirse automáticamente en funciones. Una clase plantilla puede ser instanciada en tiempo de ejecución. ¿Qué ocurre si se intenta ejecutar este código? Complex z{3.0, 2.0}; z.re_ = 1.0;. El código funciona sin errores. Se produce un error en tiempo de ejecución. El compilador lanza un error porque re_ es un atributo privado. re_ se inicializa a cero automáticamente. ¿Cuál es la función del guion bajo (_) al final del nombre de atributos como re_ o im_?. Indicar que son constantes. Señalar que son parámetros de entrada. Distinguir atributos privados de variables locales. Hacer que el compilador ignore su visibilidad. ¿Qué valor tendrá c al ejecutar este código? Complex p{5.0, 3.0}; Complex c = p.conj();. (5,3). (5,-3). (-5,3). Error de compilación. ¿Por qué se declaran versiones const y no-const de las funciones real() e imag()?. Para soportar múltiples plataformas. Para poder ser llamadas por objetos const y no-const. Porque el compilador exige ambas versiones. Para reducir el uso de memoria. ¿Qué ocurre si se ejecuta esta línea? Complex const q{2.0, 4.0}; q.imag() = 7.0;. Modifica el atributo im_ con éxito. Da error en tiempo de ejecución. Da error en compilación por intentar modificar un objeto constante. Compila pero no produce efecto. ¿Qué hace exactamente esta línea de código en la clase plantilla genérica? static_assert(std::is_floating_point<T>::value, "Value type must be float, double, or long double");. Verifica si T es un número entero. Impide el uso de int como tipo base. Obliga a que T sea float, double o long double en tiempo de compilación. Genera una excepción en tiempo de ejecución si T no es un número. ¿Cuál es el propósito de que las funciones miembro como operator+= devuelvan *this por referencia?. Ahorrar memoria. Permitir acceder a miembros privados desde fuera. Soportar encadenamiento de operaciones como a += b += c. Reutilizar funciones internas como conj(). ¿Por qué los operadores +, -, * se definen fuera de la clase Complex?. Para reducir el tamaño de la clase. Para que el primer operando no tenga que ser del tipo Complex. Porque los operadores externos son más eficientes. Por compatibilidad con librerías externas. ¿Qué imprime este código? Complex<double> x{2,3}, y{1,4}; x *= y; y += x; std::cout << x.real() << " " << x.imag() << " - " << y.real() << " " << y.imag();. -10 11 - -9 15. -9 15 - -10 11. 1 7 - 3 8. Error en compilación. ¿Qué función cumple este operador externo sobrecargado? template<typename T> bool operator==(Complex<T> const& x, T const& t). Comprueba si la parte real de x coincide con t. Compara x con un número complejo con parte real t y parte imaginaria 0. Convierte x en tipo T y compara. Lanza una excepción si x.imag() no es 0. ¿Qué ventaja ofrece el uso de auto en la implementación de operadores como operator+? template<typename T> Complex<T> operator+(Complex<T> const& x, Complex<T> const& y) { auto r = x; r += y; return r; }. Reduce el número de líneas del código. Permite al compilador deducir el tipo correcto sin ambigüedad. Hace que r sea un puntero. Es obligatorio al usar plantillas. ¿Cuál de las siguientes afirmaciones sobre operator+= es cierta?. Solo puede operar entre dos números complejos. No puede usarse en funciones miembro. Puede sobrecargarse para admitir tanto complejos como escalares. Solo funciona con referencias constantes. ¿Qué condiciones deben cumplirse para que a += b += c; sea válido en la clase Complex<T>?. Que += devuelva una referencia constante. Que += devuelva una copia del objeto. Que += devuelva *this por referencia. Que += se sobrecargue con punteros. ¿Cuál es el resultado de este código? Complex<double> a{1.0, 2.0}; auto b = a + 3.0; std::cout << b.real() << " " << b.imag();. 3.0 2.0. 4.0 2.0. 1.0 5.0. Error de compilación. ¿Cuál es el propósito de definir operator!= además de operator==?. Evitar que el compilador genere una versión por defecto incorrecta. Permitir operaciones matemáticas con punteros. Permitir comparaciones en tiempo de ejecución. Hacer más rápido el programa. ¿Qué ventaja tiene definir operadores aritméticos como funciones inline externas a la clase plantilla?. Permite modificar atributos privados. Evita la necesidad de template. Hace el código más legible en archivos .cpp. Permite que el primer operando sea un escalar o un objeto Complex<T> indistintamente. ¿Qué ocurriría si se elimina el static_assert de esta plantilla? template<typename T> class Complex { static_assert(std::is_floating_point<T>::value, "..."); // ... };. Nada cambia, el código seguirá restringido. Se podrá instanciar Complex<char> o Complex<int> sin error. Se produce un error de tiempo de ejecución. Solo se permite usar tipos const. ¿Cuál de las siguientes líneas provoca un error y por qué? Complex<long double> x{-6.0L, 5.0L}; Complex<char> y{'r', 's'};. Ambas son válidas. Solo la primera es válida; la segunda falla porque char no es flotante. La segunda es válida porque los valores se convierten a double. Ninguna compila, long double no está soportado. ¿Qué garantiza esta línea dentro de operator==? return x.real() == y.real() && x.imag() == y.imag();. Que los complejos comparados tengan la misma memoria. Que los atributos sean apuntadores. Que los valores de x e y sean equivalentes matemáticamente. Que ambos objetos compartan la misma instancia de clase. ¿Qué imprime este código? Complex<double> x{1.0, 2.0}, y{3.0, -4.0}; std::cout << std::boolalpha << (x == y) << " " << (x != y);. true true. false false. true false. false true. |