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/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 3fc55b8..ff1e452 100644 --- a/dicionario.pas +++ b/dicionario.pas @@ -1,86 +1,280 @@ program pzim; +uses crt; + type Tverbete = ^E_Dicionario; E_Dicionario = record - portugues : string; - ingles : string; + br : string; //portugues + ing : string; // ingles prox : Tverbete; end; - Tlista = ^E_lista; - E_lista = record ; + Tlista = ^E_lista ; + E_lista = record ant : Tlista ; //anterior key : string; - dicionario : E_dicionario ; + dicionario : Tverbete ; prox : Tlista ; end; + + function ler : string ; + var + temp : string ; + begin + write (' digite a palavra :') ; + readln( temp ) ; + ler := temp ; + end; + + function ler_int : integer ; + var + temp : integer ; + begin + write (' digite um numero : ') ; + readln (temp) ; + ler_int := temp ; + end; + + { function maior(a , b : string):boolean; begin maior := upcase(a) > upcase(b); end; - - procedure criar_lista(lista: Tlista ); + } + { JULGAMENTO: comparacao esta comentada; se a ordenacao precisar disso, tem que reativar } + procedure criar_lista ( var lista: Tlista ); begin - lista:=nil; + lista := nil; end; - procedure adicionar_lista(var lista : Tlista ; chave : string); + procedure adicionar_lista(var T_lista : Tlista ); var - aux , aux_Ant , aux_Prox : Tlista; - temp_s : string; + novo , anterior , atual : Tlista ; + chave : string ; begin - new(aux); - if - //memoria cheia + chave := ler(); + + new (novo); + if novo = nil then + writeln ('memoria cheia') else begin - while aux^.prox <> nil do - aux := aux^.prox; - temp_s := aux^.key; - - new (aux_Ant); - new (aux_Prox); - - if maior(temp_s , chave)then + if T_lista = nil then begin - if aux^.ant <> nil then - aux_Ant := aux^.ant ; - if aux^.prox <> nil then - aux_Prox := aux^.prox; - - aux^.key := chave ;// - - end; - end; - end; - - - - -procedure portugues() - -procedure adicionar_dicionario(dicionario : E_dicionario); -var - aux , aux2 : Tlista; -begin - new(aux); - if aux = nil then - begin - //memoria cheia + novo^.key := chave ; + novo^.dicionario := nil; + 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; + + // JULGAMENTO: comparacao eh case-sensitive; se quiser alfabetico "padrao", precisa normalizar + novo^.ant := anterior ; + novo^.prox := atual ; + novo^.key := chave ; + novo^.dicionario := nil; + if anterior <> nil then + anterior^.prox := novo + else + T_lista := novo ; + + if atual <> nil then + atual^.ant := novo ; + end; + end; + end; + + + procedure adicionar_dicionario(var dicionario : Tverbete); + var + aux, aux2, anterior : Tverbete; + chave_p , chave_i : string ; + //portugues /\ /\ inglês + begin + chave_p := ler() ; + chave_i := ler() ; + new(aux); + if aux = nil then + begin + writeln ('memoria cheia') ; + end + else + begin + aux^.br := chave_p ; + aux^.ing := chave_i ; + aux^.prox := nil ; + + if (dicionario = nil) then + begin + dicionario := aux ; + exit; + end; + + anterior := nil; + aux2 := dicionario ; + while (aux2 <> nil) and (aux2^.br < chave_p ) do + begin + anterior := aux2; + aux2 := aux2^.prox ; + end; + + if anterior = nil then + begin + aux^.prox := dicionario; + dicionario := aux; + end + else + begin + aux^.prox := aux2; + anterior^.prox := aux; + end; + end; + end; + + + function consultar ( T_lista : Tlista ; chave : string ) : Tlista ; + var + atual : Tlista ; + begin + atual := T_lista ; + + while ( atual <> nil ) and ( atual^.key < chave ) do + atual := atual^.prox ; + + if ( atual <> nil ) and ( atual ^.key = chave) then + consultar := atual + else + consultar := nil ; + end; + + + procedure consultar_lista ( T_lista : Tlista ); + var + aux : tlista ; + op : string ; + begin + write ( ' vc quer consutar quer consultar qual palavra ? ') ; + op := ler ; + + aux := consultar( T_lista , op ); + + if aux = nil then + writeln (' palavra nao encontrada ') + else + write (' palavra encontrada :' , aux^.key ); + + end; + + procedure consultar_dicionario (T_lista : Tlista ); + var + aux : Tlista ; + op : string ; + begin + // TODO: consultar palavra dentro do dicionario da chave + end; + + procedure consultar_geral(T_lista : Tlista); + begin + // TODO: listar todo o dicionario + end; + + procedure remover_lista(var T_lista : Tlista); + begin + // TODO: remover chave da lista principal + end; + + procedure remover_dicionario(var T_lista : Tlista); + begin + // TODO: remover verbete do dicionario + end; + + + + function continuar ( num : integer ) : boolean ; + var + op : string ; + begin + if num = 1 then + continuar := true else begin - if (dicionario = nil) then - begin - aux^. - end; - while aux^.prox <> nil do - aux := aux^.prox - if aux^.prox = nil then + write ( 'quer continuar ? (S / N)' ) ; + op := ler ; + while ( op <> 'S' ) and ( op <> 'N') do + begin + writeln ('opcao invalida') ; + op := ler ; + end; + if op = 'S' then + continuar := true + else + continuar := false ; end; - -end; - + end; + + + procedure menu ( var T_lista : Tlista); + var + op : integer; + chave : string; + aux : Tlista; + begin + writeln (' 1 : adicionar_lista ') ; + writeln (' 2 : adicionar_dicionario ') ; + writeln (' 3 : consultar_lista ') ; + writeln (' 4 : consultar_dicionario ') ; + writeln (' 5 : consultar_geral '); + writeln (' 6 : remover_lista '); + writeln (' 7 : remover_dicionario '); + writeln (' 0 : sair '); + op := ler_int ; + case op of + 1 : adicionar_lista (T_lista); + 2 : begin + chave := ler(); + aux := consultar(T_lista, chave); + if aux = nil then + writeln (' chave nao encontrada ') + else + adicionar_dicionario(aux^.dicionario); + end; + 3 : consultar_lista (T_lista); + 4 : consultar_dicionario (T_lista); + 5 : consultar_geral (T_lista); + 6 : remover_lista (T_lista); + 7 : remover_dicionario (T_lista); + 0 : exit; + else + writeln (' opcao invalida digite novamente : '); + end; + end; + + + + + +var + lista : Tlista ; + + i : integer ; begin -end. + i := 1; + criar_lista (lista) ; + while ( continuar(i) ) do + begin + menu (lista); + i := 0; + 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/formaPraFuncionar.png b/formaPraFuncionar.png new file mode 100644 index 0000000..19e5fab Binary files /dev/null and b/formaPraFuncionar.png differ diff --git a/pronto b/pronto new file mode 100755 index 0000000..5c526a4 Binary files /dev/null and b/pronto differ diff --git a/pronto.o b/pronto.o new file mode 100644 index 0000000..a353dfb Binary files /dev/null and b/pronto.o differ 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