Ir ao conteúdo
  • Cadastre-se

Atividade de Estrutura de Dados lista encadeada ordenada .Eu fiz mas está dando erro.


Posts recomendados

O programa deverá criar o tipo de dado abstrato de acordo com o assunto de cada equipe, inclusive as operações para manipular o tipo. A estrutura deverá armazenar os produtos de uma determinada empresa. O produto será um registro com os seguintes campos: código, descrição e preço. O programa deverá apresentar um menu ao usuário com, no mínimo, as seguintes opções:

 

1.      Cadastrar Produto;

2.      Pesquisar Produto (pelo código);

3.      Pesquisar Produto (pela descrição);

4.      Excluir Produto (pelo código);

5.      Excluir Produto (pela descrição);

6.      Exibir Lista;

7.      Gravar Lista (em arquivo)

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Poste aqui o código e onde está com dúvidas...

Obs.: Sugiro inicialmente preparar a estrutura da "lista encadeada ordenada" (ajustado para o tipo de dado do problema: produtos). Feito isso, parte para parte criação do restante...

Qualquer dúvida é só postar...

No aguardo.

 

O programa deverá criar o tipo de dado abstrato de acordo com o assunto de cada equipe, inclusive as operações para manipular o tipo. A estrutura deverá armazenar os produtos de uma determinada empresa. O produto será um registro com os seguintes campos: código, descrição e preço. O programa deverá apresentar um menu ao usuário com, no mínimo, as seguintes opções:

 

1.      Cadastrar Produto;

2.      Pesquisar Produto (pelo código);

3.      Pesquisar Produto (pela descrição);

4.      Excluir Produto (pelo código);

5.      Excluir Produto (pela descrição);

6.      Exibir Lista;

7.      Gravar Lista (em arquivo)

Link para o comentário
Compartilhar em outros sites

unit listaencadeada;interface // registro que aponta para os campos // type Elem = string;      LstOrd = ^Nodo;      Nodo = record      codigo: integer;      preco : real;      nome: Elem;      obj:Elem;      prox : LstOrd;            end;      // ponteiro que guarda informações e aponta para o proximo          //Lista é ponteiro. var L : LstOrd; procedure criar     (var L : LstOrd); function vazia      (L : LstOrd): boolean; procedure inserir   (var L : LstOrd; x:Elem; code:integer;prec:real); function Buscar1    (L : LstOrd; x : Elem): LstOrd; function Buscar2    (L : LstOrd; code : integer): LstOrd; //procedure print; function remover1  (var L : LstOrd; code : integer): boolean; function remover2  (var L : LstOrd; x : Elem): boolean; procedure show      (nome:string; L:LstOrd); implementation procedure criar (var L : LstOrd);   // Procedimento para criar Lista begin     L := nil;     writeln ('Lista iniciada...'); end; function vazia (L : LstOrd): boolean;    //Uma Lista Vazia é representada por um Ponteiro cujo valor é Nulo. begin  if (l = nil) then    vazia := true  else    vazia := false; end; procedure inserir (var L : LstOrd; x:Elem;code:integer;prec:real);    // Procedimento para inserir um produto na Lista L var  N, P : LstOrd;   //N e P são Ponteiros. begin    new(N);                //Criar ponteiro     N^.obj.preco := prec;         //O livro não diz que tem que coloca o nome depois do obj no inserir.     N^.obj.nome:= x;     N^.obj.codigo := code;    if(vazia(L))or(x<L^.obj.nome)then      //1º e 2ºCondição: 1ºSe a Lista Ordenada L esta vazia     begin                                 //2ºSe o elemento s é menor ou igual ao primeiro elemento da lista.        N^.prox := L;                      //Nodo apontado por N passa a ser o primeiro da lista L.       L       :=  N;                            //Endereço do Nodo apontado por N deve ser copiado para a variavel L. Tal que ambos ponteiros apontem o mesmo nodo.      end     else     begin          P := L;          while (P^.prox <> nil ) and (x>P^.prox^.obj.nome) do      //3ºCondição e 4ºCondição: O elemento x é maior que o primeiro e existe outro que o supera          P := P^.prox;          N^.prox := P^.prox;          P^.prox := N;     end;     // Final Da Ordenacao Lista Encadeada .          begin               writeln;               writeln (' [Produto Cadastrado Com Sucesso] ... ');          end; end; //     Function Procurar Pelo Nome. function Buscar1 (L : LstOrd; x : Elem): LstOrd; var    P : LstOrd; begin      P:= L;      while (P <> nil) and (x > P^.obj.nome) do            P := P^.prox;      if (P <> nil) and (x = P^.obj.nome) then           Buscar1 :=P                                  //print(P)      else           Buscar1:=nil; end; //     Function Procurar usando o codigo. function Buscar2 (L : LstOrd; code : integer): LstOrd; var    P : LstOrd; begin           P := L;           while (P <> nil) and (code > P^.obj.codigo) do                 P := P^.prox;           if (P <> nil) and (code = P^.obj.codigo) then               Buscar2:= P               else               Buscar2:=nil; end; // procedimento mostrar um // {procedure print; begin      writeln ('Código ' , codigo);      writeln ('Produto' , nome);      writeln ('Preço: ' , preco); end;}  //Remover produto por codigo  function remover1 (var L : LstOrd; code : integer): boolean;  var     P, Q : LstOrd;  begin     if vazia(L) or (code < L^.obj.codigo)then  //Quando coloca o obj.nome dar erro.        remover1:=false     else         if (L^.obj.codigo = code) then         begin              P := L;              L := L^.prox;              writeln ('O produto foi removido! ');              dispose(P);              remover1:= true;          end         else         begin              P:=L;                   while((P^.prox <> nil) and (code > P^.prox^.obj.codigo )) do //4ºCondição : O elemento cod é diferente ao primeiro elemento de L.                        P := P^.prox;                  if (P^.prox <> nil) and (code = P^.prox^.obj.codigo )then                  begin                       Q := P^.prox;                       P^.prox := Q^.prox;                       writeln ('O produto foi removido(a)! ');                       dispose(Q);                       remover1:=true;                  end                  else                       remover1:=false;end; end;  //Remover produto pelo nome  function remover2 (var L : LstOrd; x : Elem): boolean;  var     P, Q : LstOrd;  begin     if vazia(L) or (x<L^.obj.nome)then        remover2:=false     else         if (x = L^.obj.nome) then         begin              P := L;              L := L^.prox;             // writeln ('O produto foi removido! ');              dispose(P);              remover2:=true;         end         else         begin              P := L;                   while((P^.prox <> nil) and (x > P^.prox^.obj.nome )) do //4ºCondição : O elemento cod é diferente ao primeiro elemento de L.                   begin                        P := P^.prox;                   end;                  if (P^.prox <> nil) and (x = P^.prox^.obj.nome )then                  begin                       Q := P^.prox;                       P^.prox := Q^.prox;                       //writeln ('O produto foi removido(a)! ');                       dispose(Q);                       remover2:=true;                  end                  else                       remover2:=false;end; end; //Imprimindo Lista Ordenada. procedure show (nome:string; L:LstOrd); var  P: LstOrd; begin     P:=L;      if vazia (L) then    writeln (' A lista esta vazia ')      else      begin      write(nome, ':[');           while (P <> nil) do           begin                writeln(' Nome ' , P^.nome );                P := P^.prox;           end;      end; end;beginend.

Esta dando erro no procedure inserir onde está n^.obj.nome 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Qual navegador está utilizando?

 

Então, eu estou utilizando o FPC 2.6.0 (dentro do programa NotePad++). Vou me basear por esse compilador, beleza?

Vou tentar explicar o que mais ou menos está ocorrendo e ao mesmo tempo como analisar os possíveis erross... vamos lá:
 

Ao compilar o código, apareceu o seguinte texto:

E:\Simon\DropBox\Programas\Programação\Notepad++ 6.1.5\Compiladores\FPC\2.6.0\ppc386.exe "E:\Simon\DropBox\Programas\Programação\Notepad++ 6.1.5\ListaEncadeada.pas"Process started >>>ListaEncadeada.pas(70,13) Error: Illegal qualifierListaEncadeada.pas(71,13) Error: Illegal qualifierListaEncadeada.pas(72,13) Error: Illegal qualifierListaEncadeada.pas(77,29) Error: Illegal qualifierListaEncadeada.pas(88,55) Error: Illegal qualifierListaEncadeada.pas(111,40) Error: Illegal qualifierListaEncadeada.pas(113,37) Error: Illegal qualifierListaEncadeada.pas(132,48) Error: Illegal qualifierListaEncadeada.pas(134,45) Error: Illegal qualifierListaEncadeada.pas(157,36) Error: Illegal qualifierListaEncadeada.pas(160,21) Error: Illegal qualifierListaEncadeada.pas(171,68) Error: Illegal qualifierListaEncadeada.pas(177,64) Error: Illegal qualifierListaEncadeada.pas(196,31) Error: Illegal qualifierListaEncadeada.pas(199,25) Error: Illegal qualifierListaEncadeada.pas(210,65) Error: Illegal qualifierListaEncadeada.pas(214,61) Error: Illegal qualifierListaEncadeada.pas(253,4) Fatal: There were 17 errors compiling module, stoppingFatal: Compilation aborted<<< Process finished. (Exit code 1)================ READY ================

Pegando o "primeiro erro da lista", temos «ListaEncadeada.pas(70,13) Error: Illegal qualifier», ou seja, algo como "qualificador ilegal"... "está usando uma qualificação ilegal para variável " (incorreta).

Na tal linha temos 70:

N^.obj.preco := prec;         //O livro não diz que tem que coloca o nome depois do obj no inserir.

- Oras, <N> é um ponteiro, logo, não está errado utilizar o "^". Não deve ser isso... continuamos então..
- Já analisando o <N^.obj>, temos que <N> é um "record" , logo está coerente utilizar o "." para acessar um de seus atributos. Como <N> está como "ponteiro", como visto antes, devem-se utilizar o tal do utilizar o "^" antes desse "."... tudo certo até aqui...
- Partimos agora para o <N^.obj.preco>... OPS!!! De onde vem esse ".preco"??? Como sabido, esse ponto está indicando que "obj" é um "record", correto??? Deixa eu olhar lá na declaração.......... Vi lá que tem "obj:Elem;". Agora olhamos o "elem"....... OPA!!! Encontrei... "elem" está como "Elem = string;", logo não poderia tentar utilizar esse ".preco", entendeu?

 

RESUMIDAMENTE

Você está utilizando um atributo  que simplesmente não existe!!!

 

POSSÍVEL SOLUÇÃO
Ajusta o tal "obj" para suas necessidades... nesse caso transformando-o em um "record".


Para "adiantar", um exemplo de como mais ou menos poderia ficar...:

INTERFACE  type     tPRODUTO = record        codigo   :string;      descricao:string;      preco    :real;      end;    Elem = tPRODUTO;    LstOrd = ^Nodo;    Nodo = record      codigo:integer;      preco :real;      nome  :Elem;      obj   :Elem;      prox  :LstOrd;      end;...

Obs.: claro que também poderia utilizar o record direto:

    Elem = record        codigo   :string;      descricao:string;      preco    :real;      end;

Mas, acho mais elegante separar... e possibilita também utilizar esse mesmo tipo (tPRODUTO) em outra variável... :)

 

Deu para entender o raciocínio?



BONUS

1) Parâmetros dos procedimentos

Já que tens "um objeto", poderia trabalhar com esse conceito nos procedimentos...

procedure inseri   (var L: LstOrd; produto:tPRODUTO);

Bem mais prático, não? (em vez de passar atributo, por atributo).

 

2) Declaração de variáveis

Verifiquei que tem uma variável solta na Interface..

var L : LstOrd;

Onde que está utilizando ela??

Veja, vocês já devem ter ouvido falar em "variáveis globais" e "variáveis locais" (senão, sugiro pesquisar). Nesse caso, essa variável lá na Interface, é uma variável global, ou seja, é vista por todo o código... essa declaração lá, poderia servi por exemplo para caso você queira utilizar ela durante toda a Unit ou no programa que irá utilizar essa Unit, ou seja tanto o programa, tanto a Unit irão enxergar a mesma variável... mas não se engane... A variável "L" que está nas assinaturas dos procedimentos (como visto no item 1) não tem nada a ver com essa variável que está lá na Interface... RESUMIDAMENTE: apague essa variável de lá!!! Essa declaração não deveria existir!!! (como uma boa forma de testar, experimente mudar ela de nome para vê se vai mudar algo)!

 

 

Espero não ter falado coisa de mais de uma vez... mais acho que por enquanto é isso ai..

 

Sugiro que ajuste essa questão do "tipo da variável obj" e as assinaturas... e vá ajustante o restante...

Qualquer coisa é só postar.

No aguardo.

 

 

Link para o comentário
Compartilhar em outros sites

Eu estou usando o Dev-pascal .Eu fiz as alterações que você mim falou,mas, continua dando erro só que dessa vez é no if(N^.nome<=N^.obj)then nessa condição do if.

O codigo do inserir ficou assim com as alterações :

procedure inserir  (var L: LstOrd; produto:tPRODUTO);    // Procedimento para inserir um produto na Lista L var  N, P : LstOrd;   //N e P são Ponteiros. begin     new(N);                //Criar ponteiro                  N^.preco:= N^.preco;     N^.codigo:= N^.codigo;     N^.obj:= N^.nome;    if(vazia(L))or(N^.nome<=N^.obj)then      //1º e 2ºCondição: 1ºSe a Lista Ordenada L esta vazia     begin                                 //2ºSe o elemento s é menor ou igual ao primeiro elemento da lista.        N^.prox := L;                      //Nodo apontado por N passa a ser o primeiro da lista L.       L       :=  N;                            //Endereço do Nodo apontado por N deve ser copiado para a variavel L. Tal que ambos ponteiros apontem o mesmo nodo.      end     else     begin          P := L;          while (P^.prox <> nil ) and (N^.nome>P^.prox^.obj) do      //3ºCondição e 4ºCondição: O elemento nome é maior que o primeiro e //existe outro que o supera          P := P^.prox;          N^.prox := P^.prox;          P^.prox := N;     end;
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá,

Vamos comparar o código antigo com o novo:

 

ANTIGO:

if (vazia(L)) or (x<L^.obj.nome)then

NOVO:

if (vazia(L)) or (N^.nome<=N^.obj)then

Traduzindo seria mais ou menos assim:

se (a lista está vazia) ou (valor a ser inserido foi menor que o valor que está no objeto) façaif (vazia(L)) or (x<L^.obj.nome)then (<-- para quando o novo elemento deva ficar na primeira posição)

Então, qual o novo valor a ser inserido? nesse caso é um "produto" (mas ele contém vários atributos, certo?). Então, é necessário escolher um desses atributos para ser usado como referência... ou seja, a lista é dita como "ordenada", logo tem que se definir em que "vai ser ordenado"...

Supondo que queria ordenar por CODIGO, ficaria algo mais ou menos assim:

"se (a lista está vazia) ou (valor a ser inserido foi menor que o valor que está no objeto) faça"if (vazia(L)) or (produto.codigo<=N^.obj.codigo) then

Entendeu?

 

Tente ir seguindo esse mesmo raciocínio..

Obs.: Veja que na sua primeira resposta, você definiu que os dados do produto estão no "obj" (tinha faltado apenas definir esse obj lá no type).

Só para deixar mais claro:

INTERFACE  type     tPRODUTO = record   //definição do tipo produto      codigo   :string; //<-- obs.:se for só número, poderia mudar para interger, por exemplo      descricao:string;      preco    :real;      end;    Elem = tPRODUTO; //definição do tipo do elemento da lista (integer, string.. nesse                     //contexto é um "produto"    LstOrd = ^Nodo;    Nodo = record  //definição do tipo de cada "nodo"      {codigo:integer;} //<--pode remover essa linha (esses dados estão no Elem)      {preco :real;}    //<--pode remover essa linha      {nome :Elem;}     //<--pode remover essa linha      obj :Elem;   //dado que está sendo armazenado       prox:LstOrd; //endereço do próximo nodo      end;...

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Espero que já tenha feito alguma coisa... senão, antes de continuar lendo, recomendo tentar fazer sozinho.. só após, dê uma conferida nestes códigos que postei, beleza???



Para tentar ajudar, fiz um modelo de como poderia ir fazendo...

//Unit que gerencia uma Lista Ordenada, utilizando//"encadeamento" (ponteiros apontando para ponteiros)UNIT ListaEncOrd; //São 3 qualidades: é uma lista, é encadeada e é ordenada. :)INTERFACE //### DEFINE E LISTA O QUE É VISÍVEL PARA O "MUNDO EXTERNO".   //##### LISTA DE TIPOS GLOBAIS #####  type    tPRODUTO = record   //definição do tipo produto      codigo   :string; //<-- obs.:se for só número, poderia mudar para interger, por exemplo      descricao:string;      preco    :real;      end;    Elem = tPRODUTO; //definição do tipo do elemento da lista (integer, string.. nesse contexto é um "produto"    LstOrd = ^Nodo;  //define um tipo que é será um ponteiro de outro.    Nodo = record    //estrutura de armazenamento      obj :Elem;     //objeto em si que será armazenado      prox:LstOrd;   //endereço da próximo estrutura (O Nodo aponta para o ponteiro de outro Nodo - isso é o "encadeamento")    end;      //##### LISTA DE PROCEDIMENTOS GLOBAIS #####   //procedimento que "inicializa" (prepara) a Lista  procedure criar  (var L:LstOrd);  //função que verifica se a Lista está vazia ou não  function  vazia  (L:LstOrd):boolean;  //procedimento para inserir um novo objeto na Lista (ordenado pelo código)  procedure inserir(var L:LstOrd; objeto:Elem);  //função que localiza um produto na lista pela DESCRICAO  {function  BuscarPorDescricao (L:LstOrd; descricao:tDESCRICAO):LstOrd;} //<--FALTA IMPLEMENTAR  //função que localiza um produto na lista pelo CODIGO  {function  BuscarPorCodigo (L:LstOrd; codigo:integer):LstOrd;}          //<--FALTA IMPLEMENTAR  //função que......  {function  remover1(var L : LstOrd; code : integer): boolean;} //<--FALTA IMPLEMENTAR  //função que......  {function  remover2(var L : LstOrd; x : Elem): boolean;}       //<--FALTA IMPLEMENTAR  //procedimento que exibe todos os objetos que estão na lista.  procedure show   (L:LstOrd);  //<--FALTA IMPLEMENTAR (ainda em testes)    //procedimento que...  {procedure imprimeObjeto(objeto:tPRODUTO);} // não está sendo usada no momentoIMPLEMENTATION //##### IMPLEMENTA OS PROCEDIMENTOS DA INTERFACE E DEFINE TIPO, VARIÁVEIS, PROCEDIMENTOS (ETC) LOCAIS #####  //procedimento que "inicializa" (prepara) a Lista  procedure criar (var L : LstOrd);   // Procedimento para criar Lista    begin    L := nil; //aponto para nulo (para nada). Usando como referência de "fim" do encadeamento.    writeln('Lista iniciada...');    end;  //função que verifica se a Lista está vazia ou não  function vazia   (L:LstOrd):boolean;    begin    if (L = nil) then      vazia := true    else      vazia := false;    end;  //procedimento para inserir um novo objeto na Lista (ordenado pelo código)  procedure inserir(var L:LstOrd; objeto:Elem);    var       N, P:LstOrd; //N=novo, P=auxiliar    begin    New(N); //cria um novo Nodo onde ficará o objeto    N^.obj := objeto; //armazena o objeto no nodo    if (vazia(L)) or (objeto.codigo <= L^.obj.codigo)then //1º e 2ºCondição: 1ºSe a Lista Ordenada L esta vazia      begin                                               //2ºSe o elemento s é menor ou igual ao primeiro elemento da lista.      N^.prox := L; //Nodo apontado por N passa a ser o primeiro da lista L.      L       := N; //Endereço do Nodo apontado por N deve ser copiado para a variavel L. Tal que ambos ponteiros apontem o mesmo nodo.      end        else      begin      P := L; //auxiliar aponta para "L" (copia do endereç do pronteiro inicial)      while (P^.prox <> nil ) and (N^.obj.codigo>P^.prox^.obj.codigo) do //3ºCondição e 4ºCondição: O elemento nome é maior que o primeiro e //existe outro que o supera        P := P^.prox; //vai para o próximo      N^.prox := P^.prox; //N aponto para a posição atual de P      P^.prox := N; //P agora aponto para N      // No final, P -> N -> Z (Z = para onde P estava apontand)!!!      end;    end;      //procedimento que exibe todos os objetos que estão na lista.  procedure show   (L:LstOrd);  //<--FALTA IMPLEMENTAR (ainda em testes)      var    P: LstOrd; //P=ponteiro auxiliar    begin    P:=L; //faz uma cópia do ponteiro L    if Vazia (L) then      writeln (' A lista esta vazia ')    else      begin  //123456789 123456 123456789 123456789 123456789 123456789 1 1234567890  (apenas uma referência para o afastamento!!!      writeln('    PRODUTO     |                DESCRICAO                |  PRECO  ');      writeln;      while (P <> nil) do //enquanto não chegar ao fim da Lista        begin        {imprimeObjeto(P^.obj);} //se estivesse pronto, ficaria mais organizado!        writeln(P^.obj.codigo:16,' ',P^.obj.descricao:40,' ',P^.obj.preco:10:2); //exibe os dados do produto atual        P:= P^.prox; //vai para o próximo       end;      end; end;          END.{Só um comentário:  Vejamos esse trecho:  N^.obj.codigo>P^.prox^.obj.codigo  É bem simples: <N> é "Nodo", <Obj> é o que está sendo armazenado, <código> é um dos"atributos" do objeto, ou seja, não dá para comparar diretamente N^.obj > P^.prox^.obj...o que desse objeto é maior que o outro??? Logo, "foi definido" que será o código... se foroutro, muda para o outro...}

Para testar, usei esse código:
 

PROGRAM testeUnitListaOrdenada;uses  CRT,  ListaEncOrd;var  listaProdutos :LstOrd;  novoProduto   :tPRODUTO;  BEGIN//preparando programaClrScr; //limpa a tela (pertense a Unit CRT)criar(listaProdutos);//tentar exibir... (a lista está vazia)show(listaProdutos);//cadastrando produtoswriteln('Bla bla bla');writeln;//exemplo se fosse cadastar com valores pré-definidosnovoProduto.codigo   :='MHH9748726';novoProduto.descricao:='Mouse de alta resolucao';novoProduto.preco    :=43.99;inserir(listaProdutos, novoProduto);writeln('Produto ',novoProduto.codigo,' adicionado com sucesso');writeln;//exemplo se fosse cadastar com valores pré-definidosnovoProduto.codigo   :='tech002';novoProduto.descricao:='Volante de com cambio em H';novoProduto.preco    :=899.73;inserir(listaProdutos, novoProduto);writeln('Produto ',novoProduto.codigo,' adicionado com sucesso');writeln;//exemplo se fosse solicitandowriteln;writeln('DADOS DO NOVO PRODUTO');write('CODIGO   :'); readln(novoProduto.codigo);write('DESCRICAO:'); readln(novoProduto.descricao);write('PRECO    :'); readln(novoProduto.preco);inserir(listaProdutos, novoProduto);writeln('Produto ',novoProduto.codigo,' adicionado com sucesso');writeln;//exemplo se fosse cadastar com valores pré-definidosnovoProduto.codigo   :='CdH-1092391';novoProduto.descricao:='Apenas inventei!!';novoProduto.preco    :=110.23;inserir(listaProdutos, novoProduto);writeln('Produto ',novoProduto.codigo,' adicionado com sucesso');writeln;writeln;writeln;show(listaProdutos);writeln;writeln;writeln('FIM DO PROGRAMA');ReadKey;END.

Qualquer coisa é só postar!

 

No aguardo.

Link para o comentário
Compartilhar em outros sites


unit listaencad;

  

interface

 type produto = record

      codigo  : integer;

      nome    : string;

      preco   : real;

 end;

      List = ^no;    //Lista é ponteiro.

      no = record

     obj     : produto;

       proximo : List;

      end;

 procedure criar    (var L : List);

 function vazia     (L : list): boolean;

 procedure inserir  (var L : list; x : produto);

 function Buscar1   (L : list; s : produto): list;

 function Buscar2   (L : list; cod : produto): list;

 procedure remover1 (var L : list; cod : produto);

 function remover2  (var L : list; s : produto): boolean;

 procedure mostrar  (L : list);

 implementation

 procedure criar (var L : list);   // Procedimento para criar list

 begin

     L := nil;

     writeln ('lista iniciada...');

 end;

 function vazia (L : list): boolean;    //Uma list Vazia é representada por um Ponteiro cujo valor é Nulo.

 begin

  if (l = nil) then

    vazia := true

  else

    vazia := false;

 end;

 procedure inserir (var L : list; x : produto);     // Procedimento para inserir um produto na list L

 var

  N, P : list;   //N e P são Ponteiros.

 begin

     new(N);                //Criar ponteiro

     N^.obj := x;

     if vazia (L) then      //1º e 2ºCondição: 1ºSe a list Ordenada L esta vazia

     begin                  //2ºSe o elemento s é menor ou igual ao primeiro elemento da list.

        N^.proximo := L;    //Nodo apontado por N passa a ser o primeiro da list L.

      L := N;             //Endereço do Nodo apontado por N deve ser copiado para a variavel L. Tal que ambos ponteiros apontem o mesmo nodo.

        writeln (x.nome,' foi inserido(a) na lista!');

     end

     else

     begin

          P := L;

          while (P^.proximo <> nil )do      //3ºCondição e 4ºCondição: O elemento x é maior que o primeiro e existe outro que o supera

          begin

               P := P^.proximo;

          end;

          N^.proximo := P^.proximo;

          P^.proximo := N;

          writeln (x.nome, ' Elemento inserido(a) na lista!');

     end;

     // Final Da Ordenacao list Encadeada .

          begin

               writeln;

               writeln ('      [Cadastrada Com Sucesso]');

          end;

 end;

 //     Function Procurar Pelo Nome.

 function Buscar1 (L : list; s : produto): list;

 var

    P : list;

 begin

      if vazia(L) then

         writeln (' Impossivel Encontrar! Nao  Tem produtos No Banco De Dados ! ')

      else

      begin

            P := L;

            while (P <> nil) and (s.nome <> P^.obj.nome) do

                  P := P^.proximo;

            if (P <> nil) and (s.nome = P^.obj.nome) then

            begin

writeln('[NOME]                    [CODIGO]                                   [PRECO] ');

            writeln(P^.obj.nome   ,'-------------' , '--------------', P^.obj.codigo ,'-------------' , '-----------',    P^.obj.preco:9:2 ,'--');

               buscar1 := P

            end

            else

            if (P = nil)then

            begin

               buscar1 := nil;

               writeln;

               writeln('   ',s.nome,'   [Nao Encontrado]');

            end;

       end;

  end;

 //     Function Procurar usando o codigo.

 function Buscar2 (L : list; cod : produto): list;

 var

    P : list;

 begin

      if vazia(L) then

         writeln (' Impossivel Encontrar! Nao  Tem produtos No Banco De Dados ! ')

      else

      begin

           P := L;

           while (P <> nil) and (cod.codigo <> P^.obj.codigo) do

                 P:=P^.proximo;

           if (P <> nil) and (cod.codigo = P^.obj.codigo) then

           begin

               writeln('[NOME]                    [CODIGO]                                      [PRECO] ');

                writeln(P^.obj.nome   ,'-------------' , '--------------', cod.codigo ,'-------------' , '---------------',P^.obj.preco:9:2 ,'--------');

                buscar2 := P;

           end

           else

              if (P = nil)then

              begin

                  buscar2 := nil;

                  writeln;

                  writeln('   ',cod.codigo,'   [Nao Encontrado]');

              end;

      end;

 end;

  //Remover produto por codigo

  procedure remover1 (var L : list; cod : produto);

  var

     P, Q : list;

  begin

     if vazia(L)then

        writeln(  'lista vazia!')

     else

         if (L^.obj.codigo = cod.codigo) then

         begin

              P := L;

              L := L^.proximo;

              writeln (cod.codigo, ' foi removido(a) da lista!');

              dispose(P);

         end

         else

         begin

              P:=L;

                   while((P^.proximo <> nil) and (cod.codigo <> P^.proximo^.obj.codigo )) do //4ºCondição : O elemento cod é diferente ao primeiro elemento de L.

                   begin

                        P := P^.proximo;

                   end;

                if (P^.proximo <> nil) and (P^.proximo^.obj.codigo = cod.codigo )then

                begin

                       Q := P^.proximo;

                       P^.proximo := Q^.proximo;

                       writeln (cod.codigo, ' foi removido(a) da lista!');

                       dispose(Q);

                end

                else

end;

 end;

 //remover um elemento da list por nome

 function remover2 (var L : list; s : produto): boolean;

 var

    P, Q : list;

 begin                                               //O Primeiro elemento é o L^.obj

    if vazia(L) or (s.nome < L^.obj.nome) then       //1º e 2ºCondição: 1ºCondição : A list ordenada L está vazia

       remover2 := false                             //2ºCondição : O elemento s é menor que o primeiro elemento da list ordenada L.

    else

      if (s.nome = L^.obj.nome) then               //3ºCondição : O elemento s é igual ao primeiro elemento da list ordenada L.

        begin

             P := L;

          L := L^.proximo;

             writeln (s.nome, ' foi removido(a) da lista!');

             dispose (P);

             remover2 := true;

        end

        else

        begin

             P := L;

             while (P^.proximo <> nil) and (s.nome > P^.proximo^.obj.nome) do //4ºCondição : O elemento s é maior que o primeiro elemento de L.

                   P := P^.proximo;

             if (P^.proximo <> nil) and (s.nome = P^.proximo^.obj.nome) then

             begin

                  Q := P^.proximo;

                  P^.proximo := Q^.proximo;

                  writeln (s.nome, ' foi removido(a) da lista!');

                  dispose (Q);

                  remover2 := true;

             end

             else

                 remover2 := false;

end;          

 end;

 //Imprimindo list Ordenada.

 procedure mostrar(L:list);

 begin

      if vazia (L) then

    writeln (' A lista esta vazia ')

      else

      begin

       writeln('[NOME]                    [CODIGO]                         [PRECO] ');

           while (L <> nil) do

           begin

                writeln(L^.obj.nome   ,'-------------' , '--------------', L^.obj.codigo ,'-------------' , '---------------',L^.obj.preco:9:2 ,'--------');

                L := L^.proximo;

           end;

      end;

 end;

begin

end.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

Você só postou somente o código... não comentou nada... :)

Então, vou fazer alguns comentários... vamos lá:

1) REQUISITOS DO PROGRAMA
Você deve se atentar e seguir o que está sendo pedido... Na descrição tem "código, descrição e preço", mas no código tem "codigo, nome, preco"... ou seja, está usando "nome" no lugar de "descrição". Creio eu que não seja a mesma coisa... Independente, sugiro que use o termo que ele especificou.

2) INDENTAÇÃO DE CÓDIGO
Você precisa SEMPRE deixar o seu código bem arrumado. A indentação faz parte do processo de modelagem, pois ela também indica qual a sua intenção em cada trecho, ou seja, se está indentado, quer dizer que "está vincula a linha que está no indentamento anterior acima"... sugiro que tente deixar o código indentado já na medida que vai programando... é muito útil para encontrar erros!!! (de sintaxe e de lógica)
Outra dica interessante é NÃO USAR O TAB, pois cada compilador tem uma configuração diferente, logo pode atrapalhar.. USE SEMPRE ESPAÇOS.
Neste mesmo contexto, evite também esses espaços entre as linhas...Qual a necessidade deles? ... apenas vai deixar "visualmente bagunçado".

Abaixo, tentando seguir o seu padrão, o seu código "reindentado".
 

UNIT ListaEncad;INTERFACE  type    produto = record      codigo  : integer;      nome    : string;      preco   : real;      end;    List = ^no;    //Lista é ponteiro.    no = record      obj     : produto;      proximo : List;      end;  procedure criar   (var L : List);  function  vazia   (L : list): boolean;  procedure inserir (var L : list; x : produto);  function  Buscar1 (L : list; s : produto): list;  function  Buscar2 (L : list; cod : produto): list;  procedure remover1(var L : list; cod : produto);  function  remover2(var L : list; s : produto): boolean;  procedure mostrar (L : list);IMPLEMENTATION  procedure criar (var L : list);   // Procedimento para criar list    begin      L := nil;      writeln ('lista iniciada...');    end;  function vazia (L : list): boolean;    //Uma list Vazia é representada por um Ponteiro cujo valor é Nulo.    begin      if (l = nil) then        vazia := true      else        vazia := false;    end;  procedure inserir (var L : list; x : produto);     // Procedimento para inserir um produto na list L    var      N, P : list;   //N e P são Ponteiros.    begin      new(N);                //Criar ponteiro      N^.obj := x;      if vazia (L) then      //1º e 2ºCondição: 1ºSe a list Ordenada L esta vazia        begin                  //2ºSe o elemento s é menor ou igual ao primeiro elemento da list.          N^.proximo := L;    //Nodo apontado por N passa a ser o primeiro da list L.          L := N;             //Endereço do Nodo apontado por N deve ser copiado para a variavel L. Tal que ambos ponteiros apontem o mesmo nodo.          writeln (x.nome,' foi inserido(a) na lista!');        end      else        begin          P := L;          while (P^.proximo <> nil )do      //3ºCondição e 4ºCondição: O elemento x é maior que o primeiro e existe outro que o supera            begin //SÓ TEM UMA LINHA, NÃO PRECISA DE BEGIN/END [Simon]              P := P^.proximo;            end;          N^.proximo := P^.proximo;          P^.proximo := N;          writeln (x.nome, ' Elemento inserido(a) na lista!');          end;      // Final Da Ordenacao list Encadeada .      begin  //ESSE BEGIN E SEU END NÃO DEVEM EXISTIR!!! (está vinculado a o que) [Simon]        writeln;        writeln ('      [Cadastrada Com Sucesso]');      end;  //AQUI O END QUE NÃO DEVERIA EXISTIR [Simon]    end;  //     Function Procurar Pelo Nome.  function Buscar1 (L : list; s : produto): list;    var      P : list;    begin      if vazia(L) then        writeln (' Impossivel Encontrar! Nao  Tem produtos No Banco De Dados ! ')      else        begin          P := L;          while (P <> nil) and (s.nome <> P^.obj.nome) do            P := P^.proximo;          if (P <> nil) and (s.nome = P^.obj.nome) then            begin              writeln('[NOME]                    [CODIGO]                                   [PRECO] ');              writeln(P^.obj.nome   ,'-------------' , '--------------', P^.obj.codigo,'-------------' , '-----------',P^.obj.preco:9:2 ,'--');              buscar1 := P; //faltou um ";" [Simon]            end          else            if (P = nil)then              begin                buscar1 := nil;                writeln;                writeln('   ',s.nome,'   [Nao Encontrado]');              end;        end;    end;  //     Function Procurar usando o codigo.  function Buscar2 (L : list; cod : produto): list;    var      P : list;    begin      if vazia(L) then        writeln (' Impossivel Encontrar! Nao  Tem produtos No Banco De Dados ! ')      else        begin          P := L;          while (P <> nil) and (cod.codigo <> P^.obj.codigo) do            P:=P^.proximo;          if (P <> nil) and (cod.codigo = P^.obj.codigo) then            begin              writeln('[NOME]                    [CODIGO]                                      [PRECO] ');              writeln(P^.obj.nome   ,'-------------' , '--------------', cod.codigo ,'-------------' , '---------------',P^.obj.preco:9:2 ,'--------');              buscar2 := P;            end          else            if (P = nil)then              begin                buscar2 := nil;                writeln;                writeln('   ',cod.codigo,'   [Nao Encontrado]');              end;        end;    end;  //Remover produto por codigo  procedure remover1 (var L : list; cod : produto);    var      P, Q : list;    begin      if vazia(L)then        writeln(  'lista vazia!')      else        if (L^.obj.codigo = cod.codigo) then          begin            P := L;            L := L^.proximo;            writeln (cod.codigo, ' foi removido(a) da lista!');            dispose(P);          end        else          begin            P:=L;            while((P^.proximo <> nil) and (cod.codigo <> P^.proximo^.obj.codigo )) do //4ºCondição : O elemento cod é diferente ao primeiro elemento de L.              begin //SÓ TEM UMA LINHA, NÃO PRECISA DE BEGIN/END [Simon]                P := P^.proximo;              end;            if (P^.proximo <> nil) and (P^.proximo^.obj.codigo = cod.codigo )then              begin                Q := P^.proximo;                P^.proximo := Q^.proximo;                writeln (cod.codigo, ' foi removido(a) da lista!');                dispose(Q);              end            else          end;    end;  //remover um elemento da list por nome  function remover2 (var L : list; s : produto): boolean;    var      P, Q : list;    begin                                               //O Primeiro elemento é o L^.obj      if vazia(L) or (s.nome < L^.obj.nome) then       //1º e 2ºCondição: 1ºCondição : A list ordenada L está vazia        remover2 := false                             //2ºCondição : O elemento s é menor que o primeiro elemento da list ordenada L.      else        if (s.nome = L^.obj.nome) then               //3ºCondição : O elemento s é igual ao primeiro elemento da list ordenada L.          begin            P := L;            L := L^.proximo;            writeln (s.nome, ' foi removido(a) da lista!');            dispose (P);            remover2 := true;          end        else          begin            P := L;            while (P^.proximo <> nil) and (s.nome > P^.proximo^.obj.nome) do //4ºCondição : O elemento s é maior que o primeiro elemento de L.              P := P^.proximo;            if (P^.proximo <> nil) and (s.nome = P^.proximo^.obj.nome) then              begin                Q := P^.proximo;                P^.proximo := Q^.proximo;                writeln (s.nome, ' foi removido(a) da lista!');                dispose (Q);                remover2 := true;              end            else              remover2 := false;          end;              end;  //Imprimindo list Ordenada.  procedure mostrar(L:list);    begin      if vazia (L) then        writeln (' A lista esta vazia ')      else        begin          writeln('[NOME]                    [CODIGO]                         [PRECO] ');          while (L <> nil) do            begin              writeln(L^.obj.nome   ,'-------------' , '--------------', L^.obj.codigo ,'-------------' , '---------------',L^.obj.preco:9:2 ,'--------');              L := L^.proximo;            end;        end;    end;begin //NÃO PRECISA DESSE BEGIN, SÓ SE VOCÊ QUISESSE EXECETURAR ALGO QUANDO A UNIT FOSSE EXECUTADA. Pode remover esse BEGIN![Simon]END.

Falta algo o programa... (uma base... para testar a unit, e já se preparar para implementar o arquivo)
Depois implementar o arquivo.

 

No aguardo.

Link para o comentário
Compartilhar em outros sites


program princi;

uses crt, Dos, listaencad;

var

  L1:list;

    a:produto;

    opcao:integer;

    op:string;

procedure menu;

begin

   repeat

                textcolor (lightred);

                gotoxy(24,2);

                 //---------------------Menu Principaç--------------------------

                              gotoxy(35,2);

                              textcolor (lightgreen);

                              writeln ('MENU');

                              textcolor (lightred);

                              writeln;

                              gotoxy(30,4);

                              writeln ('ESCOLHA UMA OPCAO');

                              writeln;

                              gotoxy(23,6);

                              writeln ('1- Inserir ou cadastrar produto ');

                              gotoxy(23,7);

                              writeln ('2- Procurar produto  por nome');

                              gotoxy (23,8);

                              writeln ('3- Procura produto por codigo');

                              gotoxy(23,9);

                              writeln ('4- Remover produto por codigo no sistema');

                              gotoxy(23,10);

                              writeln('5- Remover produto por nome no sistema');

                              gotoxy (23,11);

                              writeln ('6- Ver lista completa');

                              gotoxy (23,12);

                              writeln ('7- Gravar lista em arquivo');

                              gotoxy (23,13);

                              writeln ('8- SAIR');

                              gotoxy(23,16);

                              write ('Escolha uma opcao e Tecle [ENTER]: ');

                              readln(opcao);

           if (opcao > 0) and (opcao <= 7) then

              begin

                   case (opcao) of

                        1: begin            //CADASTRO DE PRODUTO

                           clrscr;

                           //delay(1000);

                           writeln('CADASTRO DE PRODUTO');

                           write('Informe o codigo do Produto: ');

                           readln(a.codigo);

                           write('Informe o nome do Produto: ');

                           readln(a.nome);

                           write('Informe o preco do Produto: ');

                           readln(a.preco);

                           inserir(L1,a);

                           writeln(' Deseja Continuar sim ou nao [n] : ');

                           readln(op);

                           while( op='s')do

                           begin

                            clrscr;

                            writeln('CADASTRO DE PRODUTO');

                           write('Informe o codigo do Produto: ');

                           readln(a.codigo);

                           write('Informe o nome do Produto: ');

                           readln(a.nome);

                           write('Informe o preco do Produto: ');

                           readln(a.preco);

                           inserir(L1,a);

                           writeln(' Deseja Continuar sim ou nao [n] : ');

                           readln(op);

                            end;

                           write('Pressione uma tecla...');

                           readkey;

                            sound(100);

                        end;

                      2: begin               // Pesquisa Nome;

                           clrscr;

                           //delay(1000);

                           writeln('PROCURA  PRODUTO POR NOME');

                           write('Informe o nome do Produto: ');

                           read(a.nome);

                           buscar1(L1,a);

                           //delay(4000);

                           writeln();

                           write('Pressione uma tecla...');

                           readkey;

                           clrscr;

                      end;

                      3: begin               // Pesquisar codigo

                            clrscr;

                            //delay(1000);

                            writeln('PROCURA  PRODUTO POR CODIGO');

                            writeln('Informe o Codigo do produto : ');

                            read(a.codigo);

                            buscar2(L1,a);

                            //delay(4000);

                            writeln();

                            write('Pressione uma tecla...');

                            readkey;

                            clrscr;

                      end;

                      4: begin               //REMOÇÃO DE PRODUTO

                            clrscr;

                            writeln('REMOCAO DE PRODUTO POR CODIGO');

                            write('Informe o Codigo do Produto: ');

                            readln(a.codigo);

                            remover1(L1,a);

                            writeln();

                            write('Pressione uma tecla...');

                            readkey;

                            clrscr;

                            //delay(1000);

                      end;

                       5: begin

                            clrscr;

                            writeln('REMOCAO DE PRODUTO POR NOME');

                            write('Informe o Nome do Produto: ');

                            readln(a.nome);

                            remover2(L1,a);

                            writeln();

                            write('Pressione uma tecla...');

                            readkey;

                            clrscr;

                            //delay(4000);//Para dar uma pausa.

                       end;

                       6: begin              //LISTA DE PRODUTO

                              clrscr;

                              mostrar(L1);

                              writeln();

                              write('Pressione uma tecla...');

                              readkey;

                              //delay (4000);

                          end;

                       7 : begin

                               clrscr;

                               delay(4000);

                               textcolor(14);

                           end

                         else

                                           // Erro se a opção for inválida

                              clrscr;

                              writeln;

                              writeln ('[OPCAO INVALIDA TENTE NOVAMENTE]');

                              readkey;

                              sound(100);

                         end;

            end;

           sound(100);

            clrscr;

    until (opcao = 8);

 //  menu;

  textcolor (lightred);;

 writeln;

 writeln;

 clrscr;

 gotoxy(23,10);

 writeln ('Tecle [ENTER] para sair');

 sound(100);

end;

begin

   menu;

   readkey;

end.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Depende... tem várias formas...

 

Algo bem simples poderia ser assim...

writeln('Seja Bem-Vindo');readln; //servindo para dar um pause (aguarda um ENTER para continuar)

Colocando antes de chamar o "menu".

 

 

SOBRE O CÓDIGO POSTADO:

1) na minha opinião, o texto em "vermelho" não ficou legal... eu aconselharia tentar outras cores.. mas fica ao seu critério, é claro.

2) para que está carregando a Unit "Dos"?

3) falta indentar código... ele está um pouco bagunçado.

4) após ajustar certinho e testar, poderia já ir tentando implementar a parte do arquivo..

 

Por favor, veja esses pontos e nos responda/corrija/comente um por um, ok?

 

No aguardo

Abraços

3)

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...