diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index fb63944..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -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": [ - - ] -} \ No newline at end of file diff --git a/FILA.PAS b/FILA.PAS deleted file mode 100644 index 6ad26ed..0000000 --- a/FILA.PAS +++ /dev/null @@ -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. diff --git a/avaliacao.md b/avaliacao.md deleted file mode 100644 index ae2ac7d..0000000 --- a/avaliacao.md +++ /dev/null @@ -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 diff --git a/dicionario2.pas b/dicionario2.pas deleted file mode 100644 index dad093e..0000000 --- a/dicionario2.pas +++ /dev/null @@ -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. diff --git a/o que esta faltando b/o que esta faltando index 46f3a0d..f0af932 100644 --- a/o que esta faltando +++ b/o que esta faltando @@ -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. ---- \ No newline at end of file +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 \ No newline at end of file diff --git a/pronto.pas b/pronto.pas index a302e12..d602a9f 100644 --- a/pronto.pas +++ b/pronto.pas @@ -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 . \ No newline at end of file +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.