Ir ao conteúdo

Mostrar os maiores valores em uma lista encadeada


johnatan.etges

Posts recomendados

Postado

Olá, venho aqui pedir ajuda para um trabalho que eu preciso entregar nesta sexta feira.

A maior parte eu já fiz, eu estou precisando de ajuda na parte que diz o seguinte:

2- Altere o programa para que mostre, quando solicitado, as 5 maiores pontuações da lista.

Bem, acontece que eu já tentei de vários modos (os que eu conheço pelo menos :D ), mas não consegui nenhum resultado.

Vou colocar aqui o que eu já fiz:

program jm007;
uses crt;
type
pno = ^tno;
tno = record
score : integer;
prox, ant : pno;
end;
var
lista: pno;
op : char='0';
cont : pno;
i : integer =1;
j : integer =1;

function criano(l:pno; combo : integer): pno;
var tmp : pno;
begin
new (tmp);
tmp^.score := combo;
if l <> nil then
begin
tmp^.prox := l;
tmp^.ant := l^.prox;
end
else
begin
tmp^.prox := nil;
tmp^.ant := nil;
cont := tmp;
end;
criano := tmp;
end;

procedure pedevalor;
var pontos : integer = 0;
begin
clrscr;
writeln('Vocˆ escolhe a op‡Æo para adicionar pontua‡Æo.');
writeln('Digite a pontua‡Æo do jogador.');
readln(pontos);
lista := criano(lista,pontos);
if lista^.score = pontos then
writeln('Pontua‡Æo adicionada com sucesso.')
else
writeln('Erro interno x195790x. NÆo foi poss¡vel proceder com a opera‡Æo.');
delay(2000);
end;

procedure mostrartudo(lista:pno;i : integer);
begin
clrscr;
if lista <> nil then
begin
writeln(i,' § jogador: ',lista^.score);
mostrartudo(lista^.prox,i+1);
delay(1000);
end;
end;

function mostra_5_maiores(lista : pno; maior : integer; j: integer): integer;
begin
if lista <> nil then
begin
if j = 5 then
mostra_5_maiores := j
else
if lista^.score > maior then
begin
writeln(j,' ¦ maior pontua‡Æo : ',lista^.score);
maior := lista^.score;
mostra_5_maiores := mostra_5_maiores(lista^.prox,maior,j+1);
end
else
mostra_5_maiores := mostra_5_maiores(lista^.ant,maior,j+1);
end;

end;

procedure menu;
begin
writeln('Menu principal. Escolha uma das op‡äes a seguir');
writeln('1-Adicionar pontua‡Æo.');
writeln('2-Ver todas as pontua‡äes.');
writeln('3-Ver as 5 maiores pontua‡äes.');
writeln('4-Sair.');
readln(op);
end;

begin
lista := nil;
repeat
clrscr;
menu;
if op = '1' then
pedevalor
else
if op = '2' then
begin
i := 1;
mostrartudo(lista,i);
end
else
if op = '3' then
exit; //deixei exit aqui enquanto não há opções para ele
until op = '4';
end.

Bem eu não quero que resolvam o exercício para mim, quero apenas que vocês me deem "uma luz" de como eu faço para chegar na resolução. É claro que quanto mais detalhado melhor :D .

Desde já muito obrigado.

Postado
Bem eu não quero que resolvam o exercício para mim, quero apenas que vocês me deem "uma luz" de como eu faço para chegar na resolução. É claro que quanto mais detalhado melhor :D .

Desde já muito obrigado.

Bem, atualizando um pouco :D , eu consegui realizar um método que faça isso. Compila tudo certo, porém ao executar se eu adicionar valores por exemplo : 5, 10, 15, 20, 25, 30, 35, 40 ele deveria mostrar :

40

35

30

25

20

porém o programa exibe o seguinte:

40

0

0

0

0

gostaria que me ajudassem a resolver este problema orcorrido.

segue o que eu fiz até agora:

program jm007;
uses crt;
type
pno = ^tno;
tno = record
score : integer;
prox, ant : pno;
end;
var
maiores : array[1..5] of integer;
lista: pno;
op : char='0';
cont : pno;
i : integer =1;
j : integer =1;
maior : integer=0;


function criano(l:pno; combo : integer): pno;
var tmp : pno;
begin
new (tmp);
tmp^.score := combo;
if l <> nil then
begin
tmp^.prox := l;
tmp^.ant := lista^.prox;
end
else
begin
tmp^.prox := nil;
tmp^.ant := nil;
cont := tmp;
end;
criano := tmp;
end;

procedure pedevalor;
var pontos : integer = 0;
tmp : array[1..5] of integer;
h : integer=1;
p : integer=0;

begin
clrscr;
writeln('Vocˆ escolheu a op‡Æo para adicionar pontua‡Æo.');
writeln;
writeln('Digite a pontua‡Æo do jogador.');
readln(pontos);
if pontos > maior then
begin
maior := pontos;
maiores[h] := maior;
h := h + 1;
if h > 5 then
begin
for p := 1 to 5 do
begin
if p < 5 then
maiores[p] := maiores[p+1]
else
maiores[p] := maior;
end;
h := 5;
end;
end;
lista := criano(lista, pontos);
if lista^.score = pontos then
writeln('Pontua‡Æo adicionada com sucesso.')
else
writeln('Erro interno x195790x. NÆo foi poss¡vel proceder com a opera‡Æo.');
delay(2000);
end;

procedure mostramaiores;
var z : integer=1;
begin
clrscr;
for z := 1 to 5 do
writeln(z,' § Lugar : ',maiores[z]);
delay(1000);
end;

procedure mostrartudo(lista:pno;i : integer);
begin
if lista <> nil then
begin
writeln(i,' § jogador: ',lista^.score);
mostrartudo(lista^.prox,i+1);
delay(1000);
end;
end;

procedure menu;
begin
writeln('Menu principal. Escolha uma das op‡äes a seguir');
writeln('1-Adicionar pontua‡Æo.');
writeln('2-Ver todas as pontua‡äes.');
writeln('3-Ver as 5 maiores pontua‡äes.');
writeln('4-Sair.');
readln(op);
end;

begin
lista := nil;
repeat
clrscr;
menu;
if op = '1' then
pedevalor
else
if op = '2' then
begin
i := 1;
mostrartudo(lista,i);
end
else
if op = '3' then
mostramaiores;
until op = '4';

end.

  • Membro VIP
Postado

Bem, atualizando um pouco

:D , eu consegui realizar um método que faça isso. Compila tudo certo, porém ao executar se eu adicionar valores por exemplo : 5, 10, 15, 20, 25, 30, 35, 40 ele deveria mostrar :

40

35

30

25

20

porém o programa exibe o seguinte:

40

0

0

0

0

gostaria que me ajudassem a resolver este problema orcorrido.

segue o que eu fiz até agora:


uses crt;
type
pno = ^tno;
tno = record
score : integer;
prox, ant : pno;
end;
var
maiores : array[1..5] of integer;
lista: pno;
op : char='0';
cont : pno;
i : integer =1;
j : integer =1;
maior : integer=0;


function criano(l:pno; combo : integer): pno;
var tmp : pno;
begin
new (tmp);
tmp^.score := combo;
if l <> nil then
begin
tmp^.prox := l;
tmp^.ant := lista^.prox;
end
else
begin
tmp^.prox := nil;
tmp^.ant := nil;
cont := tmp;
end;
criano := tmp;
end;

procedure pedevalor;
var pontos : integer = 0;
tmp : array[1..5] of integer;
h : integer=1;
p : integer=0;

begin
clrscr;
writeln('Vocˆ escolheu a op‡Æo para adicionar pontua‡Æo.');
writeln;
writeln('Digite a pontua‡Æo do jogador.');
readln(pontos);
if pontos > maior then
begin
maior := pontos;
maiores[h] := maior;
h := h + 1;
if h > 5 then
begin
for p := 1 to 5 do
begin
if p < 5 then
maiores[p] := maiores[p+1]
else
maiores[p] := maior;
end;
h := 5;
end;
end;
lista := criano(lista, pontos);
if lista^.score = pontos then
writeln('Pontua‡Æo adicionada com sucesso.')
else
writeln('Erro interno x195790x. NÆo foi poss¡vel proceder com a opera‡Æo.');
delay(2000);
end;

procedure mostramaiores;
var z : integer=1;
begin
clrscr;
for z := 1 to 5 do
writeln(z,' § Lugar : ',maiores[z]);
delay(1000);
end;

procedure mostrartudo(lista:pno;i : integer);
begin
if lista <> nil then
begin
writeln(i,' § jogador: ',lista^.score);
mostrartudo(lista^.prox,i+1);
delay(1000);
end;
end;

procedure menu;
begin
writeln('Menu principal. Escolha uma das op‡äes a seguir');
writeln('1-Adicionar pontua‡Æo.');
writeln('2-Ver todas as pontua‡äes.');
writeln('3-Ver as 5 maiores pontua‡äes.');
writeln('4-Sair.');
readln(op);
end;

begin
lista := nil;
repeat
clrscr;
menu;
if op = '1' then
pedevalor
else
if op = '2' then
begin
i := 1;
mostrartudo(lista,i);
end
else
if op = '3' then
mostramaiores;
until op = '4';

end.
program jm007;

Olá,

johnatanlp, sua lógica está mais ou menos certa, mas existe alguns detalhes. Vamos lá:

1) Acesso ao array dos maiores


h :integer=1;
.
.
.
maiores[h]:=maior;
h := h + 1;
var

O valor de h sempre começa com 1, logo o 1º maior sempre vai ser o último valor digitado. Isso implica também que você só terá um valor, já que os outros 4 não estão sendo armazenados.

2) Atualização dos maiores


begin
maior:=pontos;
  if pontos > maior then

Veja que não existe somente 1 valor, mas sim 5. O mais correto é você verificar se é "maior que o menor da lista".

3) Como eu faria

A forma que eu consigo imaginar agora seria utilizando um vetor (via array ou ponteiros) ordenado.

Tem duas formas:

a) Ordenação de arrays

Assim, caso exista um número "maior que o menor" eu jogaria na quinta posição (que não servirá mais, certo?), e depois ordenaria todo o vetor. No final do processo, o novo número está na posição correta. (todos estarão em ordem.)

B) Ordenação de ponteiros

Aqui, quando existir um novo número "maior que o menor", bastaria inserir o número antes do primeiro que seja menor que ele. E descartaria, caso já exista, o 6 número. (Seguindo essa lógica, a sequência sempre ficará ordenada)

Todas as duas formas são viáveis. Mesmo que você encontre outra forma de fazer, tente fazer com essas também... será um ótimo exercício. ^_^

PS: Em nível de lógica cada forma tem suas características. O array é fixo (sempre serão cinto), mas é mais custoso ordenar, já que tem que "empurrar" os menores pro final.

Já com ponteiros, apesar de NÃO usar um tamanho variável (que seria uma das vantagens de usar ponteiros), ela possibilita uma ordenação mais simples, já que basta inserir entre os elementos corretos.

No aguardo.

Abraços

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!