EyeLook Posted March 10, 2015 at 07:44 PM Report Share #579096 Posted March 10, 2015 at 07:44 PM (edited) 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 March 10, 2015 at 09:40 PM by nunopicado Adicionada linguagem GeShi Link to comment Share on other sites More sharing options...
nunopicado Posted March 10, 2015 at 09:39 PM Report Share #579106 Posted March 10, 2015 at 09:39 PM 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; 😉 1 Report "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 More sharing options...
thoga31 Posted March 11, 2015 at 12:27 AM Report Share #579114 Posted March 11, 2015 at 12:27 AM (edited) 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 March 11, 2015 at 12:28 AM by thoga31 2 Report Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted March 11, 2015 at 12:30 AM Report Share #579115 Posted March 11, 2015 at 12:30 AM 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 More sharing options...
EyeLook Posted March 11, 2015 at 12:24 PM Author Report Share #579144 Posted March 11, 2015 at 12:24 PM (edited) 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 March 11, 2015 at 09:07 PM by nunopicado GeShi Link to comment Share on other sites More sharing options...
nunopicado Posted March 11, 2015 at 07:28 PM Report Share #579172 Posted March 11, 2015 at 07:28 PM 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 More sharing options...
EyeLook Posted March 11, 2015 at 09:00 PM Author Report Share #579178 Posted March 11, 2015 at 09:00 PM (edited) 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 March 11, 2015 at 09:06 PM by nunopicado GeShi Link to comment Share on other sites More sharing options...
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