Stranica 1 od 1

[Pascal] Okreni niz

PostPoslato: Ponedeljak, 12. Januar 2015, 16:43
od Miladin Jovic
Ovo je bilo traženo u okvru procedure na današnjem kolokvijumu. To sam zapamtio, ceo zadatak nisam.
Definisati proceduru Okreniniz (mi to možemo raditi kao ceo program) koja za [inlmath]n_1,n_2\quad(n_1,n_2<n)[/inlmath] okreće podniz između [inlmath]n_1[/inlmath] i [inlmath]n_2[/inlmath] i to uraditi bez formiranja novog niza (primer [inlmath]1\quad 2\quad 3\quad 4\quad 5[/inlmath], ako su [inlmath]n_1=2[/inlmath] i [inlmath]n_2=4[/inlmath] kao rezultat se dobija [inlmath]1\quad 4\quad 3\quad 2\quad 5[/inlmath]).
Ja kao prvo, nisam razumeo šta zapravo ova procedure treba da radi, jer su rekli da je ovaj primer koji su naveli specijalan slučaj, i da cilj procedure nije zamena mesta [inlmath]n_1[/inlmath] i [inlmath]n_2[/inlmath]. Pa sam onda ovako tu proceduru interpretirao ovako: Ako okrećemo podniz niza [inlmath]1\quad 2\quad 3\quad 4\quad 5[/inlmath] između [inlmath]1[/inlmath] i [inlmath]4[/inlmath], ja sam prvo uradio zamenu mesta [inlmath]1[/inlmath] i [inlmath]4[/inlmath], a potom sam podniz [inlmath]2\quad 3[/inlmath] gledao kako bih pročitao sa desna na levu stranu , a to bi bilo [inlmath]3\quad 2[/inlmath], pa kao krajnji ishod imamo [inlmath]4\quad 3\quad 2\quad 1\quad 5[/inlmath]. Znam da ovo tumačenje nije dobro, ali kako bi bilo ispravno tumačenje, jer je, barem po mom mišljenu, ovaj zadatak nerazumno sastavljen, a i pri tom je naveden specijalni slučaj( tj. kada između [inlmath]n_1[/inlmath] i [inlmath]n_2[/inlmath] imamo samo jedan element) iz kog, barem ja, ne mogu da uočim pravilnost okretanja niza.
Evo kod za moje tumačenje:

Kôd: Obeleži sve
program Okreniniz;
  type niz=array[1..50] of integer;
  var a:niz;
    i,n,n1,n2,t,p,q:integer;
  begin
    write('Unesite n:');
    readln(n);
    write('Unesite n1:');
    readln(n1);
    write('Unesite n2:');
    readln(n2);
    For i:=1 to n do readln(a[i]);
    p:=n1;
    q:=n2;
    For i:=1 to n div 2 do
      begin
        t:=a[p];
        a[p]:=a[q];
        a[q]:=t;
        p:=p+1;
        q:=q-1;
      end;
    For i:=1 to n do write(a[i],' ');
  end.

Re: [Pascal] Okreni niz

PostPoslato: Ponedeljak, 12. Januar 2015, 20:58
od ubavic
Koliko ja vidim tvoj način tumačenja je dobar. Ovako bi ta procedura trebalo da radi (ako se niz "okreće" između članova [inlmath]n_a[/inlmath] i [inlmath]n_b[/inlmath]):
[dispmath]\begin{array}{|c|ccccccccccccc|}\hline
\mathrm{niz} & \cdots & n_{a-2} & n_{a-1} & n_a & n_{a+1} & n_{a+2} & \cdots & n_{b-2} & n_{b-1} & n_b & n_{b+1} & n_{b+2} & \cdots\\ \hline
f(\mathrm{niz}) & \cdots & n_{a-2} & n_{a-1} & n_b & n_{b-1} & n_{b-2} & \cdots & n_{a+2} & n_{a+1} & n_a & n_{b+1} & n_{b+2} & \cdots \\ \hline
\end{array}[/dispmath]

Pošto ne znam Pascal, nisam baš siguran da li petlja dobro funkcioniše.

Re: [Pascal] Okreni niz

PostPoslato: Ponedeljak, 12. Januar 2015, 21:51
od Miladin Jovic
Ja kad unesem, recimo, u program sa ovim kodom [inlmath]1\quad 2\quad 3\quad 4\quad 5[/inlmath], ako radimo između [inlmath]1[/inlmath] i [inlmath]4[/inlmath], dobijam [inlmath]4\quad 3\quad 2\quad 1\quad 5[/inlmath]. Je li to dobro?

Re: [Pascal] Okreni niz

PostPoslato: Ponedeljak, 12. Januar 2015, 22:07
od ubavic
Dobro je. Mada to ti ne garntuje da je i kod dobar.
Sad kad malo bolje pogledam kod čini mi se da je OK.

Re: [Pascal] Okreni niz

PostPoslato: Ponedeljak, 12. Januar 2015, 22:12
od Miladin Jovic
Verovatno ima neku grešku, kad su mi pregledali kod rekli su mi da ovo nije tačno.

Re: [Pascal] Okreni niz

PostPoslato: Utorak, 13. Januar 2015, 01:25
od Daniel
Ovaj zadatak baš i nije za ovaj forum, budući da se u njemu ne pojavljuje ništa od matematike, već samo programiranje kao takvo. Ali, budući da se još uvek nešto sećam Paskala, valjda ću moći da pomognem.

Da, kôd ima grešku. Pogrešno je to što se kroz petlju prolazi [inlmath]\left(n\:\mathrm{div}\:2\right)[/inlmath] puta. Broj prolazaka kroz petlju treba da bude [inlmath]\frac{n2-n1}{2}[/inlmath] ako je [inlmath]n2-n1[/inlmath] parno, odnosno [inlmath]\frac{n2-n1+1}{2}[/inlmath] ako je [inlmath]n2-n1[/inlmath] neparno. Objedinjeno, to znači da se kroz petlju prolazi [inlmath]\left(n2-n1+1\right)\:\mathrm{div}\:2[/inlmath] puta.

Promenljive [inlmath]p[/inlmath] i [inlmath]q[/inlmath] su suvišne. Sve operacije koje si primenjivao na [inlmath]p[/inlmath] i [inlmath]q[/inlmath], mogao si primenjivati i direktno na [inlmath]n1[/inlmath] i [inlmath]n2[/inlmath].

Ja bih takođe dodao i [inlmath]\mathtt{IF-THEN}[/inlmath] uslov kojim se vrši provera da li je [inlmath]n1<n2[/inlmath] i da li je [inlmath]n2\le n[/inlmath], kako ne bi došlo do nekih nepredviđenih događaja. :)

Dakle, moj predlog za kôd bi izgledao ovako:

Kôd: Obeleži sve
program Okreniniz;
  type niz=array[1..50] of integer;
  var a:niz;
    i,n,n1,n2,t:integer;
  begin
    write('Unesite n:');
    readln(n);
    write('Unesite n1:');
    readln(n1);
    write('Unesite n2:');
    readln(n2);
      if (n1<n2) and (n2<=n) then
        begin
          For i:=1 to n do readln(a[i]);
          For i:=1 to (n2-n1+1) div 2 do
            begin
              t:=a[n1];
              a[n1]:=a[n2];
              a[n2]:=t;
              n1:=n1+1;
              n2:=n2-1;
            end;
          For i:=1 to n do write(a[i],' ');
        end
      else
        writeln('Neispravan unos');
  end.

Re: [Pascal] Okreni niz

PostPoslato: Utorak, 13. Januar 2015, 07:02
od Miladin Jovic
Da, tako je , i ja sam to posle video. Hvala na odgovoru.