sol_ejercicio 1

Anuncio
-- *************************************************
-- *************** SOL_EJERCICIO 1 ***************
-- *************************************************
SUBTYPE TipoLetrasMayusculas IS Character RANGE'A'..'Z';
PACKAGE ListaLetras IS NEW Lista (TipoLetrasMayusculas);
USE ListaLetras;
SUBTYPE TipoPalabra IS Tipo;
FUNCTION Pertenece (x : Character; pal : TipoPalabra)
RETURN Boolean IS
-- PRE: cierto
--POST: resultado = ALGO i IN [1,Longitud(pal)] . (pal(i) = x)
BEGIN
IF Es_Vacia (pal) THEN
RETURN False;
ELSE
RETURN (x = Primero (pal)) OR ELSE Pertenece (x,Resto (pal));
END IF;
END Pertenece;
FUNCTION SinRepetir (pal : TipoPalabra) RETURN TipoPalabra IS
-- PRE: cierto
--POST: resultado = FIL i IN [1,Longitud(pal)] .
-NOT Pertenece (pal(i),pal(i+1..Longitud(pal)))
BEGIN
IF Es_Vacia (pal) THEN
RETURN Vacia;
ELSIF Pertenece (Primero (pal),Resto (pal)) THEN
RETURN SinRepetir (Resto (pal));
ELSE
RETURN Cons (Primero (pal),SinRepetir (Resto (pal)));
END IF;
END SinRepetir;
FUNCTION CuantosComunes1Aux (pal1, pal2 : TipoPalabra)
RETURN Natural IS
-- PRE: NoHayRepetidos (pal1)
--POST: resultado = CON i IN pal1 . Pertence (i,pal2)
BEGIN
IF Es_Vacia (pal1) THEN
RETURN 0;
ELSIF Pertenece (Primero (pal1),pal2) THEN
RETURN 1 + CuantosComunes1Aux (Resto (pal1),pal2);
ELSE
RETURN CuantosComunes1Aux (Resto (pal1),pal2);
END IF;
END CuantosComunes1Aux;
FUNCTION CuantosComunes1 (p1, p2 : TipoPalabra) RETURN Natural IS
-- PRE: cierto
--POST: resultado = CON i IN SinRepetir (p1) . Pertence (i,p2)
BEGIN
RETURN CuantosComunes1Aux (SinRepetir (p1),p2);
END CuantosComunes1;
-- *************** OTRA SOLUCION ***************
FUNCTION CuantosComunes2Aux (pal1, pal2 : TipoPalabra;
letra : Character) RETURN Natural IS
-- PRE: letra IN TipoLetrasMayusculas
--POST: resultado = CON letra IN TipoLetrasMayusculas .
-(Pertence (letra,pal1)/\Pertence (letra,pal2))
BEGIN
IF letra > 'Z' THEN
RETURN 0;
ELSIF Pertenece (letra,pal1) AND Pertenece (letra,pal2) THEN
RETURN 1 + CuantosComunes2Aux (pal1,pal2,Character'Succ (letra));
ELSE
RETURN CuantosComunes2Aux (pal1,pal2,Character'Succ (letra));
END IF;
END CuantosComunes2Aux;
FUNCTION CuantosComunes2 (p1, p2 : TipoPalabra) RETURN Natural IS
-- PRE: cierto
--POST: resultado = CON i IN TipoLetrasMayusculas .
-(Pertence (i,p1)/\Pertence (i,p2))
BEGIN
RETURN CuantosComunes2Aux (p1,p2,'A');
END CuantosComunes2;
-- *************************************************
-- *************** SOL_EJERCICIO 2 ***************
-- *************************************************
SUBTYPE TipoTiempo IS Float RANGE 0.0..Float'Last;
PACKAGE ColTiempos IS NEW Lista (TipoTiempo);
USE ColTiempos;
SUBTYPE TipoCronometradas IS Tipo;
FUNCTION Menor2 (x, y : TipoTiempo) RETURN TipoTiempo IS
BEGIN
IF x < y THEN
RETURN x;
ELSE
RETURN y;
END IF;
END Menor2;
FUNCTION Diferencia (t1, t2 : TipoTiempo) RETURN TipoTiempo IS
-- PRE: t2 > t1
--POST: resultado = t2-t1
BEGIN
RETURN t2 - t1;
END Diferencia;
FUNCTION VueltaMasRapida1Aux (cronos : TipoCronometradas)
RETURN Natural IS
-- PRE: Longitud (cronos) > 1
--POST: resultado = MIN i IN [1,Longitud (cronos)-1] .
-Diferencia (cronos(i),cronos(i+1))
BEGIN
IF Es_Vacia (Resto (Resto (cronos))) THEN
RETURN Diferencia (Primero (cronos),Primero (Resto(cronos)));
ELSE
RETURN Menor2 (Diferencia (Primero (cronos),
Primero (Resto(cronos))),
VueltaMasRapida1Aux (Resto (cronos)));
END IF;
END VueltaMasRapida1Aux;
FUNCTION VueltaMasRapida1 (cronos : TipoCronometradas)
RETURN Natural IS
-- PRE: Longitud (cronos) > 0
--POST: resultado = VueltaMasRapida1Aux (<0,cronos>)
BEGIN
RETURN VueltaMasRapida1Aux (Cons (0,cronos));
END VueltaMasRapida1;
-- *************** OPTIMIZACION ***************
FUNCTION VueltaMasRapida2 (cronos : TipoCronometradas)
RETURN Natural IS
-- PRE: Longitud (cronos) > 0
--POST: resultado = MIN i IN [1,Longitud (cronos)-1] .
-Diferencia (cronos(i),cronos(i+1))
BEGIN
IF Es_Vacia (Resto (cronos)) THEN
RETURN Primero (cronos);
ELSE
RETURN Menor2 (Diferencia (Primero (cronos),
Primero (Resto (cronos))),
VueltaMasRapida2 (Resto (cronos)));
END IF;
END VueltaMasRapida2;
Descargar