Files
dicionario/pronto.pas
T
iTakinn 4efed199c0 tak
2026-05-18 19:41:20 -03:00

344 lines
6.9 KiB
ObjectPascal

program dicionario;
type
TponteiroDic = ^dic;
dic = record
verbete: string;
prox: Tponteirodic;
end;
Tponteiro = ^no;
no = record
palavra: string;
dic: TponteiroDic;
prox: Tponteiro;
ant: Tponteiro;
end;
Tlista = record
inicio: Tponteiro;
fim: Tponteiro;
end;
var lista: Tlista;
op: integer;
palavra, verbete: string;
function verificaVazio(l: tlista): boolean;
begin
verificaVazio:= l.inicio = nil;
end;
procedure inicializarLista(var l: tlista);
begin
l.inicio:= nil;
l.fim:= nil;
end;
function verificaPalavra(l: tlista; p: string): boolean;
var aux: Tponteiro;
begin
aux:= l.inicio;
while (aux <> nil) and (aux^.palavra <> p) do
aux:= aux^.prox;
if aux = nil then
verificaPalavra:= false
else
verificaPalavra:= true;
end;
function verificaVerbete(l: tlista; p, v: string): boolean;
var aux: Tponteiro;
aux2: TponteiroDic;
begin
aux:= l.inicio;
while (aux <> nil) and (aux^.palavra <> p) do
aux:= aux^.prox;
if aux <> nil then
begin
aux2:= aux^.dic;
while (aux2 <> nil) and (aux2^.verbete <> v) do
aux2:= aux2^.prox;
if aux2 = nil then
verificaVerbete:= false
else
verificaVerbete:= true;
end
else
verificaVerbete:= false;
end;
procedure inserirPalavra(var l: Tlista; p: string);
var novo, temp, aux: Tponteiro;
begin
new(novo);
if novo <> nil then
begin
if not verificaPalavra(l, p) then
begin
novo^.prox:= nil;
novo^.ant:= nil;
novo^.dic:= nil;
novo^.palavra:= p;
if verificaVazio(l) then
begin
l.inicio:= novo;
l.fim:= novo;
end
else if p < l.inicio^.palavra then
begin
temp:= l.inicio;
l.inicio:= novo;
novo^.prox:= temp;
temp^.ant:= novo;
end
else
begin
aux:= l.inicio;
while (aux^.prox <> nil) and (aux^.prox^.palavra < p) do
aux:= aux^.prox;
if aux^.prox = nil then
begin
aux^.prox:= novo;
novo^.ant:= aux;
l.fim:= novo;
end
else
begin
temp:= aux^.prox;
aux^.prox:= novo;
novo^.prox:= temp;
novo^.ant:= aux;
temp^.ant:= novo;
end;
end;
end
else
writeln('essa palavra já existe');
end
else
writeln('Memória cheia hahaha');
end;
procedure inserirVerbete(var l: tLista; p, v: string);
var novo, temp, temp2: TponteiroDIc;
aux: Tponteiro;
begin
new(novo);
if novo <> nil then
begin
if not verificaVerbete(l, p, v) then
begin
aux:= l.inicio;
novo^.verbete:= v;
novo^.prox:= nil;
while (aux <> nil) and (aux^.palavra <> p) do
aux:= aux^.prox;
if aux^.palavra = p then
begin
if aux^.dic = nil then
aux^.dic:= novo
else if v < aux^.dic^.verbete then
begin
temp:= aux^.dic;
aux^.dic:= novo;
aux^.dic^.prox:= temp;
end
else
begin
temp:= aux^.dic;
while (temp^.prox <> nil) and (temp^.prox^.verbete < v) do
temp:= temp^.prox;
temp2:= temp^.prox;
temp^.prox:= novo;
novo^.prox:= temp2;
end;
end
else
writeln('Palavra não encontrada');
end
else
writeln('O verbete ja está na lista')
end
else
writeln('Memória cheia');
end;
procedure removerVerbete(var l: Tlista; p: string; v: string);
var aux: Tponteiro;
temp, temp2: TponteiroDIc;
begin
if verificaVazio(l) then
writeln('Lista de palavras vazia')
else
begin
aux:= l.inicio;
while (aux <> nil) and (aux^.palavra <> p) do
aux:= aux^.prox;
if aux = nil then
writeln('Palavra não encontrada')
else if aux^.dic = nil then
writeln('A palavra não possui verbetes')
else if aux^.dic^.verbete = v then
begin
temp:= aux^.dic;
aux^.dic:= aux^.dic^.prox;
dispose(temp);
end
else
begin
temp:= aux^.dic;
while (temp^.prox <> nil) and (temp^.prox^.verbete <> v) do
temp:= temp^.prox;
if temp^.prox = nil then
writeln('O verbete não está na lista')
else
begin
temp2:= temp^.prox;
temp^.prox:= temp^.prox^.prox;
dispose(temp2);
end;
end;
end;
end;
procedure consultar(l: Tlista; p: string);
var aux: Tponteiro;
temp: TponteiroDic;
begin
if verificaVazio(l) then
writeln('Lista vazia')
else
begin
aux:= l.inicio;
while (aux <> nil) and (aux^.palavra <> p) do
aux:= aux^.prox;
if aux = nil then
writeln('Palavra não encontrada')
else
begin
temp:= aux^.dic;
if temp = nil then
writeln('A palavra não possui verbetes')
else
begin
write('Verbetes: ');
while (temp <> nil) do
begin
write(temp^.verbete, ' ');
temp:= temp^.prox;
end;
end;
end;
end;
end;
procedure escreverTudo(l: tlista);
var aux: Tponteiro;
temp: TponteiroDic;
begin
if verificaVazio(l) then
writeln('Lista vazia')
else
begin
aux:= l.inicio;
while (aux <> nil) do
begin
write(aux^.palavra, ': ');
temp:= aux^.dic;
while (temp <> nil) do
begin
write(temp^.verbete);
if temp^.prox <> nil then
write(', ');
temp:= temp^.prox;
end;
writeln;
aux:= aux^.prox;
end;
end;
end;
function formatarString(s: string): string;
var i: integer;
resultado: string;
begin
resultado:= '';
if length(s) > 0 then
begin
resultado:= upcase(s[1]);
for i:= 2 to length(s) do
begin
if (s[i] >= 'A') and (s[i] <= 'Z') then
resultado:= resultado + char(ord(s[i]) + 32)
else
resultado:= resultado + s[i];
end;
end;
formatarString:= resultado;
end;
begin
inicializarLista(lista);
op:= 0;
while op <> 6 do
begin
writeln;
writeln('1 - Inserir palavra');
writeln('2 - Inserir verbete');
writeln('3 - Remover verbete');
writeln('4 - Consultar');
writeln('5 - Escrever tudo');
writeln('6 - Sair');
write('Opcao: ');
readln(op);
case op of
1: begin
writeln;
write('Palavra: ');
readln(palavra);
palavra:= formatarString(palavra);
inserirPalavra(lista, palavra);
end;
2: begin
writeln;
write('Palavra: ');
readln(palavra);
write('Verbete: ');
readln(verbete);
palavra:= formatarString(palavra);
verbete:= formatarString(verbete);
inserirVerbete(lista, palavra, verbete);
end;
3: begin
writeln;
write('Palavra: ');
readln(palavra);
write('Verbete: ');
readln(verbete);
palavra:= formatarString(palavra);
verbete:= formatarString(verbete);
removerVerbete(lista, palavra, verbete);
end;
4: begin
writeln;
write('Digite a palavra a ser consultada: ');
readln(palavra);
palavra:= formatarString(palavra);
writeln;
consultar(lista, palavra);
writeln;
end;
5: begin
writeln;
escreverTudo(lista);
writeln;
end;
else
writeln('Opcao invalida');
end;
end;
end .