- COMP.CS.140
- 4. Suuren ohjelman toteuttaminen
- 4.6 ⌛⌛ Sarjataulukko
⌛⌛ Sarjataulukko¶
Tehtävään on tarjolla valmiina totetusta testaava luokka sekä testisyötetiedosto student_template_project
-repositoriossa hakemistossa Round4/standings
.
Aseta toteutuksesi tiedostoon Standings.java.
Toteuta luokka Standings
, joka ylläpitää sille annettujen otteluiden tulosten perusteella
sarjataulukkoa. Joukkueet pelaavat otteluita keskenään, ja joukkue saa kustakin voitosta 3
pistettä, tasapelistä 1 pisteen ja häviöstä 0 pistettä. Tämä siis vastaa esim. jalkapallosta
tuttuja sääntöjä.
Luokalla Standings
tulee olla seuraavat julkiset jäsenet. Voit suunnitella yksityiset
jäsenet vapaasti.
Sisäinen staattinen luokka
Team
, jonka julkiset rakentimet/jäsenet ovat:Rakennin
Team(String name)
: alustaaTeam
-olion kuvaamaan annetun nimen omaavaa joukkuetta.Jäsenfunktio
getName()
, joka palauttaa joukkueen nimen.Jäsenfunktiot
getWins()
,getTies()
,getLosses()
,getScored()
,getAllowed()
jagetPoints()
. Näistä kukin palauttaaint
-arvon, joka kertoo joukkueelle siihen asti kertyneen tiedon (vastaten funktion nimeä).Team
-luokan tulisi näin ollen ylläpitää sisäisesti tietoa ainakin joukkueen voittojen, tasapelien, häviöiden, tehtyjen maalien, päästettyjen maalien ja pisteiden määrästä.
Rakentimet
Standings()
jaStandings(String filename)
: ensimmäinen alustaa tyhjänStandings
-olion. Jälkimmäinen alustaaStandings
-olion parametrin määrittämästä tiedostosta luetulla otteludatalla. Data luetaan täsmälleen samalla tavalla kuin jäsenfunktioreadMatchData
(kts. alla).Jäsenfunktio
readMatchData(String filename)
: Lukee otteludataa tiedostosta ja täydentää sisäisen datan huomioimaan myös luetut ottelut. Otteludatan oletetaan koostuvan muotoa “teamNameA\tgoalsA-goalsB\tteamNameB
” olevista riveistä. Huomaa, että'\t'
tarkoittaa sarkain-merkkiä.Esimerkiksi “
Iceland\t3-2\tFinland
” kuvaa ottelun, jossa Islanti (Iceland) teki 3 maalia ja Suomi (Finland) 2 maalia.Vihje: operaatio
"Iceland\t3-2\tFinland".split(\\t)
tuottaaString
-taulukon["Iceland", "3-2", "Finland"]
. Lisäksi"3-2".split("-")
taulukon["3", "2"]
.
Jäsenfunktio
addMatchResult(String teamNameA, int goalsA, int goalsB, String teamNameB)
: lisää parametrien kuvaaman ottelutuloksen sisäiseen dataan.Jäsenfunktio
getTeams()
: palauttaaArrayList<Team>
-listan, joka sisältää kaikki datassa esiintyvät joukkueet siinä järjestyksessä kuin ne esiintyisivät sarjataulukossa (katsoprintStandings
-funktion kuvaus alla).Listassa voi olla suoraan sisäisen datan
Team
-olioita (toivottavasti olet käyttänytTeam
-luokkaa sisäisen datan tallentamisessa…). Tämä on sinänsä turvallista, koskaTeam
-luokalla ei ole dataa muuttavia julkisia funktioita.Edelliseen liittyen huomio, että
Standings
-luokalla on ympäröivänä luokkana oikeus käsitelläTeam
-luokan yksityisiä jäseniä. LuokanStandings
toteutuksesi voi siten helposti päivittääTeam
-olioita, vaikka ulkopuoliset eivät voikaan.
Jäsenfunktio
printStandings()
: tulostaa “nätisti” muotoillun sarjataulukon, joka kuvastaa kaikkia toistaiseksi talletettuja ottelutuloksia.Sarjataulukon kukin rivi luettelee joukkueen nimen, pelatut ottelut, voitot, tasapelit, häviöt, tehdyt maalit, päästetyt maalit ja pisteet.
Taulukko on järjestetty seuraavien (osin keinotekoisten) sääntöjen mukaan:
Ensisijainen sääntö: pisteet. Korkeampi ylempänä.
Toissijainen sääntö: maaliero (tehdyt maalit - päästetyt maalit). Suurempi ero ylempänä.
Kolmas sääntö: tehdyt maalit. Korkeampi ylempänä.
Viimeinen sääntö: joukkueiden nimen aakkosjärjestys (tämä on keinotekoinen sääntö; oikeasti esim. heitettäisiin noppaa?).
Muotoile sarjataulukko seuraavasti:
Joukkueen nimen perään tulostetaan niin monta välilyöntiä, että nimen ja välilyöntien määrä vastaa pisimmän joukkueen nimen pituutta.
Pelatut ottelut, voitot, tasapelit ja häviöt tulostetaan 3 merkin leveydellä (välilyönnit arvon edessä).
Tehdyt ja pääsettyt maalit tulostetaan yhtenä merkkijonona muodossa “tehdyt-päästetyt”, ja tulostus tehdään 6 merkin levyisenä (välilyönnit edessä).
Pisteet tulostetaan 3 merkin leveydellä (välilyönnit arvon edessä).
Sarakkeet erotetaan toisistaan edellisten sääntöjen lisäksi yhdellä välilyönnillä.
Annetun esimerkkitulosteen pitäisi selventää taulukon muodostamista.
Toteutuksen testaus¶
Voit ensialkuun testata Standings
-luokkaasi seuraavalla koodinpätkällä:
Standings standings = new Standings();
standings.addMatchResult("Tonga", 0, 3, "Cook Islands");
standings.addMatchResult("Samoa", 3, 2, "American Samoa");
standings.addMatchResult("Cook Islands", 1, 0, "Samoa");
standings.addMatchResult("Tonga", 1, 2, "American Samoa");
standings.addMatchResult("Tonga", 0, 3, "Samoa");
standings.addMatchResult("American Samoa", 2, 0, "Cook Islands");
standings.printStandings();
Alla on näytetty, mitä koodinpätkän tulisi tulostaa. Taulukon arvot asettuvat yllä kuvattujen tulostusleveyksien käytön ansiosta kohtalaisen mukavasti sarakkeisiin.
Samoa 3 2 0 1 6-3 6
American Samoa 3 2 0 1 6-4 6
Cook Islands 3 2 0 1 4-2 6
Tonga 3 0 0 3 1-8 0
Edellinen oli vain alustava testi. Voit tehdä hieman laajemman testin käyttämällä tiedostossa
StandingsTest.java
annettua testiohjelmaa, tiedostojen input.txt
ja input_b.txt
testidataa ja odotetun tuloksen kuvaavaa tiedostoa output.txt
. Aseta nämä tiedostot sekä oma
luokkatoteutuksesi samaan hakemistoon, käännä ohjelma esim. tapaan javac *.java
, ja suorita
tapaan
java StandingsTest input.txt input_b.txt Mexico 1 1 USA Panama 2 2 Honduras
"Costa Rica" 2 1 "Trinidad and Tobago" USA 0 2 "Costa Rica" "Trinidad and Tobago" 1 2 Honduras
.
Suorituksen pitäisi tuottaa tiedostossa output.txt
kuvattu tuloste
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.