Ejercicios selectos (estructuras de datos C++).

  1. Investigue cómo es que se representan los tipos de datos primitivos en una computadora. Es preciso que conozca cómo se representa un tipo de datos int por ejemplo, ¿cuátos bytes le son asignados a un entero? Los números de punto flotante (float y double por ejemplo), también tiene una representación particular dentro de una computadora basada en los conceptos de mantisa y exponente. Investigue dichos conceptos, así como la representación física (hardware) de los tipos de datos en una computadora convencional.
  2. Modifique el Ejemplo Racional para propiciar la excepción arithmetic_exception como se describe en la entrada referente a la Implementación del ADT racional. Asegúrese de probar el caso de error tanto para el constructor como para el método establece_denominador.
  3. Modifique el Ejemplo Racional para que permita leer datos (números racionales) desde la entrada estándar (teclado).
  4. Modifique el Ejemplo Racional para que, en lugar de acceder directamente a los atributos p y q de los objetos s y m (líneas 68-69 y 77-78 respectivamente), se acceda a ellos y se modifiquen sus valores a través del método de tipo set correspondiente.
  5. Con base en base a lo descrito en la entrada referente a la Implementación del ADT racional, modifique el Ejemplo Racional para que cambie la sentencia (línea 68): s.p = p * r.obten_denominador( ) + q * r.obten_numerador( ); por: s.p = this->p * r.obten_denominador( ) + this->q * r.obten_numerador( ); realice también lo correspondiente para las líneas 69, 77 y 78 respectivamente.
  6. El Ejemplo Racional implementa los operadores de adición (suma) y multiplicación (multiplica). Para que la implementación sea completa, implemente también los operadores aritméticos de sustracción (-) y división (/); utilice resta y divide respectivamente para los nombres de los métodos y ajústese a la especificación de las operaciones definidas en la sección Especificación del ADT racional de la entrada Tipos de datos abstractos (ADT).
  7. Además de lo desarrollado en el ejercicio anterior, piense en cómo mejorar la definición del ADT racional descrito en la entrada Implementación del ADT racional. Tome en cuenta, al menos, los siguientes aspectos:
    1. Comparación de igualdad: ¿cuándo se dice que dos números racionales son iguales? Ejemplo: 3 / 21 = 1 / 7.
    2. Simplificación: simplificar a su expresión mínima un número racional, ya sea como resultado de una operación, o simplemente como utilidad. Ejemplo: 3 / 21 => 1 / 7. Sugerencia: obtenga el MCD (Máximo Común Divisor) del numerador y denominador a través de un método privado para simplificar el racional a su expresión mínima.
    3. Cuando haga la representación en cadena del número racional (to_string), considere lo siguiente: ¿qué sucede si  el resultado de la simplificación es, por ejemplo 3 / 1?, ¿tendría sentido presentarlo así?, ¿qué sucede si  el resultado de una operación es 0 / 13 por ejemplo? Si el denominador es 1, sólo presente el numerador, por otro lado, si el numerador es cero, sólo presente éste valor para tener una mejor representación en cadena del objeto racional.
  8. Sean c1 y c2 dos números complejos definidos de la siguiente manera: c1 = (a + bi) y c2 = (c + di) donde a, b, c, d son números reales. Utilice las definiciones y operaciones siguientes para abstraer un ADT complejo y utilícelas para realizar una implementación de dicha entidad (como se hizo para el Ejemplo Racional). No olvide probar y demostrar el funcionamiento de su implementación del ADT complejo así como sus respectivas operaciones aritméticas:
    1. La suma de c1 y c2 se define como: c1 + c2 = (a + bi) + (c + di)  = (a + c) + (b + d)i.
    2. La resta de c1 y c2 se define como: c1 - c2 = (a + bi) - (c + di)  = (a - c) + (b - d)i.
    3. La multiplicación de c1 y c2 se define como: c1 * c2 = (a + bi) * (c + di)  = (ac - bd) + (ad + bc)i.
    4. La división es un poco más elaborada debido a que se racionaliza el denominador; es decir, se multiplica el numerador y el denominador por el conjugado del denominador. El conjugado de un número complejo se obtiene cambiando el signo de su componente imaginaria, es decir: si c = a + bi  es un número complejo, su conjugado está dado por  c¹ = a - bi, entonces: c1 / c2 = (a + bi) / (c + di)  = [(a + bi) * (c - di)] / [(c + di) * (c - di)] = [(ac + bd) + (bc - ad)i] / (c² + d²).
  9. Considere el Ejemplo Racional2, mismo que muestra el uso de la cláusula (palabra reservada) this e implementa algunas cambios respecto del Ejemplo Racional. Estudie y compare ambos ejemplos a fin de entender sus similitudes y diferencias. Tome en cuenta que, desde el punto de vista funcional (características, servicios y comportamiento de la clase) son exactamente iguales. No olvide probar su funcionamiento.
  10. En base a la explicación dada en la sección Clases autorreferidas de la entrada Abstracción de estructuras de datos, modifique el Ejemplo Nodo de tal forma que sobre cargue el constructor para que, en caso de crear un objeto sin argumentos: Nodo nodo( ); se construya un objeto como el mostrado en la figura: . Utilice cero para el atributo dato y asegúrese de probar el funcionamiento de su constructor.
  11. Diseñe y construya una clase (cuadratica) que permita instanciar (generar) objetos que representen una ecuación cuadrática de la forma ax^2 + bx + c, donde a, b y c son los coeficientes de la ecuación. Su clase deberá:
    1. Considerar el caso de intentar instanciar un objeto cuyo coeficiente a sea cero y proceder a crear y lanzar una excepción.
    2. Permitir el cálculo de las raíces reales cuando existan.
    3. Lanzar una excepción si las raíces no son reales.

No hay comentarios.:

Publicar un comentario