Řešené úlohy

V tomto textu budu postupně shromažďovat řešené úlohy buď ze soutěží programování, nebo z volné tvorby našich žáků, případně i jiných zdrojů. Většinou se zaměřím na jádro problému, tedy hlavně zdrojový kód.

Pátky 13.

Úloha z krajského kola soutěže v programování v roce 2007 (zjednodušená)
Napište program, který pro všechny roky 2001 - 2100 zobrazí, kolik je v kterém roce pátků třináctého. (Nápověda: 1.1. 2001 bylo pondělí. Pro ty co nevědí, jak je to s přestupnými roky: přestupný je každý rok, jehož letopočet je dělitelný čtyřmi, pokud zároveň není dělitelný stem (navíc jsou přestupné i roky dělitelné číslem 400, ale takový se v zadání nevyskytuje)).

S tímto zadáním je úloha poměrně jednoduchá. Nejprve nadefinujeme proměnné, všimněte si, že pro dny měsíců je definované pole mesice a zároveň jsou určené hodnoty tohoto pole, jde o další možnost, jak do pole vložit hodnoty (samozřejmě jsme ale mohli použít dvanáct příkazů mesice[1]:=31; mesice[2]:=28; mesice[3]:=31 atd.).
var
Form2: TForm2;
dny,n,roky: integer;
mesice: array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);

Proměnná dny je použita k průběžnému počítání všech dnů od 1.1.2001, na začátku ji tedy vynulujeme. Potom ve for cyklu od roku 2001 do roku 2100 nejprve zjistíme, jestli je příslušný rok přestupný a podle toho vložíme do proměnné mesice[2] (neboli počet dní v únoru) buď hodnotu 29 nebo 28.
Pro každý rok potom v dalším for cyklu pro všechny měsíce nejprve vždy přičteme do proměnné dny číslo 13 a zjistíme, jestli se jedná o pátek (zbytek počtu dní po dělení sedmi je 5) - pokud ano, vypíšeme číslo měsíce do listboxu. Nakonec do proměnné dny dopočteme zbytek měsíce.
procedure TForm2.Button1Click(Sender: TObject);
begin
dny:=0;
for roky:=2001 to 2100 do
begin
listbox1.Items.Add(inttostr(roky)+'.:');
if roky mod 4=0 then mesice[2]:=29 else mesice[2]:=28;
if roky mod 100 = 0 then mesice[2]:=28;
  for n:=1 to 12 do
  begin
  dny:=dny+13;
  if dny mod 7 = 5 then listbox1.Items.Add(inttostr(n)+'.');
  dny:=dny-13+mesice[n];
  end;
end;
end;