Jony Rato Posted January 31, 2014 at 07:52 PM Report #543359 Posted January 31, 2014 at 07:52 PM 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
Super.D Posted January 31, 2014 at 08:38 PM Report #543365 Posted January 31, 2014 at 08:38 PM 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!
Jony Rato Posted January 31, 2014 at 08:47 PM Author Report #543366 Posted January 31, 2014 at 08:47 PM (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 January 31, 2014 at 08:51 PM by nunopicado Adicionadas tags GeShi
nunopicado Posted January 31, 2014 at 08:53 PM Report #543367 Posted January 31, 2014 at 08:53 PM 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.
Jony Rato Posted January 31, 2014 at 09:00 PM Author Report #543369 Posted January 31, 2014 at 09:00 PM (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 January 31, 2014 at 09:15 PM by Jony Rato GeSHi
nunopicado Posted January 31, 2014 at 09:19 PM Report #543371 Posted January 31, 2014 at 09:19 PM 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.
Jony Rato Posted January 31, 2014 at 09:36 PM Author Report #543374 Posted January 31, 2014 at 09:36 PM É 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?
nunopicado Posted January 31, 2014 at 10:46 PM Report #543381 Posted January 31, 2014 at 10:46 PM 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.
Jony Rato Posted January 31, 2014 at 10:53 PM Author Report #543382 Posted January 31, 2014 at 10:53 PM (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 January 31, 2014 at 11:08 PM by thoga31 GeSHi
thoga31 Posted January 31, 2014 at 11:10 PM Report #543385 Posted January 31, 2014 at 11:10 PM 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!
Jony Rato Posted January 31, 2014 at 11:30 PM Author Report #543388 Posted January 31, 2014 at 11:30 PM 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
nunopicado Posted January 31, 2014 at 11:32 PM Report #543390 Posted January 31, 2014 at 11:32 PM 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.
Jony Rato Posted January 31, 2014 at 11:37 PM Author Report #543392 Posted January 31, 2014 at 11:37 PM (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 January 31, 2014 at 11:39 PM by nunopicado Adicionada linguagem GeShi
nunopicado Posted January 31, 2014 at 11:38 PM Report #543393 Posted January 31, 2014 at 11:38 PM 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.
thoga31 Posted January 31, 2014 at 11:40 PM Report #543395 Posted January 31, 2014 at 11:40 PM (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 January 31, 2014 at 11:42 PM by thoga31 Knowledge is free!
Jony Rato Posted January 31, 2014 at 11:45 PM Author Report #543396 Posted January 31, 2014 at 11:45 PM Sim, por exemplo... continua a mostrar o ultimo inserido
nunopicado Posted January 31, 2014 at 11:47 PM Report #543397 Posted January 31, 2014 at 11:47 PM 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.
thoga31 Posted January 31, 2014 at 11:47 PM Report #543398 Posted January 31, 2014 at 11:47 PM (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 January 31, 2014 at 11:48 PM by thoga31 Knowledge is free!
Jony Rato Posted January 31, 2014 at 11:50 PM Author Report #543399 Posted January 31, 2014 at 11:50 PM Reparei agora, o teu px é que é o inicio da lista, não é? mete a linha p1 := px antes do if, deverá resolver. continua a fazer o mesmo :/
thoga31 Posted January 31, 2014 at 11:52 PM Report #543400 Posted January 31, 2014 at 11:52 PM 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ê. Knowledge is free!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now