diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c92fa6b --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +dicionario +dicionario.o +dicionario2 +dicionario2.o +GRTAGS +GPATH +GTAGS +.vscode/GTEMP.pas diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..fb63944 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,8 @@ +{ + // 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/avaliacao.md b/avaliacao.md new file mode 100644 index 0000000..ae2ac7d --- /dev/null +++ b/avaliacao.md @@ -0,0 +1,30 @@ +# Avaliacao do pedido vs rascunho (dicionario.pas) + +## Esboco da estrutura +- Lista principal (dupla): ant <-> prox, key, ponteiro para dicionario +- Dicionario (simples): portugues, ingles, prox + +## Requisitos do enunciado +- Lista principal ordenada alfabeticamente e com encadeamento duplo +- Lista de verbetes ordenada alfabeticamente +- Prototipo com: incluir palavra-chave, incluir no dicionario, remover do dicionario, consultar, escrever todo dicionario + +## O que o rascunho ja tem +- Tipos com os campos corretos (lista + verbete) +- Rascunho de insercao ordenada na lista principal +- Funcoes de leitura (ler/ler_int) e loop principal com menu +- Consulta basica de chave na lista + +## O que falta / fora de curva +- Insercao ordenada correta no dicionario (verbete) e ajuste de prox +- Operacoes completas: remover (lista e dicionario), consultar dicionario, consultar geral +- Impressao de todo o dicionario +- Validacoes basicas (entrada vazia, chave inexistente) + +## Problemas tecnicos atuais +- adicionar_dicionario recebe record, mas usa como ponteiro (nil/prox) e mistura tipos (Tlista vs verbete) +- falta "then" em um if do consultar +- menu tem erros de sintaxe (falta ';', condicao vazia no else if) +- menu chama procedimentos sem passar parametros exigidos +- funcoes remover/consultar_geral nao existem +- em adicionar_lista, o novo no nao inicializa dicionario diff --git a/dicionario.pas b/dicionario.pas index 99e9734..14805e3 100644 --- a/dicionario.pas +++ b/dicionario.pas @@ -17,221 +17,73 @@ uses crt; prox : Tlista ; end; - { function maior(a , b : string):boolean; begin maior := upcase(a) > upcase(b); end; - } - procedure criar_lista ( var lista: Tlista ); + + procedure criar_lista(lista: Tlista ); begin lista := nil; end; procedure adicionar_lista(var T_lista : Tlista ); var - novo , anterior , atual : Tlista ; - chave : string ; - begin - chave := ler ; - new (novo); - if novo = nil then - writeln ('memoria cheia') + aux , aux_Ant , aux_Prox : Tlista; + temp_s : string; + begin + new(aux); + if + //memoria cheia else begin - if T_lista = nil then - begin - - novo^.key := chave ; - novo^.prox := T_lista; - novo^.ant := nil ; - T_lista := novo ; - - end - - else - begin - - atual := T_lista ; - anterior := nil ; - - while (atual <> nil) and (atual^.key < chave) do - begin - anterior := atual; - atual := atual^.prox; - end; - - novo^.ant := anterior ; - novo^.prox := atual ; - novo^.key := chave ; - - if anterior <> nil then - anterior^.prox := novo - else - T_lista := novo ; + while aux^.prox <> nil do + aux := aux^.prox; + temp_s := aux^.key; - if atual <> nil then - atual^.ant := novo ; + new (aux_Ant); + new (aux_Prox); + + if maior(temp_s , chave)then + begin + if aux^.ant <> nil then + aux_Ant := aux^.ant ; + if aux^.prox <> nil then + aux_Prox := aux^.prox; + + aux^.key := chave ;// end; - end; + end; end; + + + + +procedure portugues() - procedure adicionar_dicionario(dicionario : E_dicionario); - var - aux , aux2 : Tlista; - chave_p , chave_i : string ; -//portugues /\ /\ inglês - begin - chave_p := ler ; - chave_i := ler ; - new(aux); - if aux = nil then - begin - writeln ('memoria cheia') ; - end - else - begin - if (dicionario = nil) then - begin - aux^.br := chave_p ; - aux^.ing := chave_i ; - aux^.prox := dicionario ; - dicionario := aux ; - end; - aux2 := aux ; - while (aux2 <> nil) and (aux2^.br < chave_p ) do - begin - aux2 := aux2^.prox ; - aux := aux2 ; - end; - if aux2 = nil then - begin - - aux2^.br := chave_p ; - aux2^.ing := chave_i ; - - if aux <> nil then - aux2^.prox := aux - else - aux2^.prox := nil ; - - - end; - end; - - end; - - function consultar ( T_lista : Tlista ; chave : string ) : Tlista ; - var - atual : Tlista ; - begin - atual := T_lista ; - - while ( atual <> nil ) and ( atual^.key < chave ) do - atual := atual^.prox ; - - if ( atual <> nil ) and ( atual ^.key = chave) - consultar := atual - else - consultar := nil ; - end; - - - procedure consultar_lista ( T_lista : Tlista ); - var - aux : tlista ; - op : string ; - begin - write ( ' vc quer consutar quer consultar qual palavra ? ') ; - op := ler ; - - aux := consultar( T_lista , op ); - +procedure adicionar_dicionario(dicionario : E_dicionario); +var + aux , aux2 : Tlista; +begin + new(aux); 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 - end; - - procedure menu ( var T_lista : Tlista); - var - op : integer - begin - writeln (' 1 : adicionar_lista ') ; - writeln (' 2 : adicionar_dicionario ') ; - writeln (' 3 : consultar_lista ') ; - writeln (' 4 : consultar_dicionario ') ; - writeln (' 5 : consultar_geral ') - writeln (' 6 : remover_lista '); - writeln (' 7 : remover_dicionario '); - writeln (' 0 : sair '); - op := ler_int ; - case ler_int of - 1 : adicionar_lista ; - 2 : adicionar_dicionario ; - 3 : consultar_lista ; - 4 : consultar_dicionario ; - 5 : consultar_geral ; - 6 : remover_lista ; - 7 : remover_dicionario ; - end - else if ( ) - write (' opcao invalida digite novamente : '); - end; - - function ler : string ; - var - temp : string ; - begin - write (' digite a palavra :') ; - readln( temp ) ; - ler := temp ; - end; - - function ler_int : integer ; - var - temp : integer ; - begin - write (' digite um numero : ') ; - readln (temp) ; - ler_int := temp ; - end; - - function continuar ( num : integer ) : boolean ; - var - op : string ; - begin - if num = 1 then - continuar := true + begin + //memoria cheia + end else begin - write ( 'quer continuar ? (S / N)' ) ; - op := ler ; - while ( op <> 'S' ) and ( op <> 'N') do - begin - writeln ('opcao invalida') ; - op := ler ; - end; - if op = 'S' then - continuar := true - else - continuar := false ; + if (dicionario = nil) then + begin + aux^. + end; + while aux^.prox <> nil do + aux := aux^.prox + if aux^.prox = nil then end; - end; - -var - lista : Tlista ; - - i : integer ; + +end; + begin i := 1; criar_lista (lista) ; @@ -240,4 +92,4 @@ begin menu (lista); i := 0; end; -end. +end. \ No newline at end of file diff --git a/dicionario2.pas b/dicionario2.pas new file mode 100644 index 0000000..dad093e --- /dev/null +++ b/dicionario2.pas @@ -0,0 +1,309 @@ +program pzim; +uses crt; + +const + DEBUG_ATIVO = true; + + type + Tverbete = ^E_Dicionario; + E_Dicionario = record + br : string; // portugues + ing : string; // ingles + prox : Tverbete; + end; + + Tlista = ^E_lista ; + E_lista = record + ant : Tlista ; // anterior + key : string; + dicionario : Tverbete ; + prox : Tlista ; + end; + + procedure Debug(const msg : string); + begin + if DEBUG_ATIVO then + writeln('[debug] ', msg); + end; + + function ler_prompt(const msg : string) : string ; + var + temp : string ; + begin + write (msg) ; + readln( temp ) ; + Debug('entrada = "' + temp + '"'); + ler_prompt := temp ; + end; + + + function ler_int : integer ; + var + temp : integer ; + begin + write (' digite um numero : ') ; + readln (temp) ; + if DEBUG_ATIVO then + writeln('[debug] entrada numero = ', temp); + ler_int := temp ; + end; + + function CompareCI(const a, b : string) : integer; + var + aa, bb : string; + begin + aa := upcase(a); + bb := upcase(b); + if aa < bb then + CompareCI := -1 + else if aa > bb then + CompareCI := 1 + else + CompareCI := 0; + end; + + procedure criar_lista ( var lista: Tlista ); + begin + lista := nil; + end; + + procedure adicionar_lista(var T_lista : Tlista ); + var + novo , anterior , atual : Tlista ; + chave : string ; + begin + chave := ler_prompt(' digite a chave :'); + Debug('adicionar_lista chave="' + chave + '"'); + + new (novo); + if novo = nil then + writeln ('memoria cheia') + else + begin + if T_lista = nil then + begin + novo^.key := chave ; + novo^.dicionario := nil; + novo^.prox := T_lista; + novo^.ant := nil ; + T_lista := novo ; + Debug('adicionar_lista inseriu no inicio'); + end + + else + begin + atual := T_lista ; + anterior := nil ; + + while (atual <> nil) and (CompareCI(atual^.key, chave) < 0) do + begin + anterior := atual; + atual := atual^.prox; + end; + + novo^.ant := anterior ; + novo^.prox := atual ; + novo^.key := chave ; + novo^.dicionario := nil; + if anterior <> nil then + anterior^.prox := novo + else + T_lista := novo ; + + if atual <> nil then + atual^.ant := novo ; + Debug('adicionar_lista inseriu no meio/fim'); + end; + end; + end; + + + procedure adicionar_dicionario(var dicionario : Tverbete); + var + aux, aux2, anterior : Tverbete; + chave_p , chave_i : string ; + // portugues /\ /\ ingles + begin + chave_p := ler_prompt(' digite a palavra em portugues :'); + chave_i := ler_prompt(' digite a traducao em ingles :'); + Debug('adicionar_dicionario br="' + chave_p + '" ing="' + chave_i + '"'); + new(aux); + if aux = nil then + begin + writeln ('memoria cheia') ; + end + else + begin + aux^.br := chave_p ; + aux^.ing := chave_i ; + aux^.prox := nil ; + + if (dicionario = nil) then + begin + dicionario := aux ; + Debug('adicionar_dicionario inseriu no inicio'); + end + else // se o dicionario ja tiver verbetes, tem que inserir ordenado + begin + anterior := nil; + aux2 := dicionario ; + while (aux2 <> nil) and (CompareCI(aux2^.br, chave_p) < 0) do + begin + anterior := aux2; + aux2 := aux2^.prox ; + end; + + if anterior = nil then + begin + aux^.prox := dicionario; + dicionario := aux; + Debug('adicionar_dicionario inseriu no inicio (ordenado)'); + end + else + begin + aux^.prox := aux2; + anterior^.prox := aux; + Debug('adicionar_dicionario inseriu no meio/fim'); + end; + end; + end; + end; + + + function consultar ( T_lista : Tlista ; chave : string ) : Tlista ; + var + atual : Tlista ; + begin + atual := T_lista ; + + while ( atual <> nil ) and ( CompareCI(atual^.key, chave) < 0 ) do + atual := atual^.prox ; + + if ( atual <> nil ) and ( CompareCI(atual^.key, chave) = 0 ) then + consultar := atual + else + consultar := nil ; + end; + + + procedure consultar_lista ( T_lista : Tlista ); + var + aux : tlista ; + op : string ; + begin + op := ler_prompt(' qual chave deseja consultar ? ') ; + Debug('consultar_lista chave="' + op + '"'); + + aux := consultar( T_lista , op ); + + if aux = nil then + writeln (' palavra nao encontrada ') + else + write (' palavra encontrada :' , aux^.key ); + + end; + + procedure consultar_dicionario (T_lista : Tlista ); + var + aux : Tlista ; + op : string ; + begin + // TODO: consultar palavra dentro do dicionario da chave + end; + + procedure consultar_geral(T_lista : Tlista); + begin + // TODO: listar todo o dicionario + end; + + procedure remover_lista(var T_lista : Tlista); + begin + // TODO: remover chave da lista principal + end; + + procedure remover_dicionario(var T_lista : Tlista); + begin + // TODO: remover verbete do dicionario + end; + + + function continuar ( num : integer ) : boolean ; + var + op : string ; + begin + if num = 1 then + continuar := true + else + begin + write ( 'quer continuar ? (S / N) ' ) ; + readln(op); + while (op = '') or ((UpCase(op[1]) <> 'S') and (UpCase(op[1]) <> 'N')) do + begin + writeln ('opcao invalida') ; + write ( ' quer continuar ? (S / N) ' ) ; + readln(op); + end; + if UpCase(op[1]) = 'S' then + continuar := true + else + continuar := false ; + + if DEBUG_ATIVO then + writeln('[debug] continuar = ', continuar); + end; + end; + + + procedure menu ( var T_lista : Tlista); + var + op : integer; + chave : string; + aux : Tlista; + begin + writeln (' 1 : adicionar_lista ') ; + writeln (' 2 : adicionar_dicionario ') ; + writeln (' 3 : consultar_lista ') ; + writeln (' 4 : consultar_dicionario ') ; + writeln (' 5 : consultar_geral '); + writeln (' 6 : remover_lista '); + writeln (' 7 : remover_dicionario '); + writeln (' 0 : sair '); + op := ler_int ; + if DEBUG_ATIVO then + writeln('[debug] menu opcao = ', op); + case op of + 1 : adicionar_lista (T_lista); + 2 : begin + chave := ler_prompt(' digite a chave :'); + aux := consultar(T_lista, chave); + if aux = nil then + writeln (' chave nao encontrada ') + else + adicionar_dicionario(aux^.dicionario); + end; + 3 : consultar_lista (T_lista); + 4 : consultar_dicionario (T_lista); + 5 : consultar_geral (T_lista); + 6 : remover_lista (T_lista); + 7 : remover_dicionario (T_lista); + else + writeln (' opcao invalida digite novamente : '); + end; + end; + + + + +var + lista : Tlista ; + + i : integer ; +begin + i := 1; + criar_lista (lista) ; + while ( continuar(i) ) do + begin + menu (lista); + i := 0; + end; +end. diff --git a/dicionario_gusta.pas b/dicionario_gusta.pas new file mode 100644 index 0000000..54283e1 --- /dev/null +++ b/dicionario_gusta.pas @@ -0,0 +1,305 @@ +program pzim; +uses crt; + + 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; + + function verificar_palavra ( D : Tverbete ; P : string ) : boolean ; + var + sair : boolean ; + begin + if D = nil then + verificar_palavra := false + else + begin + if D^.br = P then + verificar_palavra := true + else if D^.prox <> nil then + sair := false + else + sair := true + + if sair then + verificar_palavra := false + else + verificar_palavra := verificar_palavra( D^.prox , P ); + end; + end; + + function consultar ( T_lista : Tlista ; chave : string ) : Tlista ; + var + atual : Tlista ; + begin + atual := T_lista ; + + while ( atual <> nil ) and ( atual^.key < chave ) do + atual := atual^.prox ; + + if ( atual <> nil ) and ( atual ^.key = chave) then + consultar := atual + else + consultar := nil ; + end; + + function ler : string ; + var + temp : string ; + begin + write (' digite a palavra :') ; + readln( temp ) ; + ler := temp ; + end; + + function ler_int : integer ; + var + temp : integer ; + begin + write (' digite um numero : ') ; + readln (temp) ; + ler_int := temp ; + end; + + function continuar : boolean ; + var + op : string ; + begin + write ( 'quer continuar ? (S / N)' ) ; + op := ler ; + while ( ( op <> 'S' ) or ( op <> 's' ) ) and ( ( op <> 'N') or ( op <> 'n') ) do + begin + writeln ('opcao invalida') ; + op := ler ; + end; + if op = 'S' then + continuar := true + else + continuar := false ; + end; + + { + function maior(a , b : string):boolean; + begin + maior := upcase(a) > upcase(b); + end; + } + + // Procedimentos \/ | /\ funçoes + + 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 ; + new (novo); + if novo = nil then + writeln ('memoria cheia') + else + begin + if T_lista = nil then + begin + + novo^.ant := nil ; + novo^.key := chave ; + novo^.dicionario := nil ; + novo^.prox := T_lista; + + T_lista := novo ; + + end + + else + begin + + atual := T_lista ; + anterior := nil ; + + while (atual <> nil) and (atual^.key < chave) 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 ; + + end; + end; + end; + + procedure adicionar_dicionario( var lista : Tlista ); + var + aux_l : Tlista ; + aux , aux_atual , aux_ant : Tverbete ; + chave , chave_p , chave_i , op : string ; +//portugues /\ /\ inglês + existe : boolean ; + begin + writeln (' digite a chave que vc quer : ') ; + chave := ler ; + + aux_l := consultar (lista , chave ); + + if aux_l = nil then + begin + writeln ('nao exite esta chave quer adicionar ? '); + + if continuar then + begin + adicionar_lista ( lista ); + aux_l := consultar (lista , chave) ; + end; + end + else + begin + chave_p := ler ; + chave_i := ler ; + + new(aux); + + if aux_l^.dicionario = nil then //adicionar o primeiro verbete + begin + aux^.br := chave_p ; + aux^.ing := chave_i ; + aux^.prox := aux_l^.dicionario ; + aux_l^.dicionario := aux ; + end + + else + begin + existe := verificar_palavra( aux_l^.dicionario , chave_p); // verificar se a palavra ja existe no dicionario + + if not existe then + begin + aux_ant := nil ; + aux_atual := aux_l^.dicionario ; // apontar para o primeiro verbete do dicionario da chave + + while (aux_atual <> nil) and ( aux_atual^.br < chave_p ) do + begin + aux_ant := aux_atual ; + aux_atual := aux_atual^.prox ; + end; + + if aux_ant = nil then + begin + aux^.br := chave_p; + aux^.ing := chave_i; + aux^.prox := aux_atual; + + aux_l^.dicionario := aux; + end + else + begin + aux_ant^.prox := aux ; + aux^.br := chave_p ; + aux^.ing := chave_i ; + aux^.prox := aux_atual; + end; + + end + else + write (' esta palavra ja existe no dicionario ') ; + + end; + end; + end; + + + procedure consultar_lista ( T_lista : Tlista ); + var + aux : tlista ; + op : string ; + begin + write ( ' vc quer consutar quer consultar qual palavra ? ') ; + op := ler ; + + aux := consultar( T_lista , op ); + + if aux = nil then + writeln (' palavra nao encontrada ') + else + write (' palavra encontrada :' , aux^.key ); + + end; + + procedure consultar_dicionario (T_lista : Tlista ); + var + aux : Tlista ; + op : string ; + begin + end; + + procedure menu ( var lista : Tlista ); + var + op : integer ; + begin + + writeln (' 1 : adicionar_lista ') ; + writeln (' 2 : adicionar_dicionario ') ; + writeln (' 3 : consultar_lista ') ; + writeln (' 4 : consultar_dicionario ') ; + writeln (' 5 : consultar_geral ') ; + writeln (' 6 : remover_lista ') ; + writeln (' 7 : remover_dicionario ') ; + writeln (' 0 : sair ') ; + op := ler_int ; + case op of + 1 : adicionar_lista(lista) ; + 2 : adicionar_dicionario (lista) ; + 3 : consultar_lista (lista) ; + 4 : consultar_dicionario (lista) ; + 5 : consultar_geral (lista , dicionario) ; + 6 : + begin + remover_lista (lista) ; + adicionar_dicionario (lista) ; + end; + 7 : remover_dicionario (dicionario) ; + 0 : writeln (' vc saiu do sistema ') ; + end + else + write (' opcao invalida digite novamente : ') ; + + end; +var + lista : Tlista ; + + i : integer ; +begin + i := 1; + criar_lista (lista) ; + while ( i = 1 ) do + begin + menu (lista); + if not continuar then + i := 0; + end; +end. diff --git a/formaPraFuncionar.png b/formaPraFuncionar.png new file mode 100644 index 0000000..19e5fab Binary files /dev/null and b/formaPraFuncionar.png differ diff --git a/o que esta faltando b/o que esta faltando new file mode 100644 index 0000000..46f3a0d --- /dev/null +++ b/o que esta faltando @@ -0,0 +1,135 @@ +# 📚 Projeto PZIM — Dicionário com Lista Encadeada 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). + +--- + +## 🧠 Estrutura de Dados + +### 📌 Lista principal (Tlista) +Cada nó representa uma chave: + +- `key` → nome da categoria +- `ant` → ponteiro para o anterior +- `prox` → ponteiro para o próximo +- `dicionario` → ponteiro para a lista de verbetes + +### 📌 Dicionário (Tverbete) +Cada nó representa uma palavra: + +- `br` → palavra em português +- `ing` → tradução em inglês +- `prox` → próximo verbete + +--- + +## 🟢 Estado Atual do Projeto + +### ✔ Estrutura de dados +- Lista encadeada dupla implementada +- Sublistas de dicionário por chave +- Inserção ordenada nas listas + +--- + +## 🟡 Funcionalidades Implementadas + +### 📌 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`) + +--- + +### 📌 Lista principal (Tlista) +- Criar lista +- Adicionar chave (inserção ordenada) + +--- + +### 📌 Dicionário (Tverbete) +- Inserção de palavras por chave +- Inserção ordenada no sub-dicionário +- Associação de palavras a uma chave existente + +--- + +## 🔴 Funcionalidades Faltantes + +### 📌 Lista principal +- Remover nó da lista (`remover_lista`) +- Listagem completa das chaves +- Percorrer e exibir estrutura completa + +--- + +### 📌 Dicionário +- Remover verbete (`remover_dicionario`) +- Buscar palavra diretamente no dicionário +- Listar palavras de uma chave + +--- + +### 📌 Integração +- Consulta geral (lista + dicionário) +- Sincronização robusta entre lista e sublistas +- Melhor tratamento de erros e validações + +--- + +### 📌 Sistema / Menu +- Melhor tratamento de opção inválida +- Finalização controlada do programa +- Organização das chamadas do menu + +--- + +## 🚨 Problemas Identificados + +- 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 + +--- + +## 🧭 Prioridades de Desenvolvimento + +Para evoluir o projeto corretamente: + +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 + +--- + +## 💡 Objetivo do Projeto + +O objetivo é praticar: + +- 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 + +--- + +## 🛠 Tecnologias + +- Linguagem: Pascal +- Biblioteca: CRT (entrada/saída básica) +- Estrutura: Listas encadeadas + +--- + +## 📌 Observação + +Este projeto está em desenvolvimento e ainda possui funcionalidades incompletas, mas já demonstra uma estrutura funcional de dicionário hierárquico com listas encadeadas. + +--- \ No newline at end of file diff --git a/pronto.pas b/pronto.pas new file mode 100644 index 0000000..a302e12 --- /dev/null +++ b/pronto.pas @@ -0,0 +1,344 @@ +program dicionario; +type + TponteiroDic = ^dic; + +dic = record + verbete: string; + prox: Tponteirodic; +end; + +Tponteiro = ^no; +no = record + palavra: string; + dic: TponteiroDic; + prox: Tponteiro; + ant: Tponteiro; +end; + +Tlista = record + inicio: Tponteiro; + fim: Tponteiro; +end; + +var lista: Tlista; + op: integer; + palavra, verbete: string; + +function verificaVazio(l: tlista): boolean; +begin + verificaVazio:= l.inicio = nil; +end; + +procedure inicializarLista(var l: tlista); +begin + l.inicio:= nil; + l.fim:= nil; +end; + +function verificaPalavra(l: tlista; p: string): boolean; +var aux: Tponteiro; +begin + aux:= l.inicio; + while (aux <> nil) and (aux^.palavra <> p) do + aux:= aux^.prox; + if aux = nil then + verificaPalavra:= false + else + verificaPalavra:= true; +end; + +function verificaVerbete(l: tlista; p, v: string): boolean; +var aux: Tponteiro; + aux2: TponteiroDic; +begin + aux:= l.inicio; + while (aux <> nil) and (aux^.palavra <> p) do + aux:= aux^.prox; + if aux <> nil then + begin + aux2:= aux^.dic; + while (aux2 <> nil) and (aux2^.verbete <> v) do + aux2:= aux2^.prox; + if aux2 = nil then + verificaVerbete:= false + else + verificaVerbete:= true; + end + else + verificaVerbete:= false; +end; + + + +procedure inserirPalavra(var l: Tlista; p: string); +var novo, temp, aux: Tponteiro; +begin + new(novo); + if novo <> nil then + begin + if not verificaPalavra(l, p) then + begin + novo^.prox:= nil; + novo^.ant:= nil; + novo^.dic:= nil; + novo^.palavra:= p; + if verificaVazio(l) then + begin + l.inicio:= novo; + l.fim:= novo; + end + else if p < l.inicio^.palavra then + begin + temp:= l.inicio; + l.inicio:= novo; + novo^.prox:= temp; + temp^.ant:= novo; + end + else + begin + aux:= l.inicio; + while (aux^.prox <> nil) and (aux^.prox^.palavra < p) do + aux:= aux^.prox; + if aux^.prox = nil then + begin + aux^.prox:= novo; + novo^.ant:= aux; + l.fim:= novo; + end + else + begin + temp:= aux^.prox; + aux^.prox:= novo; + novo^.prox:= temp; + novo^.ant:= aux; + temp^.ant:= novo; + end; + end; + end + else + writeln('essa palavra já existe'); + end + else + writeln('Memória cheia hahaha'); +end; + +procedure inserirVerbete(var l: tLista; p, v: string); +var novo, temp, temp2: TponteiroDIc; + aux: Tponteiro; +begin + new(novo); + if novo <> nil then + begin + if not verificaVerbete(l, p, v) then + begin + aux:= l.inicio; + novo^.verbete:= v; + novo^.prox:= nil; + while (aux <> nil) and (aux^.palavra <> p) do + aux:= aux^.prox; + if aux^.palavra = p then + begin + if aux^.dic = nil then + aux^.dic:= novo + else if v < aux^.dic^.verbete then + begin + temp:= aux^.dic; + aux^.dic:= novo; + aux^.dic^.prox:= temp; + end + else + begin + temp:= aux^.dic; + while (temp^.prox <> nil) and (temp^.prox^.verbete < v) do + temp:= temp^.prox; + temp2:= temp^.prox; + temp^.prox:= novo; + novo^.prox:= temp2; + end; + end + else + writeln('Palavra não encontrada'); + end + else + writeln('O verbete ja está na lista') + end + else + writeln('Memória cheia'); +end; + +procedure removerVerbete(var l: Tlista; p: string; v: string); +var aux: Tponteiro; + temp, temp2: TponteiroDIc; +begin + if verificaVazio(l) then + writeln('Lista de palavras vazia') + else + begin + aux:= l.inicio; + while (aux <> nil) and (aux^.palavra <> p) do + aux:= aux^.prox; + if aux = nil then + writeln('Palavra não encontrada') + else if aux^.dic = nil then + writeln('A palavra não possui verbetes') + else if aux^.dic^.verbete = v then + begin + temp:= aux^.dic; + aux^.dic:= aux^.dic^.prox; + dispose(temp); + end + else + begin + temp:= aux^.dic; + while (temp^.prox <> nil) and (temp^.prox^.verbete <> v) do + temp:= temp^.prox; + if temp^.prox = nil then + writeln('O verbete não está na lista') + else + begin + temp2:= temp^.prox; + temp^.prox:= temp^.prox^.prox; + dispose(temp2); + end; + end; + end; +end; + +procedure consultar(l: Tlista; p: string); +var aux: Tponteiro; + temp: TponteiroDic; +begin + if verificaVazio(l) then + writeln('Lista vazia') + else + begin + aux:= l.inicio; + while (aux <> nil) and (aux^.palavra <> p) do + aux:= aux^.prox; + if aux = nil then + writeln('Palavra não encontrada') + else + begin + temp:= aux^.dic; + if temp = nil then + writeln('A palavra não possui verbetes') + else + begin + write('Verbetes: '); + while (temp <> nil) do + begin + write(temp^.verbete, ' '); + temp:= temp^.prox; + end; + end; + end; + end; +end; + + +procedure escreverTudo(l: tlista); +var aux: Tponteiro; + temp: TponteiroDic; +begin + if verificaVazio(l) then + writeln('Lista vazia') + else + begin + aux:= l.inicio; + while (aux <> nil) do + begin + write(aux^.palavra, ': '); + temp:= aux^.dic; + while (temp <> nil) do + begin + write(temp^.verbete); + if temp^.prox <> nil then + write(', '); + temp:= temp^.prox; + end; + writeln; + aux:= aux^.prox; + end; + end; +end; + +function formatarString(s: string): string; +var i: integer; + resultado: string; +begin + resultado:= ''; + if length(s) > 0 then + begin + resultado:= upcase(s[1]); + for i:= 2 to length(s) do + begin + if (s[i] >= 'A') and (s[i] <= 'Z') then + resultado:= resultado + char(ord(s[i]) + 32) + else + resultado:= resultado + s[i]; + end; + end; + formatarString:= resultado; +end; + +begin + inicializarLista(lista); + op:= 0; + while op <> 6 do + begin + writeln; + writeln('1 - Inserir palavra'); + writeln('2 - Inserir verbete'); + writeln('3 - Remover verbete'); + writeln('4 - Consultar'); + writeln('5 - Escrever tudo'); + writeln('6 - Sair'); + write('Opcao: '); + readln(op); + case op of + 1: begin + writeln; + write('Palavra: '); + readln(palavra); + palavra:= formatarString(palavra); + inserirPalavra(lista, palavra); + end; + 2: begin + writeln; + write('Palavra: '); + readln(palavra); + write('Verbete: '); + readln(verbete); + palavra:= formatarString(palavra); + verbete:= formatarString(verbete); + inserirVerbete(lista, palavra, verbete); + end; + 3: begin + writeln; + write('Palavra: '); + readln(palavra); + write('Verbete: '); + readln(verbete); + palavra:= formatarString(palavra); + verbete:= formatarString(verbete); + removerVerbete(lista, palavra, verbete); + end; + 4: begin + writeln; + write('Digite a palavra a ser consultada: '); + readln(palavra); + palavra:= formatarString(palavra); + writeln; + consultar(lista, palavra); + writeln; + end; + 5: begin + writeln; + escreverTudo(lista); + writeln; + end; + else + writeln('Opcao invalida'); + end; + end; +end . \ No newline at end of file