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

Kod:
program zadatak_1;
var
  i : integer;

function Kub(Sender : integer) : integer;
var
  Temp : integer; //Ovde cuvamo kub cifre
begin
  repeat
    Temp := Sender mod 10; //uzmamo cifru
    Sender := Sender div 10; //i tu cifru izbacijemo iz broja;
    Result := Result + (Temp * Temp * Temp); // dadajemo rezultatu kub izdvojene cifre
  until Sender = 0; //izlazimo ako smo sve cifre procesirali
end;

begin
  for i := 1 to 9999 do // predpostavljam pod pojmom sve manje brojeve mislise sve manje 
    if Kub(i) = i then writeln(i); //pozitivne brojeve
end;

Program nisam kompajlirao. Greska je moguca.
 
Ovo koda, veoma jednostavno:

Kod:
program writing;

{$mode objfpc}

uses
  SysUtils;

type
  TOneData = record
    Have : boolean;
    Count : integer;
  end;

var
  Glyph : array[65..122] of TOneData;
  Sequence : array[1..3000000] of integer;
  Glyph_Len : integer;
  Sequence_Len : longint; i : integer;

procedure LoadData(FileName : string);
var
  fText : TextFile;
  i : integer;
  TempChar : Char;
begin
  AssignFile(fText, FileName);
  Reset(fText);
  Readln(fText, Glyph_Len, Sequence_Len);
  for i := 1 to Glyph_Len do
    begin
      Read(fText, TempChar);
      Glyph[Ord(TempChar)].Have := true;
      Inc(Glyph[Ord(TempChar)].Count)
    end;
    Readln(fText, TempChar); // Uklanjamo #13
  for i := 1 to Sequence_Len do
    begin
      Read(fText, TempChar);
      Sequence[i] := Ord(TempChar);
    end;
  CloseFile(fText);
end;

procedure Add(Sender : integer);
begin
  if Glyph[Sender].Have then
    Inc(Glyph[Sender].Count);
end;

function DoWriting : integer;
var
  Last, First : integer;
  i, j : integer;
  check : boolean;
begin
  Last := 1;
  First := 0;
  Result := 0;
  for i := 1 to Sequence_Len - Glyph_Len + 1 do
    begin
      if First > i then
        begin
          Add(Sequence[i]);
          continue;
        end;
        Check := true;
      for j := Last to i + Glyph_Len - 1 do
        begin
          if not Glyph[Sequence[j]].Have then
            begin
              Last := j + 1;
              First := Last;
              Check := false;
              Break;
            end;
          if Glyph[Sequence[j]].Count = 0 then
            begin
              Last := j;
              Check := false;
              Break;
            end;
          Dec(Glyph[Sequence[j]].Count);
        end;
      if Check then
        begin
          Inc(Result);
          Last := i + Glyph_Len;
        end;
      Add(Sequence[i]);
    end;
end;

procedure SaveData(Filename : string);
var
  fText : TextFile;
begin
  AssignFile(fText, FileName);
  Rewrite(fText);
  Writeln(fText, DoWriting);
  CloseFile(fText);
end;

begin
  LoadData('writing.in');
  SaveData('writing.out');
end.
 
Evo pocele pipreme ove godine za takmicenje iz informatika pa da stavim zadatak koj sam upravo radio

Napisati program kojim se ispituje koliko puta se cifra 2 pojavljuje u zapisu celog broja.

Kod:
program zad41;
{$mode objfpc}
var
  Num : longint;
  i : integer;
  count : integer;
begin
  Readln(Num);
  repeat
    if (Num mod 10) = 2 then Inc(count);
    Num := Num div 10;
  until Num = 0;
  writeln(Count);
end.

Ovo je sasvim lagan zadatak ali nekaga.

Ako smo vec poceli pisati ovako programe, ajmo malo izmjenjivati znanje iz polja alogoritamskog programiranja. Mozamo postaviti nesto kao tutorijale iz oblasti sortiranja, binarnog pretrazivanja, grafova, obrade stringa, rada sa velikim brojevima itd...
 
Rekao sam da cu malo stavljati alogoritma pa da pocnem:

Prvo cu da pojasnim alogoritme za sortiranje.

Cesto u programiranju javlja potreba da se neki podaci sortiraju u neopadajucem ili u nerastujecem redu. Postoji mnogo alogoritama koji sluze za ovu zadacu a neki su:
Bubble sort, Merge sort, Radix sort, Quick sort ...

Danas cu da objesnim najjednostavniji naravno i najsporiji Bubble sort(metodu mjehurica). Procedura za ovaj alogoritam izgleda ovako:

Kod:
type
  TNiz = array[1..1000] of integer;

procedure Bubble_Sort(Count : integer; var niz : TNiz);
var
  i, j : integer;
begin
  for i := Count - 1 downto 1 do
    for j := 1 to i do
      if niz[j] > niz[j + 1] then
        begin
          Temp := Niz[j];
          Niz[j] := Niz[j + 1];
          Niz[j + 1] := Temp; 
        end;
end;

To bi bilo to. Alogoritam koristi dvije for petlje(vanjska i unutrasnja) u principu program provjerava dva uzastopna clana niza i rotira ih ako je prvi veci od drugog. Ovim se postiza da se svakim ciklusom unutrasnje petlje najveci broj u nesortiranom djelu niza postavi na krajnje mjesto u nesortiranom djelu niza cime zadnji clan postaje sortiran.
 
Samo mala dopuna na temu algoritama za sortiranje.

Generalno algoritmi za sortiranje se mogu podeliti u dve grupe u zavisnoti od brzine njihovog izvršavanja - odnosno kompleksnosti. U prvu grupu algoritama za sortiranje kojima je vreme izvršavanja proporcionalno n*n, gde je n broj elemenata koji se sortiraju spadaju: Bubble sort, Selection sort, Insertion sort i Shell sort. U drugu grupu gde je vreme izvršavanja proporcionalno n * log n spadaju: Heap sort, Merge sort i Qucik sort.

Iako više algoritama pripada istoj grupi brzina njihovog izvršavanja se razlikuje. U prvoj grupi algoritma najbrži je: Shell, a potom slede Insertion, Selection i na kraju Bubble sort.
 
ja sam isao po takmicenjima u srednjoj skoli :))
evo jedan lak sa matricama (ne takmicarski): popuniti matricu nxm brojevima od 1 do n*m spiralno pocev od nekog ugla, bilo u clockwise ili suprotnom smeru.
evo jedan malo tezi: naci determinantu matrice Anxn
jos jedan srednji: resiti linearni sistem nxn zadat matricom A (gausov metod svodjenja matrice)
evo jedan dosta tezi: ako matrica Anxn predstavlja lavirint (1 zid, 0 nema zida) naci put od tacke X do tacke Y ako postoji (ovo se radi dinamickim programiranjem)
jos jedan tezi, iako ne izgleda tako: napisati program koji stampa svoj izvorni kod.
evo jedan bez matrica, bio na nekom laksem takmicenju: ako imamo n tegova zadati svojom masom raspodeliti ih u dve grupe tako da razlika medju grupama bued minimalna

to mi pada na pamet sada :)
Pozdrav
 
Nemanja666:
Ovo su mi najdrazi zadatci. Najlakse ga je uraditi primjenom BFS-a, o grafovima bice kasnije price u teme alogoritmi.

moze i tako, onda je jedino posao da se napravi graf, ostalo nije problem. ali je zgodan primer za dinamicko. Evo jos jedan: zamisli da lopov ulazi u radnju u kojoj je svaki artikl zadat cenom i tezinom. Njegov ranac moze da ponese tezinu X. Odrediti sta treba da ukrade tako da ukupna vrednost bude najveca.
evo jedan laksi: zamislite ogrlicu od crnih i belih perli koja je zadata nizom A gde je a=1 za crnu i 0 za belu (ili kako vec). Odrediti mesto presecanja ogrlice tako da se sa obe strane nadje max broj perli iste boje (ne moraju perle levo biti iste boje kao one desno), misli se na max broj u zbiru.
 

Back
Top