Witam!
Mam tablice dynamiczną, zmienia się jej zawartość. Chcę programowo określić z tej tablicy 4 największe liczby i wyświetlić je np w memo. Jest to tabela jednowymiarowa o długości 60.
Witam!
Mam tablice dynamiczną, zmienia się jej zawartość. Chcę programowo określić z tej tablicy 4 największe liczby i wyświetlić je np w memo. Jest to tabela jednowymiarowa o długości 60.
Szukasz największej, potem szukasz największej z pominięciem pozycji na której znaleziono pierwszą, itd.
var Tablica:array of integer;
Najwieksze:array of integer;
i,j,n:integer;
Skip:boolean;
const Limit = 4;
Ilosc = 60;
begin
randomize();
SetLength(Tablica, Ilosc);
Memo1.Text:='Wszystkie liczby:';
for i:=low(Tablica) to high(Tablica) do
begin
Tablica[i]:=random(1000);
Memo1.Lines.Add(IntToStr(i)+'. '+IntToStr(Tablica[i]));
end;
SetLength(Najwieksze, Limit);
for j:=0 to Limit-1 do
begin
Najwieksze[j]:=-1;
for i:=low(Tablica) to high(Tablica) do
begin
Skip:=FALSE;
for n:=0 to j do
if Najwieksze[n]=i then
begin
Skip:=TRUE;
break;
end;
if (not Skip) and ((Najwieksze[j]=-1) or (Tablica[i]>Tablica[Najwieksze[j]])) then
Najwieksze[j]:=i;
end;
end;
Memo1.Lines.Add('Najwieksze liczby:');
for i:=low(Najwieksze) to high(Najwieksze) do
Memo1.Lines.Add(IntToStr(i)+'. ['+IntToStr(Najwieksze[i])+'] = '+IntToStr(Tablica[Najwieksze[i]]));
end;
To jest dłuższy sposób, ale nie zmienia tablicy. Możesz też zrobić tak:
var Tablica:array of integer;
Max:integer;
i,j,n,k:integer;
const Limit = 4;
Ilosc = 6;
begin
randomize();
SetLength(Tablica, Ilosc);
Memo1.Text:='Wszystkie liczby:';
for i:=low(Tablica) to high(Tablica) do
begin
Tablica[i]:=random(100);
Memo1.Lines.Add(IntToStr(i)+'. '+IntToStr(Tablica[i]));
end;
for j:=0 to Limit-1 do
begin
Max:=0;
k:=high(Tablica)-j;
for i:=1 to k do
if Tablica[i]>Tablica[Max] then
Max:=i;
n:=Tablica[Max];
Tablica[Max]:=Tablica[k];
Tablica[k]:=n;
end;
Memo1.Lines.Add('Najwieksze liczby:');
for i:=high(Tablica) downto high(Tablica)-Limit+1 do
Memo1.Lines.Add(IntToStr(Tablica[i]));
end;
Można szybciej i bez modyfikowania tablicy
const
limit=4;
var
max:array[1..limit+1] of integer;
n:integer;
procedure dodaj(x:integer);
var i,j:integer;
begin
max[n+1]:=x; //wartownik
i:=1;
while max[i]>x do //gdzie wstawić?
i+=1;
if i<=n+1 then begin //jeżeli ma zostać
j:=n+1;
while i<j do begin //przesuwamy resztę
max[j]:=max[j-1];
j:=j-1;
end;
max[i]:=x; //nowy na swoje miejsce
if n<limit then
n:=n+1;
end
end;
(************ demo programik ***************)
var x,i,j:integer;
begin
n:=0; // na początek nic nie mamy
for i:=1 to 20 do begin //ileśtam losowych
x:=random(100); // może być nawet mniej niż LIMIT
dodaj(x); //dodajemy do listy max
write(x:4);
for j:=1 to n do write(max[j]:8);
writeln;
end;
//a teraz wypiszemy co nam zostało
for j:=1 to n do write(max[j]:8);
end.
A czy kopczyk nie byłby tu optymalny?</delphi>
Ja bym posortował tą tablicę i wyciągnął z niej 4 pierwsze elementy, jeśli na indeksie 0 była by największa wartość. Kodu mi się niespecjalnie chce pisać :)