Está en la página 1de 12

Elementos de Programación

1º Ingeniería Técnica de Telecomunicación


Convocatoria ordinaria - Ejercicios

15 de septiembre de 2009
Tiempo: 2,5 horas.
Puntuación máxima: 7.0

Nombre: D.N.I.:

Especialidad (SE/SI/ST): Grupo (A/B) (o profesor):

Ejercicio 1 [5 puntos]

Se desea implementar la clase CCadena para almacenar y manipular cadenas de


caracteres. Su interfaz es la siguiente:

INTERFAZ CLASE CCadena


TIPOS
C TipoCadena[1..256]
MÉTODOS
// Inicializa una cadena como vacía
Crear()

// Inicializa la cadena a partir de la cadena de caracteres


// almacenada en el array que se pasa como parámetro
Crear(E TipoCadena cad)

// Constructor de copia
Crear(ES CCadena cad)

// Destructor de la clase
Destruir()

// Asigna (copia) la cadena que se pasa como


// parámetro a la cadena actual.
Asignar(E CCadena cad)

// Compara la cadena actual con otra


// que se pasa como parámetro
B CadenasIguales(E CCadena cad)

// Devuelve la cadena resultante de concatenar al final de


// la cadena actual la cadena que se pasa como parámetro.
CCadena Concatenar(E CCadena cad)

// Saca por pantalla la cadena actual


Escribir()

// Devuelve el número de caracteres de la cadena actual


N Longitud()
FIN CCadena
Apartado a) [1,5 puntos] Implementar la clase CCadena empleando listas posicionales
(CListaPos) de caracteres, es decir mediante composición de clases.

Apartado b) [3,5 puntos] Implementar la clase CCadena de manera dinámica, mediante


listas enlazadas lineales simples.

Notas:
1. Pueden implementarse los métodos auxiliares que se consideren necesarios.
2. La interfaz de la clase CListaPos estudiada en clase y que debe ser utilizada en
el apartado a) es la siguiente:

INTERFAZ CLASE CListaPos


TIPOS
... TipoElemento

MÉTODOS
Crear()
Crear(ES CListaPos lista)
Destruir()
N Longitud()
B EstáVacía()
B EstáLlena()
// PRECONDICIÓN:
// La lista no está llena y 1<=pos
Insertar(E N pos; E TipoElemento elem)
// PRECONDICIÓN:
// 1<=pos<=Longitud()
Eliminar(E N pos)
// PRECONDICIÓN:
// 1<=pos<=Longitud()
TipoElemento Consultar(E N pos)
FIN CListaPosicional
Ejercicio 2 [2 puntos]

Se dice que una frase es palíndroma si la sucesión de caracteres obtenida al recorrerla de


izquierda a derecha (ignorando los blancos intermedios) es la misma que si el recorrido se
hace de derecha a izquierda, como por ejemplo en la frase dábale arroz a la zorra el abad
(se consideran los caracteres sin tilde).
Dada la interfaces de la clase CPila y de la clase CCola vistas en clase, implementar
una función lógica (devuelve un booleano) que:
- Sin recibir ningún parámetro, decida si una frase dada como sucesión de
caracteres es o no palíndroma.
- Debe leer por teclado una cadena de caracteres que acaba en un retorno de carro
y que puede contener cualquier carácter. Se consideran separadores sólo los
caracteres “espacio en blanco” (todos los demás caracteres son utilizables para la
comprobación del palíndromo).
- Sólo pueden usarse como estructuras auxiliares objetos de la clase CPila y/o de
la clase CCola (ninguna otra estructura auxiliar, estática o dinámica, debe usarse;
por tanto, queda también excluido el uso de arrays o listas enlazadas). Pueden
usarse también las variables de tipos simples que se necesiten.
Sugerencia: Una posible solución se obtiene haciendo uso de un único objeto de la clase
CCola y otro objeto de la clase CPila.

INTERFAZ CLASE CPila


TIPOS
... TipoElemento // cualquier tipo de datos
METODOS
Apilar(E TipoElemento elem)
Desapilar()
TipoElemento Cima()
Crear()
Crear(ES CPila p)
B EstaVacia ()
Destruir()
FIN CPila

INTERFAZ CLASE CCola


TIPOS
... TipoElemento //cualquier tipo de datos
MÉTODOS
Crear()
Crear(ES CCola c)
B EstaVacia()
Encolar(E TipoElemento elem)
Desencolar()
TipoElemento Frente()
Destruir()
FIN CCola
EJERCICIO 1

APARTADO A
IMPLEMENTACIÓN CLASE CCadena
ATRIBUTOS
CListaPos cadena
MÉTODOS
// Inicializa una cadena como vacía
Crear()
INICIO
FIN Crear

// Inicializa la cadena a partir de la cadena de caracteres


// almacenada en el array que se pasa como parámetro
Crear(E TipoCadena cad)
VAR
N ind = 1
INICIO
MIENTRAS cad[ind] != ‘\0’ Y NO cadena.EstáLlena() HACER
cadena.Insertar(cadena.Longitud()+1, cad[ind])
ind = ind + 1
FINMIENTRAS
FIN Crear

// Constructor de copia
Crear(ES CCadena cad)
INICIO
cadena = cad.cadena
FIN Crear

// Destructor de la clase
Destruir()
INICIO
FIN Destruir

// Asigna (copia) la cadena que se pasa como


// parámetro a la cadena actual.
Asignar(E CCadena cad)
INICIO
cadena = cad.cadena
FIN Asignar
// Compara la cadena actual con otra
// que se pasa como parámetro
B CadenasIguales(E CCadena cad)
VAR
B iguales
N pos, long
INICIO
iguales = Longitud()==cad.Longitud()
SI iguales ENTONCES
pos = 1; long = Longitud()
MIENTRAS pos<=long Y iguales HACER
iguales =
cadena.Consultar(pos)==cad.cadena.Consultar(pos)
pos = pos + 1
FINMIENTRAS
FINSI
DEVOLVER (iguales)
FIN CadenasIguales

// Devuelve la cadena resultante de concatenar al final de


// la cadena actual la cadena que se pasa como parámetro.
CCadena Concatenar(E CCadena cad)
VAR
N ind = 1, long = cad.Longitud()
CCadena res
INICIO
res.cadena = cadena
MIENTRAS ind <=long Y NO res.cadena.EstáLlena() HACER
res.cadena.Insertar(res.cadena.Longitud()+1,
cad.cadena.Consultar(ind))
ind = ind + 1
FINMIENTRAS
DEVOLVER (res)
FIN Concatenar

// Saca por pantalla la cadena actual


Escribir()
VAR
N pos = 1, long = Longitud()
INICIO
MIENTRAS pos<=long HACER
Escribir(cadena.Consultar(pos))
pos = pos + 1
FINMIENTRAS
FIN Escribir
// Devuelve el número de caracteres de la cadena actual
N Longitud()
INICIO
DEVOLVER cadena.Longitud()
FIN Longitud

FIN CCadena
EJERCICIO 1

APARTADO B
IMPLEMENTACIÓN CLASE CCadena
TIPOS
REGISTRO TpNodo
C car
TpNodo *sig
FINREGISTRO
TpNodo *TpLista
ATRIBUTOS
TpLista cadena // Puntero
MÉTODOS

// Método auxiliar que devuelve una posición consultada


// Precondición: la posición es correcta 1<=pos<=Longitud
C Consultar(E N pos)
VAR
N ind = 1;
TpLista ptr = cadena
C car
INICIO
SI pos>=1 Y pos<=Longitud() ENTONCES
MIENTRAS ind < pos HACER
ind = ind + 1
ptr = ptr->sig
FINMIENTRAS
car = ptr->car
FINSI
DEVOLVER car
FIN Consultar
// Método auxiliar para insertar en una posición de la
// lista enlazada.
// Precondición: 1<=pos<=Longitud
Insertar(E N pos; E N car)
VAR
N ind=1
TpLista ptr = cadena, ant = NULO, nuevo
INICIO
SI pos>=1 Y pos<=Longitud()+1 ENTONCES
MIENTRAS ind<pos HACER
ind = ind + 1
ant = ptr
ptr = ptr->sig
FINMIENTRAS
ASIGNAR(nuevo); nuevo->car = car; nuevo->sig = NULO
SI ant == NULO ENTONCES
nuevo->sig = cadena
cadena = nuevo
SINO
nuevo->sig = ptr
ant->sig = nuevo
FINSI
FINSI
FIN Insertar

// Método auxiliar para borrar la lista enlazada


BorrarLista()
VAR
TpLista ptr = cadena
INICIO
MIENTRAS cadena != NULO HACER
ptr = cadena
cadena = cadena -> sig
LIBERAR(ptr)
FINMIENTRAS
FIN BorrarLista()

// Inicializa una cadena como vacía


Crear()
INICIO
cadena = NULO
FIN Crear
// Inicializa la cadena a partir de la cadena de caracteres
// almacenada en el array que se pasa como parámetro
Crear(E TipoCadena cad)
VAR
N ind = 1
INICIO
MIENTRAS cad[ind] != ‘\0’ HACER
Insertar(Longitud()+1, cad[ind])
ind = ind + 1
FINMIENTRAS
FIN Crear

// Constructor de copia
Crear(ES CCadena cad)
INICIO
//cadena = NULO;
Asignar(cad)
FIN Crear

// Destructor de la clase
Destruir()
INICIO
BorrarLista()
FIN Destruir

// Asigna (copia) la cadena que se pasa como


// parámetro a la cadena actual.
Asignar(E CCadena cad)
VAR
N long = cad.Longitud(), pos = 1
INICIO
BorrarLista()
MIENTRAS pos <= long HACER
Insertar(pos, cad.Consultar(pos))
pos = pos + 1
FINMIENTRAS
FIN Asignar
// Compara la cadena actual con otra
// que se pasa como parámetro
B CadenasIguales(E CCadena cad)
VAR
B iguales
N pos, long
INICIO
iguales = Longitud()==cad.Longitud()
SI iguales ENTONCES
pos = 1; long = Longitud()
MIENTRAS pos<=long Y iguales HACER
iguales =
Consultar(pos)==cad.Consultar(pos)
pos = pos + 1
FINMIENTRAS
FINSI
DEVOLVER (iguales)
FIN CadenasIguales

// Devuelve la cadena resultante de concatenar al final de


// la cadena actual la cadena que se pasa como parámetro.
CCadena Concatenar(E CCadena cad)
VAR
N ind = 1, long
CCadena res
INICIO
long = Longitud()
MIENTRAS ind <=long HACER
res.Insertar(res.Longitud()+1,Consultar(ind))
ind = ind + 1
FINMIENTRAS
long = cad.Longitud()
ind = 1
MIENTRAS ind <=long HACER
res.Insertar(res.Longitud()+1,cad.Consultar(ind))
ind = ind + 1
FINMIENTRAS
DEVOLVER (res)
FIN Concatenar

// Saca por pantalla la cadena actual


Escribir()
VAR
N pos = 1, long = Longitud()
INICIO
MIENTRAS pos<=long HACER
Escribir(Consultar(pos))
pos = pos + 1
FINMIENTRAS
FIN Escribir
// Devuelve el número de caracteres de la cadena actual
N Longitud()
VAR
N long = 0
TpLista ptr = cadena
INICIO
MIENTRAS ptr != NULO HACER
long = long + 1
ptr = ptr->sig
FINMIENTRAS
DEVOLVER long
FIN Longitud
FIN CCadena
EJERCICIO 2
La idea es recorrer la sucesión de entrada apilando los caracteres
no blancos en una pila (donde quedaran en orden inverso) y al
mismo tiempo en una cola (donde quedarán en orden de entrada). A
continuación se hace un segundo recorrido comparando los
caracteres almacenados en la pila con los almacenados en la cola.
La frase es palíndroma cuando todos los caracteres coinciden.
Se obvia la implementación de la clase CPila. No obstante el
alumno si debe realizarla.
TIPOS
C TipoElemento
ALGORITMO B Palindromo()
VAR
TipoElemento car
CCola cola
CPila pila
B cierto=VERDADERO
INICIO
Leer(car)
MIENTRAS car!=’\n’ HACER
SI car!=’ ’ ENTONCES
cola.Encolar(car)
pila.Apilar(car)
FINSI
Leer(car)
FINMIENTRAS
MIENTRAS NO cola.EstaVacia() Y cierto HACER
cierto=pila.Cima()==cola.Frente()
pila.Desapilar()
cola.Desencolar()
FINMIENTRAS
DEVOLVER cierto
FIN Palindromo

También podría gustarte