Zadanie 6

Najneskorší termín odovzdania: 27.11.2022 (nedeľa) o 18:00

Odovzdávané súbory: FileTurtle.java

Upozornenie: Všetky metódy dostanú ako parameter názov súboru. Objekt triedy File si vytvorte v príslušnej metóde.

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++.

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).
  • v prípade použitia vecí, ktoré sme nepreberali, budeme vyžadovať vysvetlenie použitého konceptu a jeho fungovania – trúfate si vysvetľovať regulárne výrazy a ich syntax?

Spočítavanie výsledkov (3 body)

Voľby v USA sú ostro sledovanou udalosťou. Prezidentom sa stane ten, kto získa nadpolovičnú väčšinu hlasov. Víťaz v jednotlivom štáte získava hlasy voliteľov, ktorých počet závisí od veľkosti daného štátu. Na celkovú výhru potrebuje nazbierať toľko víťazstiev, aby počet voliteľov presiahol polovicu.

Máme k dispozícii výsledky za jednotlivé štáty uložené v súbore. Zistite, kto je víťazom volieb. V súbore sa nachádza niekoľko riadkov. Každý riadok zodpovedá výsledku v jednom štáte a je v ňom uvedené meno víťaza a počet hlasov, niekedy aj názov alebo skratka štátu. Žiaľ, formát súboru nebol vopred stanovený, a preto máme výsledky zapísané rôzne. Niekde je zapísané najprv meno a potom počet hlasov, inde naopak. Niekedy je pri počte hlasov uvedené aj nejaké doplnkové slovo, napr. members alebo votes. Navyše, meno kandidáta môže byť napísané malými alebo veľkými písmenami (resp. prvé písmeno veľké) a občas aj vrátane krstného mena. Môžete predpokladať, že v riadku sa nachádza práve jedno číslo.

Úloha: naprogramujte metódu isWinner, ktorá dostane na vstupe meno jednoslovné priezvisko kandidáta name a názov súboru resultsFilename, ktorý obsahuje záznam výsledkov za jednotlivé štáty. Metóda vráti true, ak daný kandidát získal viac ako polovicu zo všetkých hlasov.


1
public boolean isWinner(String name, String resultsFilename)

Príklad súboru:


1
2
3
4
OKLAHOMA Donald Trump 7 votes
biden 20 members illinois
FL 29 trump
5 votes michigan JOE BIDEN

En ten tiky dva špendlíky (5 bodov)

Možno si spomeniete na rôzne detské vyčítanky, ktorých úlohou bolo určiť, ktoré dieťa ide z kola von. Deti sú zoradené do kruhu a po každej slabike sa ukáže prstom na ďalšie dieťa. Pre účely tohto zadania si môžeme predstaviť deti zoradené v rade (keď dôjde vyčítavanie na koniec, tak sa pokračuje od prvého dieťaťa). Každá vyčítanka sa skladá z k slabík a posledná slabika (väčšinou slovo von) určí, ktoré dieťa do ďalšieho kola nepostupuje.

Predpokladajme, že pri n deťoch sa opakuje tá istá vyčítanka zložená z k slabík, až kým ostane posledné dieťa. Priebeh celej tejto hry si deti starostlivo zapíšu do súboru. Po vypadnutí dieťaťa sa začína od začiatku radu.

Príklad: Sú štyri deti (Katka, Lenka, Marika, Nikolka). Vyčítanka je Ty musíš ísť z kola von! Začína sa od Katky a vypadne Marika – Ty(K)-mu(L)-síš(M)-ísť(N)-z ko(K)-la(L)-von(M). V ďalšom kole ostanú tri deti (Katka, Lenka, Nikolka). Začína sa od Katky, vypadne Katka – Ty(K)-mu(L)-síš(N)-ísť(K)-z ko(L)-la(N)-von(K). V poslednom kole sa začína od Lenky. Nakoniec vypadne Lenka a posledná ostane Nikolka.

Úloha: naprogramujte metódu vyčítanka, ktorá dostane ako parameter počet detí n, počet slabík vo vyčítanke k a názov súboru priebeh, v ktorom je zapísané poradie, v akom boli vyradené z hry. Ako posledné je uvedené dieťa, ktoré zotrvalo až do konca a nebolo vyradené. Mená v súbore sú jednoslovné a oddelené medzerou. Metóda vráti pole Stringov, ktoré zodpovedá pôvodnému rozostaveniu detí pred začiatkom hry.


1
public String[] vycitanka(int n, int k, String priebeh)

Príklad súboru (priebeh vyčítanky – ako vypadli v poradí):


1
Marika Katka Lenka Nikolka

Výstup pre zadaný súbor (n = 4 a k = 7) – pôvodné rozostavenie:


1
[Katka, Lenka, Marika, Nikolka]

Rada č. 1: Deti zvyknú počítať od 1. Ak vám to pomôže, odpočitajte od hodnoty k číslo 1 a môžete vyčítanku počítať od nuly.

Rada č. 2: Vyhnite sa upravovaniu poľa. Môžete si pre zadanú dvojicu n a k vytvoriť pomocné pole, ktoré na i-tom indexe povie ktoré dieťa (index) bolo vyradené v i-tej iterácii vyčítanky.

Premenovanie premenných (5 bodov)

Antiplagiátorský softvér dokáže nájsť zhodu v kóde, aj keď sa rozhodnete zmeniť názvy premenných. Napríklad tak, že všetky premenné v kóde premenuje a použije pritom rovnaké pravidlá. Či to tak funguje aj v skutočnosti necháme zahalené rúškom tajomstva.

Nahraďte všetky výskyty premenných, ktoré sú zadané ako parametre metódy jednopísmenkovými názvami a, b, c a pod. V súbore sa bude nachádzať práve jedna java metóda bez syntaktických chýb. Počet parametrov bude maximálne 5. Môžete predpokladať formátovaný kód, ktorý neobsahuje veci, ktoré ste nevideli v prvej polovici semestra. Navyše, pôvodné názvy premenných budú mať aspoň 3 znaky (iba malé písmená) a žiadne iné slovo v kóde nebude obsahovať takú postupnosť znakov (napr. názov premennej nebude eng ak v kóde bude pole.length)

Úloha: vytvorte metódu renameVariables, ktorá načíta java kód zo súboru s názvom inputFilename a zapíše upravený kód do súboru s názvom uloženým v outputFilename. Upravený kód má nahradené všetky výskyty premenných zadaných parametrom, písmenami a, b, c a pod. podľa poradia, v akom sa nachádzajú v hlavičke metódy. Text v týchto dvoch súboroch nech sa líši iba v názvoch parametrov.


1
public void renameVariables(String inputFilename, String outputFilename)

Príklad – vstupný súbor


1
2
3
4
5
6
7
8
9
public int countChar(String retazec, char znak) {
    int counter = 0;
    for (int i = 0; i < retazec.length(); i++) {
        if (retazec.charAt(i) == znak) {
            counter++;
        }
    }
    return counter;
}

Príklad – výstupný súbor


1
2
3
4
5
6
7
8
9
public int countChar(String a, char b) {
    int counter = 0;
    for (int i = 0; i < a.length(); i++) {
        if (a.charAt(i) == b) {
            counter++;
        }
    }
    return counter;
}