You are on page 1of 3

Práctica 1: Programación modular en C

Programación Avanzada - Ingenierı́as Informáticas - UJI - Curso 2004/05

Duración: 3 sesiones

Observaciones: Los ejercicios propuestos en esta práctica te servirán de base para realizar el resto
de prácticas del curso. En la práctica 2A convertirás tus módulos C en clases C++. En la práctica 2B
convertirás las funciones en operadores. En las prácticas 3A y 3B implementarás nuevas clases haciendo
uso de la herencia y verás la utilidad de la ligadura dinámica. En la práctica 4A de nuevo trabajarás
con colas, pero esta vez aplicando los conceptos del tema de genericidad. En la práctica 4B resolverás
de nuevo uno de los ejercicios haciendo uso de la STL.
Si lo deseas, puedes realizar los ejercicios de esta práctica en lenguaje “C enriquecido” (C++
sin clases, utilizando los conceptos introducidos en el Tema 1 del curso). En todos los ejercicios
debes separar tu solución en varios ficheros tal como se indica. Por cada uno de los módulos que
implementes tendrás un fichero con extensión .h que contendrá las estructuras de datos y prototipos de
funciones que necesiten conocer los usuarios del módulo, y un fichero con extensión .c1 que contendrá la
implementación de dichas funciones (y posiblemente otras estructuras de datos y funciones auxiliares
que creas convenientes).
Ejercicio 1 Implementa en C un módulo Complejo que permita representar y trabajar con números
complejos. Escribe las funciones necesarias para que el siguiente programa funcione correctamente:
#include <stdio.h>
#include "Complejo.h"

int main () {
Complejo c1, c2, c3, c4;

c1 = ConstruyeComplejo (2.5, 7);


c2 = ConstruyeComplejo (10, -20);

c3 = SumaComplejos (c1, c2);


printf ("El resultado de la suma es: ");
VerComplejo (c3);

c4 = MultiplicaComplejos (c1, c2);


printf ("El resultado de la multiplicacion es: ");
VerComplejo (c4);
return 0;
}
Te recordamos cómo realizar la suma y la multiplicación de dos números complejos:

(a + bi) + (c + di) = (a + c) + (b + d)i


(a + bi) · (c + di) = (ac − bd) + (ad + bc)i

Ficheros que debes generar: Complejo.h y Complejo.c


1
Si decides realizar tus programas en C++, deberás usar las extensiones .cpp, .c++ o .cc en lugar de .c. Además,
para compilar deberás usar el programa g++ y no gcc.

1
Ejercicio 2 Implementa en C un módulo Polinomio que permita representar y trabajar con polinomios
de una variable con coeficientes reales:

P (x) = a0 + a1 · x + a2 · x2 + . . . + an · xn

El módulo debe contener la estructura de datos necesaria para guardar tanto el grado del polinomio,
n, como sus coeficientes a0 , a1 , . . . , an . Los coeficientes del polinomio se guardarán en un vector de
dimensión n + 1, estando el coeficiente ai en la posición i-ésima del vector. La memoria necesaria para
el vector se debe reservar dinámicamente cuando se conozca el grado del polinomio a guardar. El vector
debe guardar también los coeficientes nulos del polinomio.
Tu implementación debe ofrecer las funciones necesarias para que el siguiente programa funcione
correctamente:

#include <stdio.h>
#include "Polinomio.h"

int main () {
Polinomio p1, p2, p3;
float x;

printf ("Introduzca los datos del primer polinomio:\n");


LeerPolinomio(&p1);

printf ("Introduzca los datos del segundo polinomio:\n");


LeerPolinomio(&p2);

p3 = SumarPolinomios (p1, p2);

printf ("El resultado de la suma de ambos polinomios es: ");


VerPolinomio (p3);

printf ("Introduzca un valor real: ");


scanf ("%f", &x);

printf ("El valor del polinomio suma en x=%g es %g\n",


x, EvaluarPolinomio(p3, x));

LiberarPolinomio(&p1);
LiberarPolinomio(&p2);
LiberarPolinomio(&p3);

return 0;
}

Debes tener en cuenta que al sumar dos polinomios del mismo grado el resultado puede ser de grado
menor. Por ejemplo, la suma de P (x) = 5,5 + 7,7x + 3,3x2 + 4,4x3 y Q(x) = 5,5 − 7,7x − 3,3x2 − 4,4x3 ,
que son ambos de grado 3, produce R(x) = 11, que es de grado 0. El tamaño del vector utilizado para
guardar los coeficientes del polinomio resultante debe ser siempre igual al grado de dicho polinomio más
1. Si el resultado fuese R(x) = 0, represéntalo como un polinomio de grado 0 con un único coeficiente
que vale 0.

Ficheros que debes generar: Polinomio.h y Polinomio.c

2
Ejercicio 3 Como parte de un programa que gestiona una cola de aviones en un aeropuerto, debes
implementar en C las estructuras de datos y funciones necesarias para que el siguiente programa
funcione correctamente:

#include <stdio.h>

#include "Angulo.h"
#include "Coordenadas.h"
#include "ColaAviones.h"

int main () {
Angulo longitud, latitud;
Coordenadas destino;
ColaAviones cola;

longitud = ConstruyeAngulo (20, 20, 5, ’N’);


latitud = ConstruyeAngulo (45, 30, 2, ’E’);
// grados, minutos, segundos, orientacion
destino = ConstruyeCoordenadas(longitud, latitud);

ConstruirColaAvionesVacia(&cola);
InsertarAvion (&cola, "AZ19B2", destino);
InsertarAvion (&cola, "BT3533P8", destino);
ExtraerSiguienteAvion(&cola);
ExtraerSiguienteAvion(&cola);
ExtraerSiguienteAvion(&cola);
LiberarColaAviones(&cola);
return 0;
}

De cada avión que se inserta en cola de espera se guarda una cadena alfanumérica que lo identifica
y las coordenadas de su destino. Las coordenadas del destino están formadas por dos ángulos (longitud
y latitud) y cada ángulo tiene 4 componentes: grados, minutos, segundos y orientación, pudiendo haber
4 orientaciones posibles, Norte, Sur, Este y Oeste.
La cola de aviones se debe implementar como una lista enlazada, reservándose y liberándose
dinámicamente la memoria de los nodos de la lista. Cada nodo de la lista debe tener un
puntero al siguiente nodo de la lista y un campo de información de tipo Avion. La función
ExtraerSiguienteAvion a su vez debe llamar a otras dos funciones: (i) MostrarSiguienteAvion,
que muestre en la pantalla todos los datos del siguiente avión que debe despegar y (ii)
EliminarSiguienteAvion, que lo elimine de la cola de espera. Todas estas funciones deben ejecutarse
en tiempo O(1). Debes implementar también cualquier función adicional de la que hagas uso.
El resultado que debe obtenerse en la salida estándar al ejecutarse la función main anterior debe
ser el siguiente:

Identificador: AZ19B2
Destino: longitud = 20o 20’5’’N, latitud = 45o 30’2’’E

Identificador: BT3533P8
Destino: longitud = 20o 20’5’’N, latitud = 45o 30’2’’E

No hay aviones esperando.

Ficheros que debes generar:


Angulo.h Coordenadas.h Avion.h ColaAviones.h
Angulo.c Coordenadas.c Avion.c ColaAviones.c

You might also like