Professional Documents
Culture Documents
uses Math;
function potencia4(a,b:integer):integer;
var aux:integer;
begin
if b = 0 then
potencia4 := 1
else if b = 1 then
potencia4 := a
else begin
aux := potencia4(a, b div 2);
if (b mod 2) = 0 then
potencia4 := sqr(aux)
else
potencia4 := sqr(aux)*a;
end;
end;
function DigitoToChar(digito:byte):char;
begin
DigitoToChar := char(ord('A') + digito - 10);
end;
function CharToDigito(caracter:char):byte;
begin
CharToDigito := ord(upcase(caracter)) - ord('A') + 10;
end;
begin
end.
unit TADABB;
interface
const
NULOABB = nil; // Para representar posiciones nulas en el ABB
type
// tDato: tipo de dato que contiene el ABB homogeneamente (a editar por el
programador que use el ABB)
tDato = integer;
implementation
{ Funcion privada }
function CrearNodo(dato:tDato; var ABB:tABB):boolean;
begin
new(ABB); // reservamos memoria en el monticulo para el ABB
CrearNodo := false; // suponemos que no se ha podido reservar memoria
if ABB <> NULOABB then begin // si se ha podido reservar memoria...
ABB^.info := dato; // guardamos el dato en el nodo
ABB^.hijoizq := NULOABB; // hijoizq es nil
ABB^.hijoder := NULOABB; // hijoder es nil
CrearNodo := true; // devolvemos true para crear nodo
end;
end;
function EsABBVacio(ABB:tABB):boolean;
{
* Objetivo: test para verificar si el ABB esta vacio
* Parametros de E: ABB
* PreCD: el ABB creado previamente
* PostCD: -
* Salida: verdadero si el ABB esta vacio, false en caso contrario
}
begin
EsABBVacio := (ABB = NULOABB); // testeamos si el ABB apunta a nil
end;
function Raiz(ABB:tABB):tDato;
{
* Objetivo: obtener el hijo izquierdo de un ABB
* Parametros de E: ABB
* PreCD: el ABB no esta vacio
* PostCD: -
* Salida: el hijo izquierdo del ABB de entrada
}
begin
Raiz := ABB^.info; // devolvemos la raiz del ABB
end;
function HijoIzq(ABB:tABB):tABB;
{
* Objetivo: obtener el hijo derecho de un ABB
* Parametros de E: ABB
* PreCD: el ABB no esta vacio
* PostCD: -
* Salida: el hijo derecho del ABB de entrada
}
begin
HijoIzq := ABB^.hijoizq; // devolvemos el hijoizq
end;
function HijoDer(ABB:tABB):tABB;
{
* Objetivo: obtener el hijo izquierdo de un ABB
* Parametros de E: ABB
* PreCD: el ABB no esta vacio
* PostCD: -
* Salida: el hijo izquierdo del ABB de entrada
}
begin
HijoDer := ABB^.hijoder; // devolvemos el hijoder
end;
{ Procedimiento privado }
procedure reemplazar(var ABBAux:tABB; aux:tABB); // reemplaza el nodo por su
anterior
begin
if not EsABBVacio(ABBAux^.hijoder) then
reemplazar(ABBAux^.hijoder, aux) // bajamos por la rama derecha
else begin
aux^.info := ABBAux^.info; // reemplazamos los campos de informacion
aux := ABBAux; // marcamos el nodo sobre el que hacer dispose
ABBAux := ABBAux^.hijoizq; // y reenlazamos la estructura - saltando -
end; // al nodo que se va a eliminar
end;
begin
{ Seccion de inicializacion }
end.
nit TADCola;
interface
const
NULOCOLA = nil;
type
tDato = integer;
tPosC = ^tNodo;
tNodo = record
dato:tDato;
sig:tPosC;
end;
tCola = record
primera,ultima:tPosC;
end;
implementation
begin
{ Seccin de inicializacin }
end.
unit TADPilaDinamica;
interface
const
NULOP = nil; // Para representar posiciones nulas en la pila
type
implementation
procedure CrearPila(var pila:tPila);
{
Objetivo: Crea una pila vacia.
Entradas: La pila a crear.
Salidas: La pila inicializada.
PreCD: -
PostCD: La pila sin datos.
}
begin
pila := NULOP;
end;
function EsPilaVacia(pila:tPila):boolean;
{
Objetivo: Determina si la pila esta vacia.
Entradas: La pila a comprobar.
Salidas: True si la pila esta vacia, False en caso contrario.
PreCD: La pila inicializada.
PostCD: -
}
begin
EsPilaVacia := (Pila = NULOP);
end;
function CimaPila(pila:tPila):tDato;
{
Objetivo: Obtener el elemento de la cima de la pila.
Entradas: La pila.
Salidas: El elemento de la cima de la pila.
PreCD: La pila no esta vacia.
PostCD: -
}
begin
CimaPila := pila^.info;
end;
begin
{ Seccion de inicializacion }
end.
unit TADRacional;
interface
type
Racional = ^tRacional; // Tipo Racional - puntero a registro
tRacional = record // Tipo registro de Racional
numerador,denominador:integer;
end;
implementation
function CrearRacional(a,b:integer):Racional;
{
* Objetivo: crea un numero racional.
* Parametros de E: dos numeros enteros (numerador y denominador).
* PreCD: el denominador distinto de 0.
* PostCD: -
* Salida: el numero racional.
}
begin
new(CrearRacional);
CrearRacional^.numerador := a;
CrearRacional^.denominador := b;
end;
function MostrarRacional(r:Racional):string;
{
* Objetivo: muestra un numero racional.
* Parametros de E: un numero racional.
* PreCD: un numero racional inicializado.
* PostCD: -
* Salida: muestra por pantalla el numero racional con el signo colocado
correctamente.
}
var num,den:string;
begin
if ((numerador(r)>0) and (denominador(r)>0)) or ((numerador(r)<0) and
(denominador(r)<0)) then begin { Mostrar Racional positivo }
str(abs(numerador(r)),num);
str(abs(denominador(r)),den);
MostrarRacional := num + '/' + den;
end
else if numerador(r) = 0 then { Mostrar "Racional" 0 }
MostrarRacional := '0'
else begin { Mostrar Racional negativo }
str(abs(numerador(r)),num);
str(abs(denominador(r)),den);
MostrarRacional := '-' + num + '/' + den;
end;
end;
function Numerador(r:Racional):integer;
{
* Objetivo: obtiene el numerador de un numero racional.
* Parametros de E: un numero racional.
* PreCD: un numero racional inicializado.
* PostCD: -
* Salida: el numerador del numero racional.
}
begin
Numerador := r^.numerador;
end;
function Denominador(r:Racional):integer;
{
* Objetivo: obtiene el denominador de un numero racional.
* Parametros de E: un numero racional.
* PreCD: un numero racional inicializado.
* PostCD: -
* Salida: el denominador del numero racional.
}
begin
Denominador := r^.denominador;
end;
function SumarRacional(r,s:Racional):Racional;
{
* Objetivo: suma dos numeros racionales.
* Parametros de E: dos numeros racionales.
* PreCD: los dos numeros racionales inicializados.
* PostCD: -
* Salida: la suma de los dos numeros racionales.
}
begin
new(SumarRacional);
SumarRacional^.denominador := denominador(r) * denominador(s);
SumarRacional^.numerador := denominador(SumarRacional) div denominador(r) *
numerador(r) + denominador(SumarRacional) div denominador(s) * numerador(s);
SumarRacional := SimplificarRacional(SumarRacional);
end;
function RestarRacional(r,s:Racional):Racional;
{
* Objetivo: resta dos numeros racionales.
* Parametros de E: dos numeros racionales.
* PreCD: los dos numeros racionales inicializados.
* PostCD: -
* Salida: la resta del primer numero racional menos el segundo numero
racional.
}
begin
new(RestarRacional);
RestarRacional^.denominador := denominador(r) * denominador(s);
RestarRacional^.numerador := denominador(RestarRacional) div denominador(r) *
numerador(r) - denominador(RestarRacional) div denominador(s) * numerador(s);
RestarRacional := SimplificarRacional(RestarRacional);
end;
function MultiplicarRacional(r,s:Racional):Racional;
{
* Objetivo: multiplica dos numeros racionales.
* Parametros de E: dos numeros racionales.
* PreCD: los dos numeros racionales inicializados.
* PostCD: -
* Salida: la multiplicacion de los dos numeros racionales.
}
begin
new(MultiplicarRacional);
MultiplicarRacional^.numerador := numerador(r) * numerador(s);
MultiplicarRacional^.denominador := denominador(r) * denominador(s);
MultiplicarRacional := SimplificarRacional(MultiplicarRacional);
end;
function DividirRacional(r,s:Racional):Racional;
{
* Objetivo: divide dos numeros racionales.
* Parametros de E: dos numeros racionales.
* PreCD: los dos numeros racionales inicializados.
* PostCD: -
* Salida: la division del primer numero racional entre el segundo numero
racional.
}
begin
new(DividirRacional);
DividirRacional^.numerador := numerador(r) * denominador(s);
DividirRacional^.denominador := denominador(r) * numerador(s);
DividirRacional := SimplificarRacional(DividirRacional);
end;
begin
{ Inicializacion }
end.
unit TADTABLAHASH;
interface
{ constantes publicas }
const
TablaHash_TAM = 101; // Tamanho Tabla Primo ** modificar **
TablaHash_POSICION_PRIMERA = 0; // no modificar
TablaHash_POSICION_ULTIMA = TablaHash_TAM-1; // no modificar
TablaHash_REHASHP = 97; // Doble ReHash Primo ** modificar **
tEntrada = record
dato:tDato;
estado:tEstado;
end;
{ funciones publicas }
procedure TablaHash_Inicializar(var TablaHash:tTablaHash);
function TablaHash_Buscar(C:longint; TablaHash:tTablaHash):tIndiceTablaHash;
function TablaHash_ExisteElemento(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
function TablaHash_EsEntradaOcupada(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
function TablaHash_EsEntradaVacia(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
function TablaHash_EsEntradaEliminada(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
function TablaHash_ObtenerDato(hash:tIndiceTablaHash;
TablaHash:tTablaHash):tClaveTablaHash;
procedure TablaHash_Insertar(C:tClaveTablaHash; var TablaHash:tTablaHash);
procedure TablaHash_Eliminar(C:tClaveTablaHash; var TablaHash:tTablaHash);
implementation
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
function TablaHash_Buscar(C:tClaveTablaHash;
TablaHash:tTablaHash):tIndiceTablaHash;
var hash,hash_actual:tIndiceTablaHash; i:integer;
begin
i := 0;
hash := TablaHash_HashClave(C);
hash_actual := hash;
while (TablaHash[hash_actual].estado <> VACIA) and
(TablaHash[hash_actual].dato <> C) do begin
i := i + 1;
hash_actual := (((hash + TablaHash_ReHashClave(hash,i)) mod
TablaHash_TAM));
end;
TablaHash_Buscar := hash_actual;
end;
function TablaHash_ExisteElemento(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
begin
TablaHash_ExisteElemento := (TablaHash[hash].estado = OCUPADA);
end;
function TablaHash_EsEntradaOcupada(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
begin
TablaHash_EsEntradaOcupada := (TablaHash[hash].estado = OCUPADA);
end;
function TablaHash_EsEntradaVacia(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
begin
TablaHash_EsEntradaVacia := (TablaHash[hash].estado = VACIA);
end;
function TablaHash_EsEntradaEliminada(hash:tIndiceTablaHash;
TablaHash:tTablaHash):boolean;
begin
TablaHash_EsEntradaEliminada := (TablaHash[hash].estado = ELIMINADA);
end;
function TablaHash_ObtenerDato(hash:tIndiceTablaHash;
TablaHash:tTablaHash):tClaveTablaHash;
begin
TablaHash_ObtenerDato := TablaHash[hash].dato;
end;
begin
{ Seccion de inicializacion }
end.
function InvertirString(str:tString):tString;
var i,j:byte; t:char;
begin
i:=1; // apuntamos con i al primer caracter
j:=length(str); // apuntamos con j al ultimo caracter
while i<j do begin // si i y j son iguales, apuntan al mismo caracter, por lo
tanto no es necesario intercambiarlos
// intercambiamos los caracteres str[i], str[j]
t := str[i];
str[i] := str[j];
str[j] := t;
i +=1; // movemos i un caracter hacia adelante { cambiar por i := i + 1
si no funciona }
j -=1; // movemos j un caracter hacia atras { cambiar por j := j - 1 si
no funciona }
end;
InvertirString := str;
end;
unit Graficos;
interface
uses graph, crt;
function IniciarGrafico():boolean;
implementation
function IniciarGrafico():boolean;
var ControladorGrafico,
ModoGrafico,
CodigoError:integer;
begin
writeln('Inicializando graficos, espera por favor...');
ControladorGrafico := Detect; // establecemos la macro Detect para
ControladoGrafico
InitGraph(ControladorGrafico, ModoGrafico, ''); // inicializamos el grafico
CodigoError := GraphResult; // recogemos el resultado de la inicializacion
del grafico
If GraphResult <> grOK then begin // si hubo un error
IniciarGrafico := false;
clrscr;
writeln('Ocurrio un error de graficos: ', GraphErrorMsg(CodigoError));
writeln('Si no se encuentra el archivo, el error se muestra arriba.');
writeln('Por ello debes cambiar el directorio actual,');
writeln('Localizacion desde C:\ -> TP -> BGI, ' + 'del menu de
archivo');
readln; // hacemos una pausa para leer el error
halt(1); // salimos con error 1
end
else IniciarGrafico := true;
end;
begin
end.