pronto.final

This commit is contained in:
Gustavo Erlindo Dellajustina Demarchi
2026-06-16 19:28:47 +00:00
committed by GitHub
parent 4c2ce9de76
commit c5f79e89cb
6 changed files with 719 additions and 846 deletions
-8
View File
@@ -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": [
]
}
-137
View File
@@ -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.
-30
View File
@@ -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
View File
@@ -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
View File
@@ -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.
Cada elemento da lista principal representa uma chave (categoria), e cada chave possui um sub-dicionário de palavras (português → inglês).
## Descrição
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)
Cada nó representa uma chave:
## Tverbete
- `key` → nome da categoria
- `ant` → ponteiro para o anterior
- `prox` → ponteiro para o próximo
- `dicionario` → ponteiro para a lista de verbetes
Representa um verbete do dicionário.
### 📌 Dicionário (Tverbete)
Cada nó representa uma palavra:
Campos:
- `br` → palavra em português
- `ing` → tradução em inglês
- `prox` → próximo verbete
* br: palavra em português.
* ing: tradução em inglês.
* 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
- Lista encadeada dupla implementada
- Sublistas de dicionário por chave
- Inserção ordenada nas listas
## ler
Lê uma string digitada pelo usuário.
Retorno:
* String informada pelo usuário.
---
## 🟡 Funcionalidades Implementadas
## ler_int
### 📌 Funções básicas
- Leitura de string (`ler`)
- Leitura de inteiro (`ler_int`)
- Função de continuar execução (`continuar`)
- Consulta de elementos na lista (`consultar`)
Lê um número inteiro digitado pelo usuário.
Retorno:
* Valor inteiro informado.
---
### 📌 Lista principal (Tlista)
- Criar lista
- Adicionar chave (inserção ordenada)
## buscar_verbete
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)
- Inserção de palavras por chave
- Inserção ordenada no sub-dicionário
- Associação de palavras a uma chave existente
## encontrar_lista
Localiza a chave responsável por armazenar determinada palavra.
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
- Remover nó da lista (`remover_lista`)
- Listagem completa das chaves
- Percorrer e exibir estrutura completa
## lista_iniciar
Inicializa a estrutura principal.
Ação:
* Define a lista principal como vazia.
---
### 📌 Dicionário
- Remover verbete (`remover_dicionario`)
- Buscar palavra diretamente no dicionário
- Listar palavras de uma chave
## dicionario_adicionar
Insere um novo verbete em ordem alfabética.
Parâmetros:
* dicionario
* br
* ing
Ação:
* Cria um novo verbete.
* Insere mantendo a ordenação alfabética.
---
### 📌 Integração
- Consulta geral (lista + dicionário)
- Sincronização robusta entre lista e sublistas
- Melhor tratamento de erros e validações
## dicionario_remover
Remove um verbete de um dicionário.
Parâmetros:
* dicionario
* palavra
* removido
Ação:
* Procura a palavra.
* Remove da lista.
* Retorna o ponteiro removido.
---
### 📌 Sistema / Menu
- Melhor tratamento de opção inválida
- Finalização controlada do programa
- Organização das chamadas do menu
## lista_adicionar
Insere uma nova chave.
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
- Algumas inserções precisam de melhor controle de fluxo
- Falta padronização em validações
- Algumas funções ainda não implementadas
Redistribui verbetes após a criação de uma nova chave.
Parâmetros:
* 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`
2. Implementar `remover_lista`
3. Implementar `remover_dicionario`
4. 🔍 Criar `consultar_geral`
5. 📋 Implementar listagem completa
6. 🧪 Testar inserção, busca e remoção
Parâmetros:
* lista
* origem
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
- Listas encadeadas duplas
- Organização de dicionários em subestruturas
- Manipulação de ponteiros em Pascal
- Lógica de inserção e busca ordenada
Ação:
* Solicita palavra em português.
* Solicita tradução.
* Localiza a chave correta.
* Insere o verbete.
---
## 🛠 Tecnologias
## consultar_lista
- Linguagem: Pascal
- Biblioteca: CRT (entrada/saída básica)
- Estrutura: Listas encadeadas
Exibe todas as chaves cadastradas.
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
View File
@@ -1,344 +1,466 @@
program dicionario;
program pzim;
uses crt;
type
TponteiroDic = ^dic;
Tverbete = ^E_Dicionario;
E_Dicionario = record
br : string;
ing : string;
prox : Tverbete;
end;
dic = record
verbete: string;
prox: Tponteirodic;
end;
Tlista = ^E_lista;
E_lista = record
ant : Tlista;
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;
op: integer;
palavra, verbete: string;
function verificaVazio(l: tlista): boolean;
function ler : string;
var
temp : string;
begin
verificaVazio:= l.inicio = nil;
write (' digite a palavra : ');
readln(temp);
ler := temp;
end;
procedure inicializarLista(var l: tlista);
function ler_int : integer;
var
temp : integer;
begin
l.inicio:= nil;
l.fim:= nil;
write (' digite um numero : ');
readln(temp);
ler_int := temp;
end;
function verificaPalavra(l: tlista; p: string): boolean;
var aux: Tponteiro;
function buscar_verbete (D : Tverbete; P : string) : Tverbete;
begin
aux:= l.inicio;
while (aux <> nil) and (aux^.palavra <> p) do
aux:= aux^.prox;
if aux = nil then
verificaPalavra:= false
if D = nil then
buscar_verbete := nil
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
if D^.br = P then
buscar_verbete := D
else
verificaVerbete:= true;
end
else
verificaVerbete:= false;
buscar_verbete := buscar_verbete(D^.prox , P);
end;
end;
procedure inserirPalavra(var l: Tlista; p: string);
var novo, temp, aux: Tponteiro;
function encontrar_lista (T_lista : Tlista; palavra : string) : Tlista;
var
aux : Tlista;
melhor : Tlista;
begin
new(novo);
if novo <> nil then
aux := T_lista;
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
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');
if ant_d = nil then
nova^.ant^.dicionario := nil
else
ant_d^.prox := nil;
nova^.dicionario := aux_d;
sair := true;
end
else
writeln('Memória cheia hahaha');
begin
ant_d := aux_d;
aux_d := aux_d^.prox;
end;
end;
end;
procedure inserirVerbete(var l: tLista; p, v: string);
var novo, temp, temp2: TponteiroDIc;
aux: Tponteiro;
procedure lista_iniciar (var lista : Tlista);
begin
new(novo);
if novo <> nil then
lista := nil;
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
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
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
if ant = nil then
dicionario := aux^.prox
else
writeln('Palavra não encontrada');
end
ant^.prox := aux^.prox;
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
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
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;
procedure removerVerbete(var l: Tlista; p: string; v: string);
var aux: Tponteiro;
temp, temp2: TponteiroDIc;
procedure consultar_lista (T_lista : Tlista);
var
aux : Tlista;
begin
if verificaVazio(l) then
writeln('Lista de palavras vazia')
aux := T_lista;
if aux = nil then
begin
writeln(' lista vazia ');
end
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
while aux <> nil do
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;
writeln(' chave : ' , aux^.key);
aux := aux^.prox;
end;
end;
end;
procedure consultar(l: Tlista; p: string);
var aux: Tponteiro;
temp: TponteiroDic;
procedure consultar_dicionario (T_lista : Tlista);
var
aux_l : Tlista;
aux_d : Tverbete;
palavra : string;
encontrou : boolean;
begin
if verificaVazio(l) then
writeln('Lista vazia')
else
palavra := ler;
aux_l := T_lista;
encontrou := false;
while (aux_l <> nil) and (not encontrou) do
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
aux_d := buscar_verbete (aux_l^.dicionario , palavra);
if aux_d <> nil then
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;
writeln(' chave : ' , aux_l^.key);
writeln(aux_d^.br , ' = ' , aux_d^.ing);
encontrou := true;
end;
aux_l := aux_l^.prox;
end;
if not encontrou then
writeln(' palavra nao encontrada ');
end;
function formatarString(s: string): string;
var i: integer;
resultado: string;
procedure consultar_geral (T_lista : Tlista);
var
aux_l : Tlista;
aux_d : Tverbete;
begin
resultado:= '';
if length(s) > 0 then
aux_l := T_lista;
if aux_l = nil then
begin
resultado:= upcase(s[1]);
for i:= 2 to length(s) do
wrieln(' lista vazia ');
end
else
begin
while aux_l <> nil do
begin
if (s[i] >= 'A') and (s[i] <= 'Z') then
resultado:= resultado + char(ord(s[i]) + 32)
writeln;
writeln(' chave : ' , aux_l^.key);
aux_d := aux_l^.dicionario;
if aux_d = nil then
begin
writeln(' dicionario vazio ');
end
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;
formatarString:= resultado;
end;
end;
procedure remover_dicionario (T_lista : Tlista);
var
aux_l : Tlista;
aux_d : Tverbete;
palavra : string;
achou : boolean;
begin
inicializarLista(lista);
op:= 0;
while op <> 6 do
palavra := ler;
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
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;
dispose (aux_d);
achou := true;
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.