Jump to content

Recommended Posts

Posted

Boas pessoal

Preciso da vossa ajuda

Tenho que criar um programa em pascal com ponteiros, e eu já nao me lembro como se trabalha em ponteiros(tenho o módulo em atraso)

O exercicio é:

Implementar dinamicamente uma lista de clientes de uma empresa, com as seguintes operações:

a) Anexar um novo cliente no fim da lista.

b) Buscar os dados de um cliente dado o seu nome.

c) Contar o número de clientes cadastrados.

d) Mostrar os dados do primeiro cliente da lista.

e) Mostrar os dados do último cliente da lista

f) Mostrar os dados no n-ésimo cliente da lista

Se me puderem ajudar agradecia muito

Obrigado

  • Replies 59
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted (edited)

Sabes que ninguém te vai oferecer o código já feito nem mesmo no Natal... Aqui ajudamos nas dúvidas e não na resolução total do teu problema!

eu sei que não dão o codigo

a minha primeira duvida é:

tenho o codigo para inserir no fim da lista e quero que quando insira me mande de volta para o menu

Program Pzim ;
type clientes= record
nome: string;
prox: ^clientes;
end;

var opc, opc2: char;
  p1, px: ^clientes;

procedure inserir;
Begin
 new(px);
 writeln ('Insira um novo cliente');
 readln (px^.nome);
 px^.prox:= p1;
 p1:= px;
end;

Begin
Writeln ('Menu Principal');
writeln ('1- Inserir um novo cliente');
writeln ('2- Procurar');
writeln ('3- Contar o número de clientes');
writeln ('4- Mostrar o primeiro cliente');
writeln ('5- Mostrar o último cliente');
writeln ('6- Insira o número do cliente que deseja procurar');
writeln ('Indique a opção que deseja: ');
readln (opc);
case opc of
'1': inserir;

end;
End.
Edited by nunopicado
Adicionadas tags GeShi
Posted

eu sei que não dão o codigo

a minha primeira duvida é:

tenho o codigo para inserir no fim da lista e quero que quando insira me mande de volta para o menu

Essa dúvida não tem propriamente a ver com ponteiros, mas aqui fica:

Tens de meter o menu dentro de um ciclo, para que ele volte lá no fim.

O ciclo, que pode ser um repeat...until, deverá ser executado até que a variável opc seja ??? (falta-te por a opção de sair no menu).

Assim, todo o menu será repetido até que se dê ordem para sair.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Essa dúvida não tem propriamente a ver com ponteiros, mas aqui fica:

Tens de meter o menu dentro de um ciclo, para que ele volte lá no fim.

O ciclo, que pode ser um repeat...until, deverá ser executado até que a variável opc seja ??? (falta-te por a opção de sair no menu).

Assim, todo o menu será repetido até que se dê ordem para sair.

muito obrigado

para mostrar o último tenho assim

procedure mostrar_ultimo;
Begin
px:= p1;
if (px= nil ) then
writeln ('Não existem clientes');
while (px<> nil) do
begin
writeln(px^.nome);
px := px^.prox;
end;
end;

mostra o ultimo em primeiro lugar mas tambem mostra os outros e eu so quero o ultimo

Edited by Jony Rato
GeSHi
Posted

mostra o ultimo em primeiro lugar mas tambem mostra os outros e eu so quero o ultimo

É normal, visto que tens o Writeln dentro do ciclo sem nenhuma condição - mostra sempre.

Se queres mostrar apenas o último, faz com que o while pare quando o proximo elemento seja nil, e não quando o elemento actual.

Dentro do while, metes apenas a mudança do ponteiro, e o writeln passas para depois do while.

Como ele vai parar quando o próximo for nil, irá parar o while no último elemento.

Logo, ao escreveres depois, irás estar a mostrar esse último.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

É normal, visto que tens o Writeln dentro do ciclo sem nenhuma condição - mostra sempre.

Se queres mostrar apenas o último, faz com que o while pare quando o proximo elemento seja nil, e não quando o elemento actual.

Dentro do while, metes apenas a mudança do ponteiro, e o writeln passas para depois do while.

Como ele vai parar quando o próximo for nil, irá parar o while no último elemento.

Logo, ao escreveres depois, irás estar a mostrar esse último.

Muito obrigado

ja consegui

para mostrar o primeiro é parecido?

Posted

Muito obrigado

ja consegui

para mostrar o primeiro é parecido?

O primeiro estará em p1, pelo que posso perceber do teu código.

Basta mostrares os valores do p1.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

O primeiro estará em p1, pelo que posso perceber do teu código.

Basta mostrares os valores do p1.

procedure mostrar_primeiro;
Begin
 p1:= px;
 if (p1 = nil ) then
 writeln ('Não existem clientes');
 while (p1 <> nil) do
  begin  
 p1 := p1^.prox;
 end; 
 writeln('O primeiro cliente da lista é o: ', p1^.nome);
end;

eu tenho assim mas em vez de me aparecer o nome que eu quero aparecem-me caracteres esquisitos

Edited by thoga31
GeSHi
Posted

1) Se p1 é a variável onde tens a cabeça da lista, não fizeste isso ao contrário? Assim estás a perder a referência original de p1.

2) Se p1 é a cabeça da lista, porque é que a estás a percorrer até ao fim? Basta mostrares o valor de p1, mais nada.

Knowledge is free!

Posted

1) Se p1 é a variável onde tens a cabeça da lista, não fizeste isso ao contrário? Assim estás a perder a referência original de p1.

2) Se p1 é a cabeça da lista, porque é que a estás a percorrer até ao fim? Basta mostrares o valor de p1, mais nada.

podes explicar melhor sff? desculpa mas como referi ja nao uso ponteiros a algum tempo

Posted

p1 é onde tens o primeiro elemento.

Logo, se p1 for <> de nil, p1^.nome tem o primeiro elemento.

Simples assim, sem whiles, nem atribuições, nem nada do género!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

p1 é onde tens o primeiro elemento.

Logo, se p1 for <> de nil, p1^.nome tem o primeiro elemento.

Simples assim, sem whiles, nem atribuições, nem nada do género!

procedure mostrar_primeiro;
Begin
if (p1 <> nil) then
writeln('O primeiro cliente da lista é o: ', p1^.nome);
end;

Assim certo?

Edited by nunopicado
Adicionada linguagem GeShi
Posted

Sim, por exemplo...

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Já agora, fica aqui esta função útil.

Não foi testada, mas lembro-me de ter feito algo deste género em tempos (não sei onde anda o código, e não me apetece montar todo um programa para testar isto, lol):

type TSmallIntList = record
       value : smallint;
       next  : ^TSmallIntList;  // acho que dá para fazer isto xD
    end;

function GetFromLL(head : TSmallIntList; elem : word) : smallint;
(* Obtém o elemento nº "elem", se existir, da lista ligada de SmallInt que começa em "head" *)
var cur : TSmallIntList;
   counter : word = 1;
begin
  GetFromLL := 0;
  cur := head;
  while counter <> elem do begin
     cur := cur^.next;
     inc(count);
     if cur = nil then
        exit;
  end;
  GetFromLL := cur^.value;
end;
Edited by thoga31

Knowledge is free!

Posted

continua a mostrar o ultimo inserido

Reparei agora, o teu px é que é o inicio da lista, não é?

mete a linha p1 := px antes do if, deverá resolver.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

continua a mostrar o ultimo inserido

Vê o teu procedimento inserir. p1 fica a apontar para o novo elemento.

Andas a trocar imenso p1 e px, tens de definir bem o que é o quê.

Edited by thoga31

Knowledge is free!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.