Jump to content

[Resolvido] BubbleSort ;)


EyeLook
 Share

Recommended Posts

Olá tenho uma dúvida em aplicar o BubbleSort que é nada mais nada menos, do que "um algoritmo de ordenação simples" - NunoPicado - 2012

O exercício é o seguinte

Desenvolva um programa que permita guardar o registo de uma maratona para o máximo de 30 atletas. O programa solicitar a introdução do número de registos (atletas) a efetuar e preencher os seguintes campos: nome, nacionalidade, clube e tempo. O programa deve mostrar os resultados ordenados pelo “tempo”.

Até agora tenho isto, só que dá erro na ordenação:

Program PTAProgramar;
uses crt;
Type
maratona = record
nome,nacionalidade: string;
clube: string;
tempo: integer;
end;
var
i:integer;
atletas: array [1..30] of maratona;
atleta: maratona;
resp,ord,n: integer;

begin
clrscr;
write ('Quantos atletas? '); readln (resp);
writeln;

for i:=1 to resp do
begin
    writeln (i,' Atleta');
    write ('Nome: '); readln (atleta.nome);
    write ('Nacionalidade: '); readln (atleta.nacionalidade);
    write ('Clube: '); readln (atleta.clube);
    write ('Tempo: '); readln (atleta.tempo);
    atletas[i]:=atleta;
end;

for i:=1 to resp do
begin
    for n:= i+1 to resp do
    begin
        if (tempo[i] > tempo[n]) then
        begin
            ord:=tempo[i];
            tempo[i]:=tempo[n];
            tempo[n]:=ord;
        end;
    end;
end;

for i:=1 to resp do
begin
    writeln (i,' Atleta');
    write ('Nome: ',atleta[i].nome);
    write ('Nacionalidade: ',atleta[i].nacionalidade);
    write ('Clube: ',atleta[i].clube);
    write ('Tempo: ',atleta[i].tempo);
end;    
readln;
end.

Atenção que em termos de matéria só cheguei aos registros. 😉

Edited by nunopicado
Adicionada linguagem GeShi
Link to comment
Share on other sites

Ena, já sou famoso! 😁

Olá EyeLook.

O problema que tens é no uso das variáveis:

for i:=1 to resp do
begin
  for n:= i+1 to resp do
      begin
         if (tempo[i] > tempo[n]) then  //  <---- Estás a usar tempo[i], mas tempo não é um array, é um campo de um registo.
            begin                       //        Por isso é que te dá erro!
               ord:=tempo[i];
               tempo[i]:=tempo[n];
               tempo[n]:=ord;
           end;
     end;
end;

Tens de usar o nome completo da variável:

for i:=1 to resp - 1 do  // Já agora, a forma correcta é que o ciclo exterior termine na penúltima posição, e não na última, daí o -1
begin
  for n:= i+1 to resp do
      begin
         if (atletas[i].tempo > atletas[n].tempo) then  //  <---- Usa o nome completo da variável (nome array + índice array + . + campo)
            begin 
               ord              := atletas[i].tempo;
               atletas[i].tempo := atletas[n].tempo;
               atletas[n].tempo := ord;
           end;
     end;
end;

😉

  • Vote 1

"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.

Link to comment
Share on other sites

Tens de usar o nome completo da variável:

for i:=1 to resp - 1 do  // Já agora, a forma correcta é que o ciclo exterior termine na penúltima posição, e não na última, daí o -1
begin
  for n:= i+1 to resp do
      begin
         if (atletas[i].tempo > atletas[n].tempo) then  //  <---- Usa o nome completo da variável (nome array + índice array + . + campo)
            begin 
               ord              := atletas[i].tempo;
               atletas[i].tempo := atletas[n].tempo;
               atletas[n].tempo := ord;
           end;
     end;
end;

Faço notar que este pedaço de código vai fazer uma coisa errada 😉

Estamos a trocar apenas os tempos e não os dados completos dos atletas. Portanto, se eu fizer a corrida num minuto e o Nuno em cinquenta segundos, no final desse código eu terei os 50 segundos e o Nuno o meu minuto.

Temos de trocar os registos e não apenas os tempos - o tempo é o critério, não o objecto de troca.

var temp : maratona;  // Não uses "ord" - é o identificador de uma função que já existe.

// ...

for i:=1 to resp - 1 do
  for n:= i+1 to resp do
  begin
     if (atletas[i].tempo > atletas[n].tempo) then
     begin 
        temp       := atletas[i];
        atletas[i] := atletas[n];
        atletas[n] := temp;
     end;
  end;
end;

Ena, já sou famoso! 😁

Dás-me um autógrafo? É apenas para fins bancários 😄

Edited by thoga31
  • Vote 2

Knowledge is free!

Link to comment
Share on other sites

lol

A ver a cena dos campos nem me lembrei desse 'detalhe'.

Obviamente, é preciso corrigir todo o registo, e não apenas o campo de tempo.

Thoga: Se não te importares, deixa-se o autógrafo para depois! 😛

"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.

Link to comment
Share on other sites

for i:=1 to resp - 1 do
for n:= i+1 to resp do
begin
if (atletas[i].tempo > atletas[n].tempo) then
begin
temp := atletas[i];
atletas[i] := atletas[n];
atletas[n] := temp;
end;
end;

Dá erro de incompatibilidade. O do nunopicado funcionava só que agora a mostrar tenho algo mal...

obg pela dica do ord 😉 thoga

writeln (i,' Atleta');
write ('Nome: ',atleta[i].nome);
write ('Nacionalidade: ',atleta[i].nacionalidade);
write ('Clube: ',atleta[i].clube);
write ('Tempo: ',atleta[i].tempo); 
Edited by nunopicado
GeShi
Link to comment
Share on other sites

Não percebi o teu último post!

Qual é que dá erro de incompatibilidade?

O do Thoga está correcto.

Meteste a variável temp do tipo Maratona?

"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.

Link to comment
Share on other sites

Olá Nuno! O problema era mesmo esse. Voltei a por a correção do thoga e pus a variável temp associada à maratona e funcionou!

Só um aparte. O código do thoga tinha um end a mais, mas nada de mais.

Tive de mudar o for para mostrar por ordem. Devia estar burro pois estava a utilizar a varíavel atleta em vez de atletas para mostrar (se virem o código faz sentido o que digo).

Segue-se o código completo para quem quiser!

Program PTAProgramar;
uses crt;

Type
maratona = record
nome,nacionalidade: string;
clube: string;
tempo: integer;
end;
var
i:integer;
atletas: array [1..30] of maratona;
atleta: maratona;
resp,n: integer;
temp: maratona;

begin
clrscr;
write ('Quantos atletas? '); readln (resp);
writeln;
writeln;

for i:=1 to resp do
begin
writeln (i,' Atleta');
write ('Nome: '); readln (atleta.nome);
write ('Nacionalidade: '); readln (atleta.nacionalidade);
write ('Clube: '); readln (atleta.clube);
write ('Tempo: '); readln (atleta.tempo);
atletas[i]:=atleta;
writeln;
end;

for i:=1 to resp - 1 do
for n:= i+1 to resp do
begin
if (atletas[i].tempo > atletas[n].tempo) then
begin
temp:= atletas[i];
atletas[i] := atletas[n];
atletas[n] := temp;
end;
end;

clrscr;

for i:=1 to resp do
begin
writeln (i,' Atleta');
writeln ('Nome: ',atletas[i].nome);
writeln ('Nacionalidade: ',atletas[i].nacionalidade);
writeln ('Clube: ',atletas[i].clube);
writeln ('Tempo: ',atletas[i].tempo);
writeln;
end;
readln;
end.

Muito obrigado pela ajuda. Irei dar like nos vossos tpcs/tópicos/posts

Edited by nunopicado
GeShi
Link to comment
Share on other sites

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
 Share

×
×
  • 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.