-- ************************************************* -- *************** 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;