PASCAL - Zadaci, resenja, problemi, izazovi...

Nemanja izvini što te gnjavim,ali kad stavim QWord on mi izbaci da kao ne prepoznaje to?!
Koristim Turbo Pascal,Virtual Pascal.

A kod Free Pascal mi ispiše rezultate i dodje do overflowa.

Ako si slobodan molim te napiši kod.

Inače,evo koda za spiralni obilazak matrice.Baš je bilo lagano.:D

Fazon je bio da se uvećava red/kolona sve dok uslov to može da prihvati.

Vjerovatno će neko sigurno bolje uraditi od mene ovaj zadatak,ali eto,evo koda ako kome treba.
Kod:
program spirala;
 type
 matrica=array [1..20,1..20] of integer;
  var
  i,j,uvecaj,dim:integer;
  M:matrica;
   begin
   writeln ('Dimenzija?');
    readln (dim);
    i:=1;
    j:=1;
    uvecaj:=0;
     repeat
      begin
       repeat
        uvecaj:=uvecaj+1;
         if uvecaj<=dim*dim then M[i,j]:=uvecaj;
         j:=j+1;
         until i+j>dim;
         repeat
         uvecaj:=uvecaj+1;
         if uvecaj<=dim*dim then M[i,j]:=uvecaj;
         i:=i+1;
         until i>=j;
          repeat
          uvecaj:=uvecaj+1;
           if uvecaj<=dim*dim then M[i,j]:=uvecaj;
            j:=j-1;
             until i+j<=dim+1;
             repeat
             uvecaj:=uvecaj+1;
             if uvecaj<=dim*dim then M[i,j]:=uvecaj;
             i:=i-1;
             until i<=j+1;
             end;
             until uvecaj>=dim*dim;
              for i:=1 to dim do
               begin
                for j:=1 to dim do
                 write (M[i,j]:5);
                 writeln;
                 end;
                 readln;
                 end.

P.S
Mile brate svaka ti čast,ali ja ništa ne razumijem od onoga š'o si mi poslao na PP. :D
 
Ovo radi kod mene u free pascalu. U turbo pascalu nema ovog tipa podataka, kao ni int64 koji je u intervali -2^63 do 2^63.

Kod:
var
   a:array[1..64] of qword;
   s:qword;
   i:integer;

begin
   a[1]:=1;
   s:=1;
   writeln(a[1]);
   for i:=2 to 64 do
      begin
         a[i]:=a[i-1]*2;
         s:=s+a[i];
         writeln(a[i]);
      end;
   writeln(s);
end.

Ako ti treba sa nizovima sve lepo, mogu i to da otkucam, reci samo.
 
I ima jedan zadatak,kaže obilazak matrice spiralno?
To je valjda ovo:
Kod:
1 2 3 
8 9 4
7 6 5

Taj ne znam ni da započnem,ali nagađam da trebaju možda 4 petlje?
Najjednostavnije je kada znaš koje su maksimalne dimenzije matrice.

Recimo da je pravougaona m * n, 1 <= m, n <= 100.

U pitanju je ovo - gledaš u kom se smeru krećeš. Kada naiđeš na ivicu matrice ili na "ćorsokak" (već obiđeno polje u matrici), menjaš smer. Popunjavanje matrice je gotovo onda kada se obiđe m * n polja. Drugim rečima, simuliraš sve što se zbiva.

Recimo da je 0 - desno, 1 - dole, 2 - levo, 3 - gore.

Najnezgodnija stvar je formatiranje matrice. Recimo da možemo da stavimo sve brojeve sa jednim razmakom. Tada će izlaz izgledati ružno (ali, moraš time da se zadovoljiš):
Kod:
4 4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8  7

Kod je u spoiler-u:
Kod:
(* Testirano! *)

program spiralno;

var
  m, n, smer, x, y, px, py : smallint;
  red : longint;
  gotov, psm : boolean;               // psm - promenjen smer
  obidjen : array [1 .. 100, 1 .. 100] of boolean;
  polje   : array [1 .. 100, 1 .. 100] of integer;

begin
  readln (m, n);           // dimenzije matrice
  smer := 0;
  x := 1; y := 1; px := 1; py := 1;
  obidjen [1, 1] := true; polje [1, 1] := 1;
  red := 1;
  while red < m * n do
    begin
      px := x; py := y;   // pamtimo koordinate na početku "poteza" ("prelaska")
      case smer of
          0 : x := x + 1;
          1 : y := y + 1;     // kretanje u zavisnosti
          2 : x := x - 1;     // od smera
          3 : y := y - 1;
        end;
      red := red + 1;
      if (x = 0) or (y = 0) or (x = m + 1) or (y = n + 1) or (obidjen [x, y]) then
        begin   // uslov - ćorsokak ili van matrice
          x := px; y := py; red := red - 1; smer := smer + 1;
          if smer = 4 then smer := 0;
        end;
      polje [x, y] := red;
      obidjen [x, y] := true;
    end;
  for y := 1 to n do
    begin
      for x := 1 to m do
        write (polje [x, y], ' ');
      writeln ();
    end;
end.
Isti ovaj zadatak bio je na Srpskoj informatičkoj olimpijadi za osnovce 2007. godine.
Zvanično rešenje je ovde: http://www.dms.org.rs/competitions/informatics/elementary_school/2007/resenja_izborno_2007.zip.
Zadatak je ovde: http://www.dms.org.rs/competitions/informatics/elementary_school/2007/zadaci_izborno_2007.zip.

Izmena

Kod:
var
   a:array[1..64] of qword;
   s:qword;
   i:integer;

begin
   a[1]:=1;
   s:=1;
   writeln(a[1]);
   for i:=2 to 64 do
      begin
         a[i]:=a[i-1]*2;
         s:=s+a[i];
         writeln(a[i]);
      end;
   writeln(s);
end.
OK kod, mada se može malo sačuvati na memoriji - skoro nekih 64 puta. :)
Šta će ti niz?
Drugo, šta će ti promenljiva za sumu? Imaš geometrijsku progresiju dvojke. 2[SUP]0[/SUP] + 2[SUP]1[/SUP] + 2[SUP]2[/SUP] + ... + 2[SUP]63[/SUP] = (2[SUP]64[/SUP] - 1) / (2 - 1) = 2[SUP]64[/SUP] - 1. Dakle, treba ti jedna promenljiva tipa qword čija uloga je upravo samo da u sebi ima neki stepen dvojke.
Kod:
var
  a : qword;
  i : smallint;

begin
  a := 1;
  for i := 1 to 64 do
    begin
      writeln ('Na ', i, '. polju ima ', a, ' zrna.'); // ili samo writeln (a);
      if (i = 64) then a := 2 * (a - 1) + 1        // izbegavamo prekoračenje
                  else a := 2 * a;
    end;
  writeln ('Ukupno ima ', a, ' zrna psenice.');
end.
Kod:
Na 1. polju ima 1 zrna.
Na 2. polju ima 2 zrna.
Na 3. polju ima 4 zrna.
Na 4. polju ima 8 zrna.
Na 5. polju ima 16 zrna.
Na 6. polju ima 32 zrna.
Na 7. polju ima 64 zrna.
Na 8. polju ima 128 zrna.
Na 9. polju ima 256 zrna.
Na 10. polju ima 512 zrna.
Na 11. polju ima 1024 zrna.
Na 12. polju ima 2048 zrna.
Na 13. polju ima 4096 zrna.
Na 14. polju ima 8192 zrna.
Na 15. polju ima 16384 zrna.
Na 16. polju ima 32768 zrna.
Na 17. polju ima 65536 zrna.
Na 18. polju ima 131072 zrna.
Na 19. polju ima 262144 zrna.
Na 20. polju ima 524288 zrna.
Na 21. polju ima 1048576 zrna.
Na 22. polju ima 2097152 zrna.
Na 23. polju ima 4194304 zrna.
Na 24. polju ima 8388608 zrna.
Na 25. polju ima 16777216 zrna.
Na 26. polju ima 33554432 zrna.
Na 27. polju ima 67108864 zrna.
Na 28. polju ima 134217728 zrna.
Na 29. polju ima 268435456 zrna.
Na 30. polju ima 536870912 zrna.
Na 31. polju ima 1073741824 zrna.
Na 32. polju ima 2147483648 zrna.
Na 33. polju ima 4294967296 zrna.
Na 34. polju ima 8589934592 zrna.
Na 35. polju ima 17179869184 zrna.
Na 36. polju ima 34359738368 zrna.
Na 37. polju ima 68719476736 zrna.
Na 38. polju ima 137438953472 zrna.
Na 39. polju ima 274877906944 zrna.
Na 40. polju ima 549755813888 zrna.
Na 41. polju ima 1099511627776 zrna.
Na 42. polju ima 2199023255552 zrna.
Na 43. polju ima 4398046511104 zrna.
Na 44. polju ima 8796093022208 zrna.
Na 45. polju ima 17592186044416 zrna.
Na 46. polju ima 35184372088832 zrna.
Na 47. polju ima 70368744177664 zrna.
Na 48. polju ima 140737488355328 zrna.
Na 49. polju ima 281474976710656 zrna.
Na 50. polju ima 562949953421312 zrna.
Na 51. polju ima 1125899906842624 zrna.
Na 52. polju ima 2251799813685248 zrna.
Na 53. polju ima 4503599627370496 zrna.
Na 54. polju ima 9007199254740992 zrna.
Na 55. polju ima 18014398509481984 zrna.
Na 56. polju ima 36028797018963968 zrna.
Na 57. polju ima 72057594037927936 zrna.
Na 58. polju ima 144115188075855872 zrna.
Na 59. polju ima 288230376151711744 zrna.
Na 60. polju ima 576460752303423488 zrna.
Na 61. polju ima 1152921504606846976 zrna.
Na 62. polju ima 2305843009213693952 zrna.
Na 63. polju ima 4611686018427387904 zrna.
Na 64. polju ima 9223372036854775808 zrna.
Ukupno ima 18446744073709551615 zrna psenice.
 
Poslednja izmena:
Mislim da nije strasno ako zauzmem 0.5KB na 1 milisekund :D
Jeste. :rtfm:

:D

OK, tema se zove "PASCAL - Zadaci, resenja, problemi, izazovi...", pa uvek može da se optimizuje. :) Mislim, ~10byte memorije (qword ima 8byte, smallint 1byte, tu i tamo se još nešto zbiva...) vs. ~520byte (65 qword (65 * 8 = 520) i integer).

;)

Ajd' Nemanja ako ti nije problem molim te otkucaj.Pošto na takmičenjima daju samo Turbo Pascal. :(

Andrej,uradio sam ja spiralni obilazak samo na mnogo,mnogo složeniji način,ali *** ti si iskusniji.Moj kod je gore :D
Video sam kod, ali je malo nezgodan. Mislim, radi u istom/sličnom vremenu kao ovo moje, ali je teško da nekom objasniš šta radi svaki korak.

Mislim da nije moguće ispisati sve brojeve u TurboPascal-u, mislim da mu je ograničenje za cele brojeve 2[SUP]31[/SUP] - 1 jer je 16-bitan kompajler. longint umesto qword može da reši za pola table, ne može čitav zadatak. Eventualno može da radi nešto sa modulom, ali to je bzvz.

Ne verujem da imam mnogo više iskustva od tebe. Mislim, ja se ovim bavim tek neke dve godine.

Nego, evo za vas jedan zadatak: imate prirodne brojeve od 1 do n koji su dati u nekom redosledu. Odredite koja je to leksikografska permutacija po redu. Na primer, 2 3 1 je četvrta leksikografska permutacija niza 1 2 3 (1 2 3 -> 1 3 2 -> 2 1 3 -> 2 3 1). Pretpostavite da je n <= 18.
Kod:
Ulaz:            Izlaz:
4                8
2 1 4 3
---
6                370
3 4 2 5 6 1
 
Dakle, u broj cuvas cifre trenutnog broja a u suma cifre trenutnog zbira. Svaki put svaku od cifara broja pomnozis sa 2 i onda sredis to tako sto ides od nazad i za svaki broj veci od 9(tj onaj koji nije cifra) prethodnom dodas 1 a ovom oduzmes 10 kao sto i inace radis kad sabiras 2 broja pa kazes ovo pisem a ovo pamtim. Onda to dodas na sumu pa isto odradis. Kad ispisujes, prvo dodjes do prve cifre razlicite od 0 pa tek onda krenes da ispisujes cifru po cifru i to je to.
Kod:
var
   broj,suma:array[1..20] of integer;
   i,j:integer;

begin
   for i:=1 to 19 do
      begin
         broj[i]:=0;
         suma[i]:=0;
      end;
   broj[20]:=1;
   suma[i]:=1;
   writeln(1);
   for i:=2 to 64 do
      begin
         for j:=1 to 20 do
            broj[j]:=broj[j]*2;
         for j:=20 downto 1 do
            if broj[j]>=10 then
               begin
                  broj[j]:=broj[j]-10;
                  broj[j-1]:=broj[j-1]+1;
               end;
         for j:=1 to 20 do
            suma[j]:=suma[j]+broj[j];
         for j:=20 downto 1 do
            if suma[j]>=10 then
               begin
                  suma[j]:=suma[j]-10;
                  suma[j-1]:=suma[j-1]+1;
               end;
         j:=1;
         while (broj[j]=0) and (j<20) do
            j:=j+1;
         repeat
            write(broj[j]);
            j:=j+1;
         until j>20;
         writeln;
      end;
   j:=1;
   while (suma[j]=0) and (j<20) do
      j:=j+1;
   repeat
      write(suma[j]);
      j:=j+1;
   until j>20;
   writeln;
end.
 
Radi sad,hvala.:)

Nego,može mi ko pomoći oko tumačenja jednog zadatka?

U vrtu se nalazi N stabala.Vrt je kvadratnog oblika stranica MxM metara.Stabla su posađena u razmaku X,Y metara od gornjeg lijevog ugla.Rubovi vrta ne sadrže stabla.Svako stablo nosi oznaku Z-zdravo ili S-suvo stablo.Potrebno je pronaći pravougaonik(sa istim ili različitim stranicama) najveće površine u kojem se nalaze suva stabla za sjeći.
Stranice tog pravougaonika mojraju biti paralelne stranicama vrta i mogu sadržavati stabla ili ležati na rubovima vrta.

Primjer:
Ulaz: Izlaz:
M=16 96
X=4
Y=4
Z,Z,S
Z,Z,S
S,Z,Z

Samo objasnite kako je dobijeno ovo 96?

I nemoj da bi neko pisao kod.:mrgreen:
 
Poslednja izmena:
PROŠAO SAM DALJE!!!


I to kao 1. razred :cool:


Zadatke šaljem u ponedeljak pošto će mi profesor tad dati svoje papire,pošto sam ja svoje zaobravio u Banja Luci.:mrgreen:

Hvala svima koji su pomagali,a posebno Nemanji,on mi je najviše pomogao.

Eto sad na državno idem kao turista,teško da sad nešto tamo mogu postići.

Kad budem 3. ili 4. razred onda napadam prolaz na olimpijadu.
 
Evo koda,ako treba da se objasni,nije mi mrsko.
Je l' to to?

Kod:
program winex;
 type
 matrica=array[1..20,1..20] of integer;
  var
  T:matrica;
  i,j,min,n,m:integer;
   begin
   writeln ('Broj redova?');
    readln (n);
    writeln ('Broj kolona?');
    readln (m);
    for i:=1 to n do
    for j:=1 to m do
     begin
     readln (T[i,j]);
     end;
     i:=1;
     j:=1;
     repeat
     begin
     min:=T[i,1];
     if T[i,j]<min then T[i,j]:=min;
     j:=j+1;
     if j>m then
      begin
      j:=1;
      i:=i+1;
      writeln (min);
      end;
      end;
       until i>n;
      readln;
      end.
 
@Stefan, u okvirurepeat nije potreban begin i end, jer se sve izmedju repeat i until posmatra kao naredbe te petlje.

Moze sa for, i lakse je dosta.

Kod:
var
   i,j,m,n,min:integer;
   a:array[1..100,1..100] of integer;
begin
   write('Unesite broj redova: ');
   readln(n);
   write('Unesite broj kolona: ');
   readln(m);
   writeln('Unesite matricu dimenzija ',n,'x',m,':');
   for i:=1 to n do
      begin
         for j:=1 to m do
            read(a[i,j]);
         readln;
      end;
   for i:=1 to n do
      begin
         min:=a[i,1];
         for j:=2 to m do
            if a[i,j]<min then
               min:=a[i,j];
         writeln('minimalna vrednost u ',i,'-tom redu je: ',min);
      end;
end.
 

Back
Top