6. sada domácich zadaní

Najneskorší termín odovzdania: 27.11.2016 (nedeľa) o 22:00
Odovzdávané súbory: ZadanaKorytnacka.java

Doplňujúce požiadavky:

  • riešenia, ktoré nebude možné skompilovať (t.j. riešenia so syntaktickými chybami) nebudú hodnotené,
  • zdrojový kód správne naformátujte (CTRL+SHIFT+F),
  • očakáva sa vhodne okomentovaný zdrojový kód,
  • nepoužívajte žiadne inštančné premenné (na riešenie úloh nie sú potrebné),
  • v prípade potreby si vytvorte pomocné metódy,
  • pri riešeniach úloh nie je dovolené využiť triedu BigInteger a jej podobné triedy,
  • pri riešeniach úloh nie je dovolené využiť triedy z JCF (napr. implementácie rozhrania Map).

O písomke z algebry (3 body)

Vyučujúci algebry na PF UPJŠ ľúbia dávať na písomke úlohu, kde sa pýtajú, akou najväčšou mocninou nejakého čísla je deliteľný nejaký súčin veľa čísel. Špeciálnym prípadom tejto úlohy je úloha zistiť, koľko núl má na konci súčin týchto čísel (t.j. pýtame sa akou najväčšou mocninou čísla 10 je deliteľný tento súčin). Kým matematici radi vyvodzujú "magické" vzorce, pomocou ktorých nájdu odpoveď, my na PAZ1a (znalí programovania) si rýchlejšie napíšeme program, ktorý to vypočíta. Aby sme neboli obmedzení len peknými súčinmi (číslami idúcimi za sebou), budeme uvažovať súčin ľubovoľnej postupnosti čísel v rozsahu long. Samotný výsledok súčinu však môže byť číslo mnohonásobne presahujúce rozsah typu long.

Do triedy ZadanaKorytnacka pridajte metódu pocetNulVSucine, ktorá zo zadaného textového súboru načíta bielymi znakmi (medzery, konce riadkov, ...) oddelené čísla v rozsahu typu long a vráti, koľkými nulami bude končiť súčin týchto čísel. Môžete predpokladať, že žiadne z čísel v súbore nebude 0.

public int pocetNulVSucine(String nazovSuboruSCislami)

Väznica (5 bodov)

Systém na vzdialené ovládanie dverí ciel vo väznici zaznamenáva všetky udalosti, ktoré sa v systéme udiali. Denný log operácií obsahuje každú udalosť zapísanú v jednom riadku logovacieho súboru. Tento riadok sa skladá z troch medzerami oddelených častí:

  • čas, kedy sa udalosť zaznamenala,
  • typ operácie: OPEN, ak došlo k požiadavke na otvorenie ciel, alebo CLOSE, ak došlo k požiadavke na uzamknutie ciel,
  • medzerami oddelený zoznam ciel, na ktoré sa operácia aplikovala; kód cely je číslo od 1 po 1000.

Príklady záznamov:

10:04:12 OPEN 3 8 10 12
O 10:04:12 prišla požiadavka na otvorenie ciel 3, 8, 10 a 12.
11:03:15 CLOSE 3 8 6
O 11:03:15 prišla požiadavka na uzamknutie ciel 3, 8 a 6.

Záznamy sú v logovacom súbore uložené usporiadané podľa času, kedy nastali. Ak príde požiadavka na otvorenie už otvorenej cely, cela ostane otvorená. Ak príde požiadavka na uzamknutie uzamknutej cely, cela ostane uzamknutá. Na začiatku dňa sú všetky cely uzamknuté.

Do triedy ZadanaKorytnacka pridajte metódu pocetOtvorenychCiel, ktorá vráti počet ciel otvorených na konci dňa. Metóda má jeden parameter logovaciSubor, ktorý obsahuje cestu a názov logovacieho súboru. V prípade, že sa logovací súbor nepodarí prečítať (napr. neexistuje), metóda nech vráti hodnotu -1.

public int pocetOtvorenychCiel(String logovaciSubor)

Daň zo stavieb (10 bodov)

Mestá a obce žijú z rôznych daní a poplatkov. Jednou z týchto daní je aj daň zo stavieb. Obec alebo mesto ako správca dane túto daň vyrubuje na základe podaného daňové priznania a platnej sadzby dane upravenej všeobecne záväzným nariadením (ďalej len VZN) v súlade s §9-12a zákona č. 582/2004 o miestnych daniach a miestnom poplatku za komunálne odpady a drobné stavebné odpady (ďalej len zákona). Z informatického hľadiska sú údaje v daňovom priznaní a vo VZN vstupmi pre algoritmus na výpočet dane. Tento algoritmus je popísaný v zákone.

Tlačivá pre Priznanie pre FO a PO k miestnym daniam sú štandardizované: https://www.finance.gov.sk/Components/CategoryDocuments/s_LoadDocument.aspx?categoryId=8698&documentId=12685 Kombinácia OMR a OCR softvéru dokáže automaticky extrahovať údaje z vyplnených formulárov. Predpokladajme, že softvér tieto údaje extrahuje do textových súborov. V tejto úlohe sa budeme zaoberať tlačivom na strane 6: Daň zo stavieb-Stavba slúžiaca na viaceré účely. Formát textového súboru pre toto tlačivo je nasledovný: v každom riadku sa nachádza jedno číslo, pričom ako oddeľovač desatinnej časti je použitá bodka. Jednotlivé čísla zodpovedajú textovým poliam, ktoré sa vo formulári vyplňujú, pričom začíname poľom označeným číslom 16 (Základ dane). Teda v ďalšom (druhom) riadku je obsah poľa 17, v ďalšom potom obsah poľa 18, potom 19a, 19b, ..., 19i, 20.

Príklad extrahovaných údajov z tlačiva:

828
1813
349
305.0
0.0
122.0
61.0
122.0
244.0
122.0
305.0
183.0
2

V tejto úlohe predpokladáme, že obec má prijaté VZN upravujúce výšku miestnych daní. Táto sadza v prípade stavieb je uložená v textovom súbore s nasledovným formátom: V každom riadku je dvojica medzerou oddelených čísel. Prvé číslo predstavuje základ sadzby dane v EUR za m2, druhé číslo príplatok za podlažie v EUR za každý aj začatý m2. Prvý riadok predstavuje sadzu pre stavby podľa § 10, ods. 1, písm. a, druhý pre stavby podľa § 10, ods. 1, písm. b, atď. Ako oddeľovač desatinnej časti čísla je použitá bodka. Napríklad sadzby pre rok 2015 pre stavby kategórie I (http://www.kosice.sk/clanok.php?file=servis_dane2015.htm) by boli v textovom súbore zapísané ako:

0.4 0.16
0.2 0.16
1 0.16
1.15 0.16
1.15 0.16
1 0.16
4 0.16
5.5 0.16
3 0.16

Do triedy ZadanaKorytnacka pridajte metódu danZoStavieb, ktorá vypočíta a vráti vyrúbenú daň zo stavieb podľa §9-12a zákona č. 582/2004 zaokrúhlenú na eurocenty. V prípade akéhokoľvek problému (napr. nemožno načítať súbor), metóda nech vráti hodnotu Double.NaN.

public double danZoStavieb(File tlacivo, File sadzby)

Prvý parameter obsahuje cestu k textovému súboru s vyextrahovanými údajmi z tlačiva daňového priznania, druhý parameter obsahuje cestu k textovému súboru so sadzbami dane platnými pre uvažovanú stavbu. Znenie zákona: http://www.zakonypreludi.sk/zz/2004-582#cast2

Poznámka: Pozrite si aj § 17, ods. 6.

Špirálové pole (10 bodov)

Do triedy ZadanaKorytnacka pridajte metódu spirala, ktorá do zadaného súboru zapíše obsah číselného poľa vo forme matice (2-rozmerného poľa). Jednotlivé čísla z poľa sú v matici uložené špirálovite.

public void spirala(File subor, int[] cisla, int pocetRiadkov)

Význam parametrov:

  • subor - názov a cesta k súboru, kam chceme zapísať výstupné pole
  • cisla - pole s číslami, ktoré chceme zapísať do súboru
  • pocetRiadkov - počet riadkov, do koľkých chceme zapísať čísla; platí, že pocetRiadkov bezo zvyšku delí dĺžku poľa cisla.

Špirálovité uloženie: Čísla vo výstupnej matici sú uložené špirálovite, pričom špirála začína na indexe [0][0] v smere riadku na indexe 0 (vo vodorovnom smere).

Príklady:

spirala(???, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 4):

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

spirala(???, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 4):

1 2 3
10 11 4
9 12 5
8 7 6

spirala(???, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 5):

1 2 3 4
14 15 16 5
13 20 17 6
12 19 18 7
11 10 9 8

Poznámka: Odporúčame vytvoriť si pomocné 2-rozmerné pole, ktoré budete vhodne napĺňať číslami zo vstupného poľa. Samotný zápis dvojrozmerného poľa (matice) do súboru je už jednoduchý - stačí sa inšpirovať úlohami o maticiach z prednášky.


Poznámka k evaluátoru

Textové súbory vytvorené evaluátorom úloh majú konce riadkov kódované spôsobom, aký sa používa v Linuxe alebo MacOS. Niektoré textové editory v MS Windows (napr. Notepad/Poznámkový blok) nevedia takéto súbory korektne zobraziť. Pre ich korektné zobrazenie v MS Windows odporúčame výborný textový editor PSPad alebo Notepad++.