Další matematické funkce a operátory

Kdo z vás v minulé lekci zkoušel nejobtížnější úlohu, nejspíš už potřeboval některou z dalších matematických funkcí nebo operátorů.


Pro práci s celými čísly lze použít tyto operátory:
div - celočíselný podíl, například: 8 div 3 dává výsledek 2
mod - zbytek po celočíselném dělení, například: 7 mod 3 dává výsledek 1

Další funkce lze použít pro práci s reálnými (desetinnými) čísly, případně k převodů mezi reálnými a celými čísly:
trunc - převede hodnotu reálného typu na hodnotu celočíselnou, která vznikne odstraněním desetinné části
int - stejně jako trunc, ale výsledkem je reálné číslo
frac - vrací část reálného čísla za desetinnou čárkou
round - zaokrouhlí reálnou hodnotu na celočíselnou podle podobných pravidel, která znáte z hodin matematiky


Projekt výčetka

Uvedené operátory vyzkoušíme na jednoduchém projektu, který pokladníkovi v bance určí nejmenší možný počet platidel (5000 Kč, 2000 Kč, 1000 Kč, 500 Kč, 200 Kč, 100 Kč) pro vyplacení zadané čásky, uvažujeme jen násobek 100 (jde o velkou banku :-) ) Na obrázku je vidět, že projekt obsahuje jen Edit pro zadání hodnoty a ListBox pro výpis platidel.
Vlastní výpočet se spouští tlačítkem, na kterém je jediná procedura tohoto projektu (zatím ne moc šikovná, ale funguje a jinak to zatím neumíme):

procedure TForm2.Button1Click(Sender: TObject);
begin
castka:=strtoint(edit1.Text);
listbox1.Clear;
listbox1.Items.Add('Na vyplacení '+ edit1.Text + ' Kč bude potřeba:');

pettisic:=castka div 5000;
listbox1.Items.Add('5000 Kč: ' + inttostr(pettisic));
zbytek:=castka mod 5000;

dvatisic:=zbytek div 2000;
listbox1.Items.Add('2000 Kč: ' + inttostr(dvatisic));
zbytek:=zbytek mod 2000;

tisic:=zbytek div 1000;
listbox1.Items.Add('1000 Kč: ' + inttostr(tisic));
zbytek:=zbytek mod 1000;

petset:=zbytek div 500;
listbox1.Items.Add('500 Kč: ' + inttostr(petset));
zbytek:=zbytek mod 500;

dveste:=zbytek div 200;
listbox1.Items.Add('200 Kč: ' + inttostr(dveste));
zbytek:=zbytek mod 200;

sto:=zbytek div 100;
listbox1.Items.Add('100 Kč: ' + inttostr(sto));
end;


Nešikovnost této procedury je v její délce, ale když se dobře podíváte, tak zjistíte, že se pro každé platidlo opakují jen tři příkazy (u 100 Kč už jen dva):
- určení celočíselného podílu částky hodnotou platidla - určí počet platidel
- výpis počtu platidel do ListBoxu
- určení nového zbytku.


Aplikace ukládej do složky s názvem lekce13 .

Úkoly:

Základní úloha:

Vytvoř aplikaci Výčetka podle textu lekce (viz ukázka ). Doplň ji o 50 Kč.


Úlohy na plus (za každou jedno plus):

Roky - program bude vypisovat pro zadaný rok kolik má dní (násobek 4 je přestupný, násobek 100 není přestupný, násobek 400 je přestupný).


Ze soutěže PCák 2007:
Program Délka filmů
Zadáváme délku jednotlivých filmů - počet hodin a počet minut. Program vypočte čas filmu v minutách. Dále vypočte celkový součet zadaných časů, který vypíše jako počet hodin a počet minut.


Úloha na jedničku:

Ruleta - zjednodušená hazardní hra pro dva hráče: každý má na začátku nějakou hotovost (třeba 1000 Kč) a z ní může vsadit buď na jedno z čísel od 1 do 6 (pokud trefí, získá šestinásobek vsazené částky), nebo na sudou nebo lichou (pokud trefí, získá trojnásobek vkladu. Po každém kole se vypíše, jak na tom hráči finančně jsou a program se zeptá, zda chtějí hráči pokračovat. Hra také končí, pokud jeden z hráčů zbankrotoval.


Úloha pro experty:

Hra Zápalky - na hromádce je 23 zápalek (extra programátor může mít zadaný počet). Dva hráči postupně z hromádky odebírají jednu, dvě nebo tři zápalky (super experti programátoři libovolný daný počet). Ten, kdo musí vzít poslední zápalku, prohrál (může být i obrácená varianta - kdo bere poslední, vyhrál). Úkolem je naprogramovat hru tak, aby bylo možno vybrat hru pro dva hráče nebo proti neomylnému počítači (a to je právě ten pravý problém - je potřeba nejdřív objevit vítězící strategii).