Wytypowanie z tablicy 4 największych liczb

Odpowiedz Nowy wątek
2007-01-04 22:53
ENDIK
0

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.

Pozostało 580 znaków

2007-01-04 23:35
0

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;

<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2007-01-05 01:42
0

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>

Pozostało 580 znaków

2007-01-05 14:52
0

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ć :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0