wybieranie min i max z ciagu n-elementów

0

Mam zadanie:
Program w Turbo Pascalu ma wyszukać z podanego ciągu n-elementów liczbowych element najmniejszy i największy. Podkreślam, że tylko liczbowych elementów.
Męczymy się z kumplem i doszliśmy jedynie do programu, w którym wprowadza się 5 elementów, a komp zajmuje się wybieraniem. Proszę o pomoc, bo TP nie widziałem od roku.
A tak wygląda nasze "dzieło":

program minmax;
uses crt;
var A:array[1..5] of real;
licznik:integer;
min:real;
max:real;

begin
clrscr;
writeln('podaj 5 dowolnych liczb, a ja wybiorę najmniejszą i największą');
for licznik:= 1 to 5 do {pętla odczytuje wprowadzone liczby}
readln(a[licznik]); {zapamiętuje je pod kolejnymi}
licznik:=1; {indeksami 1,2,3,4,5}
min:=A[licznik]; {zakładam, że najmniejsza to 1 liczba}
repeat
inc(licznik); {zwiększenie zmiennej licznik o 1}
if min>a[licznik] then
min:=A[licznik] {porównanie dwóch liczb}
else
min:=min;
until
licznik=5; {warunek zakończenia pętli}
writeln('najmniejsza z podanych liczb to:',min2);
licznik:=1;
max:=A[licznik];
repeat
inc(licznik);

if max

0

Chyba najprosciej tak:

Var Tablica: array[1..n] of integer;
indexmin,indexmax,max,min:integer;
Begin
for i:=1 to n do
begin
if tablica[i]>max then
begin
max:=tablica[i];
indexmax:=i;
end;

if tablica[i]

0

Masz tutaj gotowy program:

[code]
program MinMax;
{$APPTYPE CONSOLE} // jeśli używasz TP usuń tą linię !!!

const
Range = 1023;

var
A: array[0..Range] of real;
i, n: integer; { i - licznik; n - dlugość ciągu }
Min, Max :real;

begin
Writeln('Program wyszukujacy wartosc najmniejsza i najwieksza w podanym ciagu liczb');
Writeln('rzeczywistych. Liczba elementow ciagu musi byc mniejsza od ', Range + 2, ' !');
Writeln;
Write('Podaj liczbe elementow ciagu: ');
Readln(n);

{--
Sprawdzanie, czy nie przekroczono zakresu.
--}
if n > Range + 1 then
begin
Writeln('Liczba elementow ciagu musi byc mniejsza od ', Range + 2);
Readln;
Exit;
end;

{--
Odczyt kolejnych elementów ciągu do tablicy A.
--}
for i := 0 to n - 1 do
begin
Write('Podaj wartosc A[', i + 1, ']: ');
Readln(a[i]);
end;

{--
Szukanie wartości najmniejszej i największej.
--}
Min := A[0];
Max := A[0];

for i := 0 to n - 1 do
begin
if A[i] > Max then Max := A[i];
if A[i] < Min then Min := A[i];
end;

Writeln('Najmniejsza z podanych liczb to:', Min: 5: 2);
Writeln('Najwieksza z podanych liczb to:', Max: 5: 2);

Write('Press ENTER...');
Readln;
end.
[/code]

Skopiuj i wklej. Powinno działać.

0

Ale się kodów posypało :)
I nic dziwnego. Wyszukiwanie elementu największego oraz najmniejszego to jeden z częściej stosowanych algorytmów.
Ja tutaj kodu pisać nie zamierzam, ale na temat efektywnego wyszukiwania odsyłam do "Sztuki programowania" Knutha. Wiele ciekawych algorytmów.
A tutaj napiszę tylko bardzo banalny sposób, ale bardziej efektywny niż typowe przeszukiwanie po kolei min i max.
Mamy tablicę n elementów (załóżmy dla wygody, że n jest parzyste).
W pierwszym przejściu pętli porównujemy dwa sąsiednie wartości na parzystym i nieparzystym miejscu. Mniejszą z nich wrzucamy na miejsce nieparzyste, a większą na parzyste.
W ten sposób po jednym przejściu pętli i po n/2 porównaniach mamy już pewność, że min jest w nieparzystych częściach, a max w parzystych. Teraz wystarczy prównywać aktualne minimum (według takiej metody jak tu były podane) z nieparzystymi komórkami, a maksimum z parzystymi. Takich porównań jest łącznie n (n/2 dla max i n/2 dla min).
Tym oto sposobem mamy n/2+n=3n/2 porównań. Gdybyśmy mieli sprawdzać standardowym sposobem to musimy n porównań dla min i n dla max zrobić, czyli łącznie 2n. Wzrost niewielki, ale przy praktycznie zerowej komplikacji programu mamy całkiem spore przyspieszenie. Wada: przestawiamy elementy w tablicy.
A efektywniejsze algorytmy we wspomnianej książce szukajcie.

Hmm. Miałem tylko małą uwagę dodać... :)

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