mirror of
https://github.com/Gustavo-E-D-Demarchi/dicionario.git
synced 2026-07-27 16:25:46 -03:00
pronto.final
This commit is contained in:
committed by
GitHub
parent
4c2ce9de76
commit
c5f79e89cb
Vendored
-8
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
|
||||||
// for the documentation about the tasks.json format
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
program filas;
|
|
||||||
|
|
||||||
uses crt;
|
|
||||||
|
|
||||||
type tipo_inf = integer;
|
|
||||||
ptnodo = ^elemento;
|
|
||||||
elemento = record
|
|
||||||
dado:tipo_inf;
|
|
||||||
prox:ptnodo
|
|
||||||
end;
|
|
||||||
|
|
||||||
var lista_numero:ptnodo;
|
|
||||||
num:tipo_inf;
|
|
||||||
op:byte;
|
|
||||||
|
|
||||||
Procedure leitura(var inf:tipo_inf);
|
|
||||||
|
|
||||||
begin
|
|
||||||
clrscr;
|
|
||||||
WRITE ('Digite o numero: ');
|
|
||||||
readln (inf);
|
|
||||||
end;
|
|
||||||
|
|
||||||
Procedure Cria_fila(Var fila:ptnodo);
|
|
||||||
|
|
||||||
Begin
|
|
||||||
fila:=nil;
|
|
||||||
End;
|
|
||||||
|
|
||||||
{Funcao para Incluir no Inicio da fila}
|
|
||||||
|
|
||||||
Procedure Inclui (Var fila:ptnodo;inf:tipo_inf);
|
|
||||||
var aux,aux2:ptnodo;
|
|
||||||
|
|
||||||
Begin
|
|
||||||
new(aux);
|
|
||||||
if aux=nil then begin
|
|
||||||
gotoxy (5,20);
|
|
||||||
write ('Memoria cheia');
|
|
||||||
readkey;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
Begin
|
|
||||||
if (fila=nil) then {Primeiro elemento}
|
|
||||||
begin
|
|
||||||
aux^.dado:=inf;
|
|
||||||
aux^.prox:=fila;
|
|
||||||
fila:=aux;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin {Inclui no Fim da Fila}
|
|
||||||
aux2:=fila;
|
|
||||||
while (aux2^.prox <> nil) do begin
|
|
||||||
aux2:=aux2^.prox;
|
|
||||||
end;
|
|
||||||
aux^.dado:=inf;
|
|
||||||
aux^.prox:=nil;
|
|
||||||
aux2^.prox:=aux;
|
|
||||||
end
|
|
||||||
End;
|
|
||||||
End;
|
|
||||||
|
|
||||||
|
|
||||||
{Funcao para Remover no Inicio da fila}
|
|
||||||
|
|
||||||
Procedure Remove (Var fila:ptnodo);
|
|
||||||
var aux:ptnodo;
|
|
||||||
|
|
||||||
Begin
|
|
||||||
if fila=nil then begin
|
|
||||||
Gotoxy (5,20);
|
|
||||||
Writeln('fila Vazia');
|
|
||||||
readkey;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
Begin
|
|
||||||
aux:=fila;
|
|
||||||
Gotoxy (5,20);
|
|
||||||
Writeln('Elemento retirado ', aux^.dado);
|
|
||||||
fila:=aux^.prox;
|
|
||||||
dispose(aux);
|
|
||||||
readkey;
|
|
||||||
End;
|
|
||||||
End;
|
|
||||||
|
|
||||||
|
|
||||||
{Funcao para Contar Elementos da fila}
|
|
||||||
|
|
||||||
Function Conta_Elementos (fila:ptnodo):byte;
|
|
||||||
var aux:ptnodo;
|
|
||||||
i:byte;
|
|
||||||
|
|
||||||
Begin
|
|
||||||
if fila=nil then
|
|
||||||
i:=0
|
|
||||||
else
|
|
||||||
Begin
|
|
||||||
i:=0;
|
|
||||||
aux:=fila;
|
|
||||||
while aux <> nil do
|
|
||||||
begin
|
|
||||||
i:=i+1;
|
|
||||||
writeln(i,' - ',aux^.dado);
|
|
||||||
aux:=aux^.prox;
|
|
||||||
end;
|
|
||||||
End;
|
|
||||||
Conta_elementos:=i
|
|
||||||
End;
|
|
||||||
|
|
||||||
|
|
||||||
begin
|
|
||||||
op:=1;
|
|
||||||
cria_fila(lista_numero);
|
|
||||||
while op<>0 do
|
|
||||||
begin
|
|
||||||
clrscr;
|
|
||||||
writeln ('0-Sair');
|
|
||||||
writeln ('1-Incluir');
|
|
||||||
writeln ('2-Remover');
|
|
||||||
writeln ('3-Contar Elementos');
|
|
||||||
readln (op);
|
|
||||||
writeln;
|
|
||||||
case op of
|
|
||||||
1: begin
|
|
||||||
leitura(num);
|
|
||||||
inclui(lista_numero,num)
|
|
||||||
end;
|
|
||||||
2: begin
|
|
||||||
remove(lista_numero);
|
|
||||||
end;
|
|
||||||
3: begin
|
|
||||||
writeln (conta_elementos(lista_numero),' elementos');
|
|
||||||
readkey;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end.
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# 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
|
|
||||||
-309
@@ -1,309 +0,0 @@
|
|||||||
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.
|
|
||||||
+312
-77
@@ -1,135 +1,370 @@
|
|||||||
# 📚 Projeto PZIM — Dicionário com Lista Encadeada em Pascal
|
# Dicionário Português-Inglês em Pascal
|
||||||
|
|
||||||
Este projeto implementa um sistema de dicionário utilizando **listas encadeadas duplamente ligadas** em Pascal.
|
## Descrição
|
||||||
Cada elemento da lista principal representa uma chave (categoria), e cada chave possui um sub-dicionário de palavras (português → inglês).
|
|
||||||
|
Este programa implementa um dicionário Português-Inglês utilizando listas encadeadas dinâmicas em Pascal.
|
||||||
|
|
||||||
|
A estrutura principal é composta por:
|
||||||
|
|
||||||
|
* Uma lista duplamente encadeada de chaves.
|
||||||
|
* Cada chave possui um dicionário próprio.
|
||||||
|
* Cada dicionário é uma lista simplesmente encadeada de verbetes.
|
||||||
|
|
||||||
|
Cada verbete contém:
|
||||||
|
|
||||||
|
* Palavra em português.
|
||||||
|
* Tradução em inglês.
|
||||||
|
|
||||||
|
Exemplo:
|
||||||
|
|
||||||
|
Chave: A
|
||||||
|
|
||||||
|
* Abacaxi = Pineapple
|
||||||
|
* Amor = Love
|
||||||
|
* Avião = Airplane
|
||||||
|
|
||||||
|
Chave: M
|
||||||
|
|
||||||
|
* Mesa = Table
|
||||||
|
* Morango = Strawberry
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧠 Estrutura de Dados
|
# Estruturas Utilizadas
|
||||||
|
|
||||||
### 📌 Lista principal (Tlista)
|
## Tverbete
|
||||||
Cada nó representa uma chave:
|
|
||||||
|
|
||||||
- `key` → nome da categoria
|
Representa um verbete do dicionário.
|
||||||
- `ant` → ponteiro para o anterior
|
|
||||||
- `prox` → ponteiro para o próximo
|
|
||||||
- `dicionario` → ponteiro para a lista de verbetes
|
|
||||||
|
|
||||||
### 📌 Dicionário (Tverbete)
|
Campos:
|
||||||
Cada nó representa uma palavra:
|
|
||||||
|
|
||||||
- `br` → palavra em português
|
* br: palavra em português.
|
||||||
- `ing` → tradução em inglês
|
* ing: tradução em inglês.
|
||||||
- `prox` → próximo verbete
|
* prox: próximo verbete da lista.
|
||||||
|
|
||||||
|
## Tlista
|
||||||
|
|
||||||
|
Representa uma chave do dicionário.
|
||||||
|
|
||||||
|
Campos:
|
||||||
|
|
||||||
|
* key: letra ou chave identificadora.
|
||||||
|
* dicionario: lista de verbetes pertencentes à chave.
|
||||||
|
* ant: chave anterior.
|
||||||
|
* prox: próxima chave.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🟢 Estado Atual do Projeto
|
# Funções
|
||||||
|
|
||||||
### ✔ Estrutura de dados
|
## ler
|
||||||
- Lista encadeada dupla implementada
|
|
||||||
- Sublistas de dicionário por chave
|
Lê uma string digitada pelo usuário.
|
||||||
- Inserção ordenada nas listas
|
|
||||||
|
Retorno:
|
||||||
|
|
||||||
|
* String informada pelo usuário.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🟡 Funcionalidades Implementadas
|
## ler_int
|
||||||
|
|
||||||
### 📌 Funções básicas
|
Lê um número inteiro digitado pelo usuário.
|
||||||
- Leitura de string (`ler`)
|
|
||||||
- Leitura de inteiro (`ler_int`)
|
Retorno:
|
||||||
- Função de continuar execução (`continuar`)
|
|
||||||
- Consulta de elementos na lista (`consultar`)
|
* Valor inteiro informado.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 📌 Lista principal (Tlista)
|
## buscar_verbete
|
||||||
- Criar lista
|
|
||||||
- Adicionar chave (inserção ordenada)
|
Procura uma palavra dentro de um dicionário.
|
||||||
|
|
||||||
|
Parâmetros:
|
||||||
|
|
||||||
|
* D: dicionário onde será feita a busca.
|
||||||
|
* P: palavra procurada.
|
||||||
|
|
||||||
|
Retorno:
|
||||||
|
|
||||||
|
* Ponteiro para o verbete encontrado.
|
||||||
|
* Nil caso não exista.
|
||||||
|
|
||||||
|
Método utilizado:
|
||||||
|
|
||||||
|
Busca recursiva.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 📌 Dicionário (Tverbete)
|
## encontrar_lista
|
||||||
- Inserção de palavras por chave
|
|
||||||
- Inserção ordenada no sub-dicionário
|
Localiza a chave responsável por armazenar determinada palavra.
|
||||||
- Associação de palavras a uma chave existente
|
|
||||||
|
Parâmetros:
|
||||||
|
|
||||||
|
* T_lista: lista principal.
|
||||||
|
* palavra: palavra a ser localizada.
|
||||||
|
|
||||||
|
Retorno:
|
||||||
|
|
||||||
|
* Ponteiro para a chave adequada.
|
||||||
|
* Nil caso não exista chave compatível.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔴 Funcionalidades Faltantes
|
# Procedimentos
|
||||||
|
|
||||||
### 📌 Lista principal
|
## lista_iniciar
|
||||||
- Remover nó da lista (`remover_lista`)
|
|
||||||
- Listagem completa das chaves
|
Inicializa a estrutura principal.
|
||||||
- Percorrer e exibir estrutura completa
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Define a lista principal como vazia.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 📌 Dicionário
|
## dicionario_adicionar
|
||||||
- Remover verbete (`remover_dicionario`)
|
|
||||||
- Buscar palavra diretamente no dicionário
|
Insere um novo verbete em ordem alfabética.
|
||||||
- Listar palavras de uma chave
|
|
||||||
|
Parâmetros:
|
||||||
|
|
||||||
|
* dicionario
|
||||||
|
* br
|
||||||
|
* ing
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Cria um novo verbete.
|
||||||
|
* Insere mantendo a ordenação alfabética.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 📌 Integração
|
## dicionario_remover
|
||||||
- Consulta geral (lista + dicionário)
|
|
||||||
- Sincronização robusta entre lista e sublistas
|
Remove um verbete de um dicionário.
|
||||||
- Melhor tratamento de erros e validações
|
|
||||||
|
Parâmetros:
|
||||||
|
|
||||||
|
* dicionario
|
||||||
|
* palavra
|
||||||
|
* removido
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Procura a palavra.
|
||||||
|
* Remove da lista.
|
||||||
|
* Retorna o ponteiro removido.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 📌 Sistema / Menu
|
## lista_adicionar
|
||||||
- Melhor tratamento de opção inválida
|
|
||||||
- Finalização controlada do programa
|
Insere uma nova chave.
|
||||||
- Organização das chamadas do menu
|
|
||||||
|
Parâmetros:
|
||||||
|
|
||||||
|
* lista
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Cria uma nova chave.
|
||||||
|
* Mantém as chaves ordenadas.
|
||||||
|
* Atualiza ponteiros anterior e próximo.
|
||||||
|
* Redistribui verbetes quando necessário.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚨 Problemas Identificados
|
## redistribuir_verbetes
|
||||||
|
|
||||||
- Lógica de verificação de palavras pode ser simplificada
|
Redistribui verbetes após a criação de uma nova chave.
|
||||||
- Algumas inserções precisam de melhor controle de fluxo
|
|
||||||
- Falta padronização em validações
|
Parâmetros:
|
||||||
- Algumas funções ainda não implementadas
|
|
||||||
|
* lista
|
||||||
|
* chave
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Localiza a nova chave.
|
||||||
|
* Analisa o dicionário da chave anterior.
|
||||||
|
* Separa os verbetes que agora pertencem à nova chave.
|
||||||
|
* Move esses verbetes para o novo dicionário.
|
||||||
|
|
||||||
|
Exemplo:
|
||||||
|
|
||||||
|
Antes:
|
||||||
|
|
||||||
|
Chave A
|
||||||
|
|
||||||
|
* Abacaxi
|
||||||
|
* Banana
|
||||||
|
* Morango
|
||||||
|
|
||||||
|
Após criar a chave M:
|
||||||
|
|
||||||
|
Chave A
|
||||||
|
|
||||||
|
* Abacaxi
|
||||||
|
* Banana
|
||||||
|
|
||||||
|
Chave M
|
||||||
|
|
||||||
|
* Morango
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧭 Prioridades de Desenvolvimento
|
## mover_verbetes_para_listas
|
||||||
|
|
||||||
Para evoluir o projeto corretamente:
|
Redistribui verbetes quando uma chave é removida.
|
||||||
|
|
||||||
1. 🔧 Corrigir e simplificar `verificar_palavra`
|
Parâmetros:
|
||||||
2. ➖ Implementar `remover_lista`
|
|
||||||
3. ➖ Implementar `remover_dicionario`
|
* lista
|
||||||
4. 🔍 Criar `consultar_geral`
|
* origem
|
||||||
5. 📋 Implementar listagem completa
|
|
||||||
6. 🧪 Testar inserção, busca e remoção
|
Ação:
|
||||||
|
|
||||||
|
* Percorre todos os verbetes da chave removida.
|
||||||
|
* Procura uma nova chave compatível.
|
||||||
|
* Reinsere os verbetes.
|
||||||
|
* Descarta os verbetes sem destino válido.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 💡 Objetivo do Projeto
|
## adicionar_dicionario
|
||||||
|
|
||||||
O objetivo é praticar:
|
Adiciona uma nova palavra ao sistema.
|
||||||
|
|
||||||
- Estruturas de dados dinâmicas
|
Ação:
|
||||||
- Listas encadeadas duplas
|
|
||||||
- Organização de dicionários em subestruturas
|
* Solicita palavra em português.
|
||||||
- Manipulação de ponteiros em Pascal
|
* Solicita tradução.
|
||||||
- Lógica de inserção e busca ordenada
|
* Localiza a chave correta.
|
||||||
|
* Insere o verbete.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🛠 Tecnologias
|
## consultar_lista
|
||||||
|
|
||||||
- Linguagem: Pascal
|
Exibe todas as chaves cadastradas.
|
||||||
- Biblioteca: CRT (entrada/saída básica)
|
|
||||||
- Estrutura: Listas encadeadas
|
Ação:
|
||||||
|
|
||||||
|
* Percorre a lista principal.
|
||||||
|
* Mostra cada chave.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📌 Observação
|
## consultar_dicionario
|
||||||
|
|
||||||
Este projeto está em desenvolvimento e ainda possui funcionalidades incompletas, mas já demonstra uma estrutura funcional de dicionário hierárquico com listas encadeadas.
|
Busca uma palavra específica.
|
||||||
|
|
||||||
---
|
Ação:
|
||||||
|
|
||||||
|
* Procura a palavra em todas as chaves.
|
||||||
|
* Exibe a tradução caso encontrada.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## consultar_geral
|
||||||
|
|
||||||
|
Exibe todo o conteúdo do sistema.
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Mostra todas as chaves.
|
||||||
|
* Mostra todos os verbetes de cada chave.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## remover_dicionario
|
||||||
|
|
||||||
|
Remove uma palavra do sistema.
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Procura a palavra.
|
||||||
|
* Remove o verbete.
|
||||||
|
* Libera a memória utilizada.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## remover_lista
|
||||||
|
|
||||||
|
Remove uma chave inteira.
|
||||||
|
|
||||||
|
Ação:
|
||||||
|
|
||||||
|
* Remove a chave da lista principal.
|
||||||
|
* Redistribui seus verbetes.
|
||||||
|
* Libera a memória da chave removida.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## menu
|
||||||
|
|
||||||
|
Controla a interação com o usuário.
|
||||||
|
|
||||||
|
Opções:
|
||||||
|
|
||||||
|
1 - Adicionar chave
|
||||||
|
|
||||||
|
2 - Adicionar palavra
|
||||||
|
|
||||||
|
3 - Consultar chaves
|
||||||
|
|
||||||
|
4 - Consultar palavra
|
||||||
|
|
||||||
|
5 - Consultar geral
|
||||||
|
|
||||||
|
6 - Remover chave
|
||||||
|
|
||||||
|
7 - Remover palavra
|
||||||
|
|
||||||
|
0 - Sair
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Fluxo Geral do Programa
|
||||||
|
|
||||||
|
1. Inicializa a lista principal.
|
||||||
|
2. Exibe o menu.
|
||||||
|
3. Recebe a opção do usuário.
|
||||||
|
4. Executa a operação escolhida.
|
||||||
|
5. Retorna ao menu.
|
||||||
|
6. Encerra quando o usuário selecionar a opção 0.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Conceitos Aplicados
|
||||||
|
|
||||||
|
* Ponteiros
|
||||||
|
* Alocação dinâmica
|
||||||
|
* Listas simplesmente encadeadas
|
||||||
|
* Listas duplamente encadeadas
|
||||||
|
* Recursão
|
||||||
|
* Manipulação de memória
|
||||||
|
* Ordenação alfabética
|
||||||
|
* Estruturas de dados dinâmicas
|
||||||
|
|
||||||
|
Lista Principal
|
||||||
|
|
||||||
|
[A] <-> [M] <-> [S]
|
||||||
|
|
||||||
|
[A]
|
||||||
|
|
|
||||||
|
v
|
||||||
|
Abacaxi -> Amor -> Avião
|
||||||
|
|
||||||
|
[M]
|
||||||
|
|
|
||||||
|
v
|
||||||
|
Mesa -> Morango
|
||||||
|
|
||||||
|
[S]
|
||||||
|
|
|
||||||
|
v
|
||||||
|
Sapato -> Sol
|
||||||
+407
-285
@@ -1,344 +1,466 @@
|
|||||||
program dicionario;
|
program pzim;
|
||||||
|
uses crt;
|
||||||
|
|
||||||
type
|
type
|
||||||
TponteiroDic = ^dic;
|
Tverbete = ^E_Dicionario;
|
||||||
|
E_Dicionario = record
|
||||||
|
br : string;
|
||||||
|
ing : string;
|
||||||
|
prox : Tverbete;
|
||||||
|
end;
|
||||||
|
|
||||||
dic = record
|
Tlista = ^E_lista;
|
||||||
verbete: string;
|
E_lista = record
|
||||||
prox: Tponteirodic;
|
ant : Tlista;
|
||||||
end;
|
key : string;
|
||||||
|
dicionario : Tverbete;
|
||||||
|
prox : Tlista;
|
||||||
|
end;
|
||||||
|
|
||||||
Tponteiro = ^no;
|
|
||||||
no = record
|
|
||||||
palavra: string;
|
|
||||||
dic: TponteiroDic;
|
|
||||||
prox: Tponteiro;
|
|
||||||
ant: Tponteiro;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Tlista = record
|
|
||||||
inicio: Tponteiro;
|
|
||||||
fim: Tponteiro;
|
|
||||||
end;
|
|
||||||
|
|
||||||
var lista: Tlista;
|
function ler : string;
|
||||||
op: integer;
|
var
|
||||||
palavra, verbete: string;
|
temp : string;
|
||||||
|
|
||||||
function verificaVazio(l: tlista): boolean;
|
|
||||||
begin
|
begin
|
||||||
verificaVazio:= l.inicio = nil;
|
write (' digite a palavra : ');
|
||||||
|
readln(temp);
|
||||||
|
ler := temp;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure inicializarLista(var l: tlista);
|
function ler_int : integer;
|
||||||
|
var
|
||||||
|
temp : integer;
|
||||||
begin
|
begin
|
||||||
l.inicio:= nil;
|
write (' digite um numero : ');
|
||||||
l.fim:= nil;
|
readln(temp);
|
||||||
|
ler_int := temp;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function verificaPalavra(l: tlista; p: string): boolean;
|
|
||||||
var aux: Tponteiro;
|
function buscar_verbete (D : Tverbete; P : string) : Tverbete;
|
||||||
begin
|
begin
|
||||||
aux:= l.inicio;
|
if D = nil then
|
||||||
while (aux <> nil) and (aux^.palavra <> p) do
|
buscar_verbete := nil
|
||||||
aux:= aux^.prox;
|
|
||||||
if aux = nil then
|
|
||||||
verificaPalavra:= false
|
|
||||||
else
|
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
|
begin
|
||||||
aux2:= aux^.dic;
|
if D^.br = P then
|
||||||
while (aux2 <> nil) and (aux2^.verbete <> v) do
|
buscar_verbete := D
|
||||||
aux2:= aux2^.prox;
|
|
||||||
if aux2 = nil then
|
|
||||||
verificaVerbete:= false
|
|
||||||
else
|
else
|
||||||
verificaVerbete:= true;
|
buscar_verbete := buscar_verbete(D^.prox , P);
|
||||||
end
|
end;
|
||||||
else
|
|
||||||
verificaVerbete:= false;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
procedure inserirPalavra(var l: Tlista; p: string);
|
function encontrar_lista (T_lista : Tlista; palavra : string) : Tlista;
|
||||||
var novo, temp, aux: Tponteiro;
|
var
|
||||||
|
aux : Tlista;
|
||||||
|
melhor : Tlista;
|
||||||
begin
|
begin
|
||||||
new(novo);
|
aux := T_lista;
|
||||||
if novo <> nil then
|
melhor := nil;
|
||||||
|
|
||||||
|
while aux <> nil do
|
||||||
|
begin
|
||||||
|
if UpCase(palavra[1]) >= UpCase(aux^.key[1]) then
|
||||||
|
begin
|
||||||
|
melhor := aux;
|
||||||
|
end;
|
||||||
|
aux := aux^.prox;
|
||||||
|
end;
|
||||||
|
|
||||||
|
encontrar_lista := melhor; // retorna a lista pra inserir ou nil se nao achar nada, vulgo lista vazia
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure redistribuir_verbetes (var lista : Tlista; chave : string);
|
||||||
|
var
|
||||||
|
nova : Tlista;
|
||||||
|
ant_d , aux_d : Tverbete;
|
||||||
|
primeira , sair : boolean;
|
||||||
|
begin
|
||||||
|
ant_d := nil;
|
||||||
|
nova := lista;
|
||||||
|
while (nova <> nil) and (nova^.key <> chave) do
|
||||||
|
nova := nova^.prox;
|
||||||
|
|
||||||
|
if (nova = nil) or (nova^.ant = nil) then
|
||||||
|
begin
|
||||||
|
primeira := true;
|
||||||
|
aux_d := nil;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
primeira := false;
|
||||||
|
aux_d := nova^.ant^.dicionario;
|
||||||
|
end;
|
||||||
|
sair := false ;
|
||||||
|
|
||||||
|
|
||||||
|
while (aux_d <> nil) and (not primeira) and (not sair) do
|
||||||
|
begin
|
||||||
|
if UpCase(aux_d^.br[1]) >= UpCase(nova^.key[1]) then
|
||||||
begin
|
begin
|
||||||
if not verificaPalavra(l, p) then
|
if ant_d = nil then
|
||||||
begin
|
nova^.ant^.dicionario := nil
|
||||||
novo^.prox:= nil;
|
else
|
||||||
novo^.ant:= nil;
|
ant_d^.prox := nil;
|
||||||
novo^.dic:= nil;
|
|
||||||
novo^.palavra:= p;
|
nova^.dicionario := aux_d;
|
||||||
if verificaVazio(l) then
|
|
||||||
begin
|
sair := true;
|
||||||
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
|
end
|
||||||
else
|
else
|
||||||
writeln('Memória cheia hahaha');
|
begin
|
||||||
|
ant_d := aux_d;
|
||||||
|
aux_d := aux_d^.prox;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure inserirVerbete(var l: tLista; p, v: string);
|
|
||||||
var novo, temp, temp2: TponteiroDIc;
|
procedure lista_iniciar (var lista : Tlista);
|
||||||
aux: Tponteiro;
|
|
||||||
begin
|
begin
|
||||||
new(novo);
|
lista := nil;
|
||||||
if novo <> nil then
|
end;
|
||||||
|
|
||||||
|
procedure dicionario_adicionar (var dicionario : Tverbete; br , ing : string);
|
||||||
|
var
|
||||||
|
novo , aux_atual , aux_ant : Tverbete;
|
||||||
|
begin
|
||||||
|
new (novo);
|
||||||
|
|
||||||
|
novo^.br := br;
|
||||||
|
novo^.ing := ing;
|
||||||
|
novo^.prox := nil;
|
||||||
|
|
||||||
|
aux_atual := dicionario;
|
||||||
|
aux_ant := nil;
|
||||||
|
|
||||||
|
while (aux_atual <> nil) and (aux_atual^.br < novo^.br) do
|
||||||
begin
|
begin
|
||||||
if not verificaVerbete(l, p, v) then
|
aux_ant := aux_atual;
|
||||||
|
aux_atual := aux_atual^.prox;
|
||||||
|
end;
|
||||||
|
|
||||||
|
novo^.prox := aux_atual;
|
||||||
|
|
||||||
|
if aux_ant = nil then
|
||||||
|
dicionario := novo
|
||||||
|
else
|
||||||
|
aux_ant^.prox := novo;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure dicionario_remover (var dicionario : Tverbete; palavra : string; var removido : Tverbete);
|
||||||
|
var
|
||||||
|
aux , ant : Tverbete;
|
||||||
|
begin
|
||||||
|
removido := nil;
|
||||||
|
aux := dicionario;
|
||||||
|
ant := nil;
|
||||||
|
|
||||||
|
while (aux <> nil) and (removido = nil) do
|
||||||
|
begin
|
||||||
|
if aux^.br = palavra then
|
||||||
begin
|
begin
|
||||||
aux:= l.inicio;
|
if ant = nil then
|
||||||
novo^.verbete:= v;
|
dicionario := aux^.prox
|
||||||
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
|
else
|
||||||
writeln('Palavra não encontrada');
|
ant^.prox := aux^.prox;
|
||||||
end
|
|
||||||
|
aux^.prox := nil;
|
||||||
|
removido := aux;
|
||||||
|
aux := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
ant := aux;
|
||||||
|
aux := aux^.prox;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure lista_adicionar (var lista : Tlista);
|
||||||
|
var
|
||||||
|
novo , anterior , atual : Tlista;
|
||||||
|
chave:string;
|
||||||
|
begin
|
||||||
|
chave := ler();
|
||||||
|
new (novo);
|
||||||
|
|
||||||
|
novo^.key := chave;
|
||||||
|
novo^.dicionario := nil;
|
||||||
|
novo^.prox := nil;
|
||||||
|
novo^.ant := nil;
|
||||||
|
|
||||||
|
atual := lista;
|
||||||
|
anterior := nil;
|
||||||
|
|
||||||
|
while (atual <> nil) and (atual^.key < chave) do
|
||||||
|
begin
|
||||||
|
anterior := atual;
|
||||||
|
atual := atual^.prox;
|
||||||
|
end;
|
||||||
|
|
||||||
|
novo^.ant := anterior;
|
||||||
|
novo^.prox := atual;
|
||||||
|
|
||||||
|
if anterior <> nil then
|
||||||
|
anterior^.prox := novo
|
||||||
|
else
|
||||||
|
lista := novo;
|
||||||
|
|
||||||
|
if atual <> nil then
|
||||||
|
atual^.ant := novo;
|
||||||
|
|
||||||
|
redistribuir_verbetes (lista , chave);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure mover_verbetes_para_listas (var lista : Tlista; var origem : Tverbete);
|
||||||
|
var
|
||||||
|
aux_d , prox_d : Tverbete;
|
||||||
|
destino : Tlista;
|
||||||
|
begin
|
||||||
|
aux_d := origem;
|
||||||
|
origem := nil;
|
||||||
|
|
||||||
|
while aux_d <> nil do
|
||||||
|
begin
|
||||||
|
prox_d := aux_d^.prox;
|
||||||
|
aux_d^.prox := nil;
|
||||||
|
|
||||||
|
destino := encontrar_lista (lista , aux_d^.br);
|
||||||
|
|
||||||
|
if destino <> nil then
|
||||||
|
dicionario_adicionar (destino^.dicionario , aux_d^.br , aux_d^.ing)
|
||||||
else
|
else
|
||||||
writeln('O verbete ja está na lista')
|
dispose (aux_d);
|
||||||
|
|
||||||
|
aux_d := prox_d;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure adicionar_dicionario (var lista : Tlista);
|
||||||
|
var
|
||||||
|
aux_l : Tlista;
|
||||||
|
chave_p , chave_i : string;
|
||||||
|
begin
|
||||||
|
writeln(' digite a palavra em portugues : ');
|
||||||
|
chave_p := ler;
|
||||||
|
|
||||||
|
writeln(' digite a traducao em ingles : ');
|
||||||
|
chave_i := ler;
|
||||||
|
|
||||||
|
aux_l := encontrar_lista (lista , chave_p);
|
||||||
|
|
||||||
|
if aux_l = nil then
|
||||||
|
begin
|
||||||
|
writeln(' nenhuma chave encontrada ');
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
writeln('Memória cheia');
|
begin
|
||||||
|
if buscar_verbete(aux_l^.dicionario, chave_p) <> nil then
|
||||||
|
writeln(' palavra ja existe ')
|
||||||
|
else
|
||||||
|
dicionario_adicionar(aux_l^.dicionario, chave_p, chave_i);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure removerVerbete(var l: Tlista; p: string; v: string);
|
procedure consultar_lista (T_lista : Tlista);
|
||||||
var aux: Tponteiro;
|
var
|
||||||
temp, temp2: TponteiroDIc;
|
aux : Tlista;
|
||||||
begin
|
begin
|
||||||
if verificaVazio(l) then
|
aux := T_lista;
|
||||||
writeln('Lista de palavras vazia')
|
|
||||||
|
if aux = nil then
|
||||||
|
begin
|
||||||
|
writeln(' lista vazia ');
|
||||||
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
aux:= l.inicio;
|
while aux <> nil do
|
||||||
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
|
begin
|
||||||
temp:= aux^.dic;
|
writeln(' chave : ' , aux^.key);
|
||||||
aux^.dic:= aux^.dic^.prox;
|
aux := aux^.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;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure consultar(l: Tlista; p: string);
|
procedure consultar_dicionario (T_lista : Tlista);
|
||||||
var aux: Tponteiro;
|
var
|
||||||
temp: TponteiroDic;
|
aux_l : Tlista;
|
||||||
|
aux_d : Tverbete;
|
||||||
|
palavra : string;
|
||||||
|
encontrou : boolean;
|
||||||
begin
|
begin
|
||||||
if verificaVazio(l) then
|
palavra := ler;
|
||||||
writeln('Lista vazia')
|
|
||||||
else
|
aux_l := T_lista;
|
||||||
|
encontrou := false;
|
||||||
|
|
||||||
|
while (aux_l <> nil) and (not encontrou) do
|
||||||
begin
|
begin
|
||||||
aux:= l.inicio;
|
aux_d := buscar_verbete (aux_l^.dicionario , palavra);
|
||||||
while (aux <> nil) and (aux^.palavra <> p) do
|
if aux_d <> nil then
|
||||||
aux:= aux^.prox;
|
|
||||||
if aux = nil then
|
|
||||||
writeln('Palavra não encontrada')
|
|
||||||
else
|
|
||||||
begin
|
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;
|
writeln;
|
||||||
aux:= aux^.prox;
|
writeln(' chave : ' , aux_l^.key);
|
||||||
|
writeln(aux_d^.br , ' = ' , aux_d^.ing);
|
||||||
|
encontrou := true;
|
||||||
end;
|
end;
|
||||||
|
aux_l := aux_l^.prox;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if not encontrou then
|
||||||
|
writeln(' palavra nao encontrada ');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function formatarString(s: string): string;
|
procedure consultar_geral (T_lista : Tlista);
|
||||||
var i: integer;
|
var
|
||||||
resultado: string;
|
aux_l : Tlista;
|
||||||
|
aux_d : Tverbete;
|
||||||
begin
|
begin
|
||||||
resultado:= '';
|
aux_l := T_lista;
|
||||||
if length(s) > 0 then
|
if aux_l = nil then
|
||||||
begin
|
begin
|
||||||
resultado:= upcase(s[1]);
|
wrieln(' lista vazia ');
|
||||||
for i:= 2 to length(s) do
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
while aux_l <> nil do
|
||||||
begin
|
begin
|
||||||
if (s[i] >= 'A') and (s[i] <= 'Z') then
|
writeln;
|
||||||
resultado:= resultado + char(ord(s[i]) + 32)
|
writeln(' chave : ' , aux_l^.key);
|
||||||
|
|
||||||
|
aux_d := aux_l^.dicionario;
|
||||||
|
|
||||||
|
if aux_d = nil then
|
||||||
|
begin
|
||||||
|
writeln(' dicionario vazio ');
|
||||||
|
end
|
||||||
else
|
else
|
||||||
resultado:= resultado + s[i];
|
begin
|
||||||
|
while aux_d <> nil do
|
||||||
|
begin
|
||||||
|
writeln(' ',aux_d^.br ,' = ' ,aux_d^.ing);
|
||||||
|
aux_d := aux_d^.prox;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
aux_l := aux_l^.prox;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
formatarString:= resultado;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure remover_dicionario (T_lista : Tlista);
|
||||||
|
var
|
||||||
|
aux_l : Tlista;
|
||||||
|
aux_d : Tverbete;
|
||||||
|
palavra : string;
|
||||||
|
achou : boolean;
|
||||||
begin
|
begin
|
||||||
inicializarLista(lista);
|
palavra := ler;
|
||||||
op:= 0;
|
|
||||||
while op <> 6 do
|
aux_l := T_lista;
|
||||||
|
achou := false;
|
||||||
|
|
||||||
|
while (aux_l <> nil) and (not achou) do
|
||||||
|
begin
|
||||||
|
|
||||||
|
dicionario_remover (aux_l^.dicionario , palavra , aux_d);
|
||||||
|
|
||||||
|
if aux_d <> nil then
|
||||||
begin
|
begin
|
||||||
writeln;
|
dispose (aux_d);
|
||||||
writeln('1 - Inserir palavra');
|
achou := true;
|
||||||
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;
|
||||||
end .
|
aux_l := aux_l^.prox;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if achou then
|
||||||
|
writeln(' palavra removida ')
|
||||||
|
else
|
||||||
|
writeln(' palavra nao encontrada ');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure remover_lista(var lista : Tlista);
|
||||||
|
var
|
||||||
|
aux, ant : Tlista;
|
||||||
|
aux_d : Tverbete;
|
||||||
|
chave : string;
|
||||||
|
begin
|
||||||
|
writeln(' digite a chave : ');
|
||||||
|
chave := ler;
|
||||||
|
aux := lista;
|
||||||
|
ant := nil;
|
||||||
|
|
||||||
|
while (aux <> nil) and (aux^.key <> chave) do
|
||||||
|
begin
|
||||||
|
ant := aux;
|
||||||
|
aux := aux^.prox;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if aux = nil then
|
||||||
|
writeln(' chave nao encontrada ')
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if ant = nil then
|
||||||
|
lista := aux^.prox
|
||||||
|
else
|
||||||
|
ant^.prox := aux^.prox;
|
||||||
|
|
||||||
|
if aux^.prox <> nil then
|
||||||
|
aux^.prox^.ant := ant;
|
||||||
|
|
||||||
|
aux_d := aux^.dicionario;
|
||||||
|
aux^.dicionario := nil;
|
||||||
|
mover_verbetes_para_listas(lista, aux_d);
|
||||||
|
dispose(aux);
|
||||||
|
writeln(' chave removida ');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure menu (var lista : Tlista; var j : integer);
|
||||||
|
var
|
||||||
|
op : integer;
|
||||||
|
begin
|
||||||
|
writeln;
|
||||||
|
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 : lista_adicionar (lista);
|
||||||
|
2 : adicionar_dicionario (lista);
|
||||||
|
3 : consultar_lista (lista);
|
||||||
|
4 : consultar_dicionario (lista);
|
||||||
|
5 : consultar_geral (lista);
|
||||||
|
6 : remover_lista (lista);
|
||||||
|
7 : remover_dicionario (lista);
|
||||||
|
|
||||||
|
0 : begin
|
||||||
|
writeln(' saindo... ');
|
||||||
|
j := 0;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
writeln(' opcao invalida ');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
lista : Tlista;
|
||||||
|
i : integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
|
||||||
|
lista_iniciar (lista);
|
||||||
|
|
||||||
|
while i = 1 do
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
end.
|
||||||
|
|||||||
Reference in New Issue
Block a user