This commit is contained in:
iTakinn
2026-05-18 19:41:20 -03:00
parent 846007cad7
commit 4efed199c0
8 changed files with 942 additions and 57 deletions
+8
View File
@@ -0,0 +1,8 @@
dicionario
dicionario.o
dicionario2
dicionario2.o
GRTAGS
GPATH
GTAGS
.vscode/GTEMP.pas
+30
View File
@@ -0,0 +1,30 @@
# Avaliacao do pedido vs rascunho (dicionario.pas)
## Esboco da estrutura
- Lista principal (dupla): ant <-> prox, key, ponteiro para dicionario
- Dicionario (simples): portugues, ingles, prox
## Requisitos do enunciado
- Lista principal ordenada alfabeticamente e com encadeamento duplo
- Lista de verbetes ordenada alfabeticamente
- Prototipo com: incluir palavra-chave, incluir no dicionario, remover do dicionario, consultar, escrever todo dicionario
## O que o rascunho ja tem
- Tipos com os campos corretos (lista + verbete)
- Rascunho de insercao ordenada na lista principal
- Funcoes de leitura (ler/ler_int) e loop principal com menu
- Consulta basica de chave na lista
## O que falta / fora de curva
- Insercao ordenada correta no dicionario (verbete) e ajuste de prox
- Operacoes completas: remover (lista e dicionario), consultar dicionario, consultar geral
- Impressao de todo o dicionario
- Validacoes basicas (entrada vazia, chave inexistente)
## Problemas tecnicos atuais
- adicionar_dicionario recebe record, mas usa como ponteiro (nil/prox) e mistura tipos (Tlista vs verbete)
- falta "then" em um if do consultar
- menu tem erros de sintaxe (falta ';', condicao vazia no else if)
- menu chama procedimentos sem passar parametros exigidos
- funcoes remover/consultar_geral nao existem
- em adicionar_lista, o novo no nao inicializa dicionario
+236 -42
View File
@@ -1,86 +1,280 @@
program pzim;
uses crt;
type
Tverbete = ^E_Dicionario;
E_Dicionario = record
portugues : string;
ingles : string;
br : string; //portugues
ing : string; // ingles
prox : Tverbete;
end;
Tlista = ^E_lista;
E_lista = record ;
Tlista = ^E_lista ;
E_lista = record
ant : Tlista ; //anterior
key : string;
dicionario : E_dicionario ;
dicionario : Tverbete ;
prox : Tlista ;
end;
function ler : string ;
var
temp : string ;
begin
write (' digite a palavra :') ;
readln( temp ) ;
ler := temp ;
end;
function ler_int : integer ;
var
temp : integer ;
begin
write (' digite um numero : ') ;
readln (temp) ;
ler_int := temp ;
end;
{
function maior(a , b : string):boolean;
begin
maior := upcase(a) > upcase(b);
end;
procedure criar_lista(lista: Tlista );
}
{ JULGAMENTO: comparacao esta comentada; se a ordenacao precisar disso, tem que reativar }
procedure criar_lista ( var lista: Tlista );
begin
lista:=nil;
lista := nil;
end;
procedure adicionar_lista(var lista : Tlista ; chave : string);
procedure adicionar_lista(var T_lista : Tlista );
var
aux , aux_Ant , aux_Prox : Tlista;
temp_s : string;
novo , anterior , atual : Tlista ;
chave : string ;
begin
new(aux);
if
//memoria cheia
chave := ler();
new (novo);
if novo = nil then
writeln ('memoria cheia')
else
begin
while aux^.prox <> nil do
aux := aux^.prox;
temp_s := aux^.key;
new (aux_Ant);
new (aux_Prox);
if maior(temp_s , chave)then
if T_lista = nil then
begin
if aux^.ant <> nil then
aux_Ant := aux^.ant ;
if aux^.prox <> nil then
aux_Prox := aux^.prox;
novo^.key := chave ;
novo^.dicionario := nil;
novo^.prox := T_lista;
novo^.ant := nil ;
T_lista := novo ;
end
aux^.key := chave ;//
else
begin
atual := T_lista ;
anterior := nil ;
while (atual <> nil) and (atual^.key < chave) do
begin
anterior := atual;
atual := atual^.prox;
end;
// JULGAMENTO: comparacao eh case-sensitive; se quiser alfabetico "padrao", precisa normalizar
novo^.ant := anterior ;
novo^.prox := atual ;
novo^.key := chave ;
novo^.dicionario := nil;
if anterior <> nil then
anterior^.prox := novo
else
T_lista := novo ;
if atual <> nil then
atual^.ant := novo ;
end;
end;
end;
procedure portugues()
procedure adicionar_dicionario(dicionario : E_dicionario);
var
aux , aux2 : Tlista;
begin
procedure adicionar_dicionario(var dicionario : Tverbete);
var
aux, aux2, anterior : Tverbete;
chave_p , chave_i : string ;
//portugues /\ /\ inglês
begin
chave_p := ler() ;
chave_i := ler() ;
new(aux);
if aux = nil then
begin
//memoria cheia
writeln ('memoria cheia') ;
end
else
begin
aux^.br := chave_p ;
aux^.ing := chave_i ;
aux^.prox := nil ;
if (dicionario = nil) then
begin
aux^.
end;
while aux^.prox <> nil do
aux := aux^.prox
if aux^.prox = nil then
dicionario := aux ;
exit;
end;
end;
anterior := nil;
aux2 := dicionario ;
while (aux2 <> nil) and (aux2^.br < chave_p ) do
begin
anterior := aux2;
aux2 := aux2^.prox ;
end;
if anterior = nil then
begin
aux^.prox := dicionario;
dicionario := aux;
end
else
begin
aux^.prox := aux2;
anterior^.prox := aux;
end;
end;
end;
function consultar ( T_lista : Tlista ; chave : string ) : Tlista ;
var
atual : Tlista ;
begin
atual := T_lista ;
while ( atual <> nil ) and ( atual^.key < chave ) do
atual := atual^.prox ;
if ( atual <> nil ) and ( atual ^.key = chave) then
consultar := atual
else
consultar := nil ;
end;
procedure consultar_lista ( T_lista : Tlista );
var
aux : tlista ;
op : string ;
begin
write ( ' vc quer consutar quer consultar qual palavra ? ') ;
op := ler ;
aux := consultar( T_lista , op );
if aux = nil then
writeln (' palavra nao encontrada ')
else
write (' palavra encontrada :' , aux^.key );
end;
procedure consultar_dicionario (T_lista : Tlista );
var
aux : Tlista ;
op : string ;
begin
// TODO: consultar palavra dentro do dicionario da chave
end;
procedure consultar_geral(T_lista : Tlista);
begin
// TODO: listar todo o dicionario
end;
procedure remover_lista(var T_lista : Tlista);
begin
// TODO: remover chave da lista principal
end;
procedure remover_dicionario(var T_lista : Tlista);
begin
// TODO: remover verbete do dicionario
end;
function continuar ( num : integer ) : boolean ;
var
op : string ;
begin
if num = 1 then
continuar := true
else
begin
write ( 'quer continuar ? (S / N)' ) ;
op := ler ;
while ( op <> 'S' ) and ( op <> 'N') do
begin
writeln ('opcao invalida') ;
op := ler ;
end;
if op = 'S' then
continuar := true
else
continuar := false ;
end;
end;
procedure menu ( var T_lista : Tlista);
var
op : integer;
chave : string;
aux : Tlista;
begin
writeln (' 1 : adicionar_lista ') ;
writeln (' 2 : adicionar_dicionario ') ;
writeln (' 3 : consultar_lista ') ;
writeln (' 4 : consultar_dicionario ') ;
writeln (' 5 : consultar_geral ');
writeln (' 6 : remover_lista ');
writeln (' 7 : remover_dicionario ');
writeln (' 0 : sair ');
op := ler_int ;
case op of
1 : adicionar_lista (T_lista);
2 : begin
chave := ler();
aux := consultar(T_lista, chave);
if aux = nil then
writeln (' chave nao encontrada ')
else
adicionar_dicionario(aux^.dicionario);
end;
3 : consultar_lista (T_lista);
4 : consultar_dicionario (T_lista);
5 : consultar_geral (T_lista);
6 : remover_lista (T_lista);
7 : remover_dicionario (T_lista);
0 : exit;
else
writeln (' opcao invalida digite novamente : ');
end;
end;
var
lista : Tlista ;
i : integer ;
begin
i := 1;
criar_lista (lista) ;
while ( continuar(i) ) do
begin
menu (lista);
i := 0;
end;
end.
+309
View File
@@ -0,0 +1,309 @@
program pzim;
uses crt;
const
DEBUG_ATIVO = true;
type
Tverbete = ^E_Dicionario;
E_Dicionario = record
br : string; // portugues
ing : string; // ingles
prox : Tverbete;
end;
Tlista = ^E_lista ;
E_lista = record
ant : Tlista ; // anterior
key : string;
dicionario : Tverbete ;
prox : Tlista ;
end;
procedure Debug(const msg : string);
begin
if DEBUG_ATIVO then
writeln('[debug] ', msg);
end;
function ler_prompt(const msg : string) : string ;
var
temp : string ;
begin
write (msg) ;
readln( temp ) ;
Debug('entrada = "' + temp + '"');
ler_prompt := temp ;
end;
function ler_int : integer ;
var
temp : integer ;
begin
write (' digite um numero : ') ;
readln (temp) ;
if DEBUG_ATIVO then
writeln('[debug] entrada numero = ', temp);
ler_int := temp ;
end;
function CompareCI(const a, b : string) : integer;
var
aa, bb : string;
begin
aa := upcase(a);
bb := upcase(b);
if aa < bb then
CompareCI := -1
else if aa > bb then
CompareCI := 1
else
CompareCI := 0;
end;
procedure criar_lista ( var lista: Tlista );
begin
lista := nil;
end;
procedure adicionar_lista(var T_lista : Tlista );
var
novo , anterior , atual : Tlista ;
chave : string ;
begin
chave := ler_prompt(' digite a chave :');
Debug('adicionar_lista chave="' + chave + '"');
new (novo);
if novo = nil then
writeln ('memoria cheia')
else
begin
if T_lista = nil then
begin
novo^.key := chave ;
novo^.dicionario := nil;
novo^.prox := T_lista;
novo^.ant := nil ;
T_lista := novo ;
Debug('adicionar_lista inseriu no inicio');
end
else
begin
atual := T_lista ;
anterior := nil ;
while (atual <> nil) and (CompareCI(atual^.key, chave) < 0) do
begin
anterior := atual;
atual := atual^.prox;
end;
novo^.ant := anterior ;
novo^.prox := atual ;
novo^.key := chave ;
novo^.dicionario := nil;
if anterior <> nil then
anterior^.prox := novo
else
T_lista := novo ;
if atual <> nil then
atual^.ant := novo ;
Debug('adicionar_lista inseriu no meio/fim');
end;
end;
end;
procedure adicionar_dicionario(var dicionario : Tverbete);
var
aux, aux2, anterior : Tverbete;
chave_p , chave_i : string ;
// portugues /\ /\ ingles
begin
chave_p := ler_prompt(' digite a palavra em portugues :');
chave_i := ler_prompt(' digite a traducao em ingles :');
Debug('adicionar_dicionario br="' + chave_p + '" ing="' + chave_i + '"');
new(aux);
if aux = nil then
begin
writeln ('memoria cheia') ;
end
else
begin
aux^.br := chave_p ;
aux^.ing := chave_i ;
aux^.prox := nil ;
if (dicionario = nil) then
begin
dicionario := aux ;
Debug('adicionar_dicionario inseriu no inicio');
end
else // se o dicionario ja tiver verbetes, tem que inserir ordenado
begin
anterior := nil;
aux2 := dicionario ;
while (aux2 <> nil) and (CompareCI(aux2^.br, chave_p) < 0) do
begin
anterior := aux2;
aux2 := aux2^.prox ;
end;
if anterior = nil then
begin
aux^.prox := dicionario;
dicionario := aux;
Debug('adicionar_dicionario inseriu no inicio (ordenado)');
end
else
begin
aux^.prox := aux2;
anterior^.prox := aux;
Debug('adicionar_dicionario inseriu no meio/fim');
end;
end;
end;
end;
function consultar ( T_lista : Tlista ; chave : string ) : Tlista ;
var
atual : Tlista ;
begin
atual := T_lista ;
while ( atual <> nil ) and ( CompareCI(atual^.key, chave) < 0 ) do
atual := atual^.prox ;
if ( atual <> nil ) and ( CompareCI(atual^.key, chave) = 0 ) then
consultar := atual
else
consultar := nil ;
end;
procedure consultar_lista ( T_lista : Tlista );
var
aux : tlista ;
op : string ;
begin
op := ler_prompt(' qual chave deseja consultar ? ') ;
Debug('consultar_lista chave="' + op + '"');
aux := consultar( T_lista , op );
if aux = nil then
writeln (' palavra nao encontrada ')
else
write (' palavra encontrada :' , aux^.key );
end;
procedure consultar_dicionario (T_lista : Tlista );
var
aux : Tlista ;
op : string ;
begin
// TODO: consultar palavra dentro do dicionario da chave
end;
procedure consultar_geral(T_lista : Tlista);
begin
// TODO: listar todo o dicionario
end;
procedure remover_lista(var T_lista : Tlista);
begin
// TODO: remover chave da lista principal
end;
procedure remover_dicionario(var T_lista : Tlista);
begin
// TODO: remover verbete do dicionario
end;
function continuar ( num : integer ) : boolean ;
var
op : string ;
begin
if num = 1 then
continuar := true
else
begin
write ( 'quer continuar ? (S / N) ' ) ;
readln(op);
while (op = '') or ((UpCase(op[1]) <> 'S') and (UpCase(op[1]) <> 'N')) do
begin
writeln ('opcao invalida') ;
write ( ' quer continuar ? (S / N) ' ) ;
readln(op);
end;
if UpCase(op[1]) = 'S' then
continuar := true
else
continuar := false ;
if DEBUG_ATIVO then
writeln('[debug] continuar = ', continuar);
end;
end;
procedure menu ( var T_lista : Tlista);
var
op : integer;
chave : string;
aux : Tlista;
begin
writeln (' 1 : adicionar_lista ') ;
writeln (' 2 : adicionar_dicionario ') ;
writeln (' 3 : consultar_lista ') ;
writeln (' 4 : consultar_dicionario ') ;
writeln (' 5 : consultar_geral ');
writeln (' 6 : remover_lista ');
writeln (' 7 : remover_dicionario ');
writeln (' 0 : sair ');
op := ler_int ;
if DEBUG_ATIVO then
writeln('[debug] menu opcao = ', op);
case op of
1 : adicionar_lista (T_lista);
2 : begin
chave := ler_prompt(' digite a chave :');
aux := consultar(T_lista, chave);
if aux = nil then
writeln (' chave nao encontrada ')
else
adicionar_dicionario(aux^.dicionario);
end;
3 : consultar_lista (T_lista);
4 : consultar_dicionario (T_lista);
5 : consultar_geral (T_lista);
6 : remover_lista (T_lista);
7 : remover_dicionario (T_lista);
else
writeln (' opcao invalida digite novamente : ');
end;
end;
var
lista : Tlista ;
i : integer ;
begin
i := 1;
criar_lista (lista) ;
while ( continuar(i) ) do
begin
menu (lista);
i := 0;
end;
end.
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Executable
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+344
View File
@@ -0,0 +1,344 @@
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 .