[ goranrst @ 12.12.2019. 09:51 ] @
Zadatak glasi (PASKAL):
Učitati niz X od n članova i naći tri najmanja člana niza.

Ja naravno znam naći najmanji član niza (kao i najveći član niza), ali za ispis tri najmanja člana nemam ideju, sve sam probao.... Molim za pomoć. Hvala.

Primer za namnaji član niza:

Code:
program Najmanji_Clan;
var
i,n,min:integer;
x:array [1..100] of integer;
begin
writeln('Unesi broj n clanova niza ');
read(n);
for i:= 1 to n do 
begin
write('X[',i,']='); 
readln(x[i]); 
end;
min := x[i];
for i:= 1 to n do
if x[i] < min then
min := x[i];
WRITELN('NAJMANJI CLAN NIZA JE ',min);
end.

[ Predrag Supurovic @ 12.12.2019. 11:02 ] @
Prvo što mi pada na pamet je da uvedeš tri promenjlive za minimalne članove niza (ili bolje niz umesto jedne promenljive), pa kad nađeš novi najmanji, prethodne sve šiftuješ za jedno mesto.
[ savkic @ 12.12.2019. 12:01 ] @
Mislim da ti je najlakse da:
1) uneses sve clanove
2) sortiras po velicini od najmanjeg ka najvecem
3) ispises prva tri (ujedno i najmanja) clana
[ stameni @ 12.12.2019. 12:23 ] @
^ Ovo je "školsko" rešenje; i meni je palo na pamet. Mana mu je što "kvari" niz, ali se svakako uklapa u specifikaciju ;)
[ Branimir Maksimovic @ 12.12.2019. 12:31 ] @
Ides bubble sort prva tri prolaza i kraj.
[ goranrst @ 12.12.2019. 14:23 ] @
Uradio sam kako je član savkic rekao i to je to radi posao. Hvala svima na savetima. Hvala savkic.

Code:
PROGRAM Ispis_Tri_najmanja_clana_niza;
USES Crt;
VAR
n, i, j, z : INTEGER;
a : ARRAY [1..100] OF INTEGER;
BEGIN
ClrScr;
WRITELN ('Clanovi niza su: ');
READLN(n);
FOR i := 1 TO n DO  
BEGIN
WRITE('a[',i,']= ');
READLN(a[i]);
END;
FOR i := 1 TO n - 1 DO
FOR j := i + 1 TO n DO
IF a[j] < a[i] THEN     
BEGIN
z := a[i];              
a[i] := a[j];
a[j] := z;              
END;
WRITELN('Tri najmanja clana niza su: ');
FOR i := 1 TO 3 DO  
WRITELN('a[',i,'] = ', a[i]);
ReadKey;
END.
[ Branimir Maksimovic @ 12.12.2019. 14:30 ] @
Ne vidim potrebu da sortiras ceo niz...
[ Predrag Supurovic @ 12.12.2019. 23:32 ] @
Citat:
savkic:
Mislim da ti je najlakse da:
1) uneses sve clanove
2) sortiras po velicini od najmanjeg ka najvecem
3) ispises prva tri (ujedno i najmanja) clana


Ovo nije ni blizu optimalnog rešenja.
[ savkic @ 12.12.2019. 23:53 ] @
I ne trazi se optimalno resenje za domaci zadatak, koga zanima optimizacija ide na dodatnu nastavu. Poenta je da svaki djak postupak moze razumeti.
[ Milan Milosevic @ 13.12.2019. 06:15 ] @
Ja bih uzeo prva tri člana niza i sortirao ih po veličini.
Onda for petlja od četvrtog do poslednjeg i za svaki taj element bi prošao kroz niz od 3 člana, ako je manji od prvog onda njega stavljam na prvo mesto, a ostale pomeram za po jedno mesto.
Ovo može i kroz potprogram da se uradi, a i ne mora.

Ne verujem da su oni radili algoritam za brzo sortiranje, ako jesu onda ono što je predložio Savkić
[ Branimir Maksimovic @ 13.12.2019. 08:05 ] @
Stvar je sto je OP uradio kako treba samo ne treba da ide do n-1 nego do 2 tj index da ide od 0-2 i to je sve. Da li ces sad da ides ovako kako si naveo ili onako
isto je sto se tice broja koraka.
[ Predrag Supurovic @ 13.12.2019. 08:21 ] @
Citat:
savkic:
I ne trazi se optimalno resenje za domaci zadatak, koga zanima optimizacija ide na dodatnu nastavu. Poenta je da svaki djak postupak moze razumeti.


Al ne mora baš da se uči najgore moguće rešenje.

Iz samog zadatka je jasno da se traži razmišljanje. Sortiranje niza pa uzimanje prva tri je najočiglednije rešenje i očigledno najmanje poželjno rešenje. Sortiranje su sigurno radili kroz druge zadatke. pa im ovaj nije potreban da bi to učili.

Doduše ako je samo cilj da se dobije ocena, onda sve može.


[ Milan Milosevic @ 13.12.2019. 08:55 ] @
Moja varijanta sa Delphi codom.


Code:


uses
  System.SysUtils, math;
  Var I,J,K:Integer;
  A:ARRAY [1..100] of integer;
  RESENJE :ARRAY [1..3] of integer;
  IZLAZ:BOOLEAN;
begin
   WRITELN ('Clanovi niza su: ');
  FOR i := 1 TO 100 DO
  BEGIN
    A[I]:=  RandomRange(1,200);
    WRITE(' a[',i,']= '); WRITELN(A[I])
  END;
   RESENJE[1]:= A[1];
   RESENJE[2]:= A[2];
   RESENJE[3]:= A[3];
   for I := 4 to 100 do
     BEGIN
        IZLAZ:=False;
        for J := 1 to 3 do
          BEGIN
             if (A[I]<RESENJE[J]) AND (NOT IZLAZ) then
             BEGIN
                for K := 3 downto J+1 do RESENJE[K]:= RESENJE[K-1];
                RESENJE[J]:= A[I] ;
                IZLAZ:=True;
             END;
          END;
     END;
    WRITELN ('Resenje je: ');
    FOR i := 1 TO 3 DO
    BEGIN
        WRITE(' R[',i,']= '); WRITELN(RESENJE[I])
    END;

   ReadLn; //don't close the window, wait for [Enter]
end.


[ savkic @ 13.12.2019. 09:24 ] @
> Al ne mora baš da se uči najgore moguće rešenje.
> Iz samog zadatka je jasno da se traži razmišljanje. Sortiranje niza pa uzimanje prva tri je najočiglednije rešenje
> i očigledno najmanje poželjno rešenje. Sortiranje su sigurno radili kroz druge zadatke. pa im ovaj nije potreban da bi to učili.
> Doduše ako je samo cilj da se dobije ocena, onda sve može.

Ocigledno mozda programeru, 90% djaka ce imati i poteskoce sa sortiranjem, resenje je primereno uzrastu i znanju. Drugo, po meni je mnogo bolje za ucenje da kod bude jednostavan i lak za pracenje, ko zeli vise ima dodatnu nastavu i samostalan rad.
[ tkaranovic @ 13.12.2019. 09:45 ] @
Ovo vise nije hitno... :)

Posto nemam pojma sta je deci potrbno evo mog ucesca u kodu :) kao sto se vidi koristio sam gore postovan kod :)


Code (delphi):

Var
  I,J,K:Integer;
  A:ARRAY [1..100] of integer;
begin
   WRITELN ('Clanovi niza su: ');
  randomize; // ovo je obavezno
  FOR i := 1 TO 100 DO
  BEGIN
    A[I]:=  RandomRange(1,200);
    WRITE(' a[',i,']= '); WRITELN(A[I])
  END;
   for K := 1 to 3 do
     for I := K+1 to 100 do
       if A[K] > A[I] then
       BEGIN
         J := A[K];
         A[K] := A[I];
         A[I] := J;
       END;
    WRITELN ('Resenje je: ');
    FOR i := 1 TO 3 DO
    BEGIN
        WRITE(' R[',i,']= '); WRITELN(A[I])
    END;