Ohjelmointityö 3. Mikko Laamanen 185667



Samankaltaiset tiedostot
Rajapinta (interface)

Ohjelmoinnin jatkokurssi, kurssikoe

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Listarakenne (ArrayList-luokka)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Metodien tekeminen Javalla

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

8. Näppäimistöltä lukeminen 8.1

Olio-ohjelmointi Javalla

12. Näppäimistöltä lukeminen 12.1

Ohjelmointityö 65 Tekstinmuotoilu ohjelma. Dokumentaatio. Aki Heikkinen (155394)

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Ohjelmointi 2 / 2010 Välikoe / 26.3

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Poikkeustenkäsittely

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Ohjelmoinnin perusteet Y Python

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

8. Näppäimistöltä lukeminen 8.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmoinnin peruskurssi Y1

Sisältö. 22. Taulukot. Yleistä. Yleistä

14. Poikkeukset 14.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

1 Tehtävän kuvaus ja analysointi

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Java-kielen perusteita

Lista luokan sisällä

Sisältö. 2. Taulukot. Yleistä. Yleistä

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

5. HelloWorld-ohjelma 5.1

Mitä poikkeuskäsittely tarkoittaa?

Ohjelmoinnin perusteet Y Python

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

public static void main (String [] args)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Java kahdessa tunnissa. Jyry Suvilehto

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Ohjelmoinnin perusteet Y Python

Mikä yhteyssuhde on?

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Tietokannat II -kurssin harjoitustyö

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Harjoitus 5 (viikko 48)

Taulukoiden käsittely Javalla

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

OutputStream ja InputStream. Tietovirrat ja niiden suunnat. Tietovirtojen käyttö. FileInputStream esimerkki. DataOutputStream ja DataInputStream

11. Javan toistorakenteet 11.1

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Java-kielen perusteet

Ohjelmoinnin perusteet, syksy 2006

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Luokan sisällä on lista

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Ohjelmointi 2, välikoe

Taulukot. Jukka Harju, Jukka Juslin

Javan perusteita. Janne Käki

Javan GUI Scratchaajalle

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

4. Luokan testaus ja käyttö olion kautta 4.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Ohjelmoinnin perusteet Y Python

Java-API, rajapinnat, poikkeukset, UML,...

Ohjelmoinnin perusteet Y Python

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

Olio-ohjelmointi Virhetilanteiden käsittely

Ohjelmoinnin perusteet Y Python

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Java-kielen perusteita

Java-kielen perusteet

Ohjelmointi 2 / 2011 Välikoe / 25.3

Periytyminen (inheritance)

Luokat ja oliot. Ville Sundberg

12. Javan toistorakenteet 12.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin perusteet Y Python

Transkriptio:

Ohjelmointityö 3 Mikko Laamanen 185667

Sisällysluettelo Tehtävän määrittely ja ratkaisuperiaate... 1 Tehtävän määrittely... 1 Ratkaisuperiaate... 1 Ohjelman käyttöohje... 1 Syötteet ja tulosteet... 1 Ohjelman sisältämät tarkastukset ja virheilmoitukset... 2 Ohjelman rajoitukset... 2 Ajo-ohje... 3 Ohjelman toiminta... 3 Tietorakenteet... 3 Ohjelman rakennet... 3 Luokat, tietojäsenet ja metodit... 4 Joukkue-luokka... 4 Sarja-luokka... 5 Tiedostot-luokka... 6 Ottelu-luokka... 6 Lue-luokka... 6 Valikot-luokka... 7 Muutosohjeet... 7 Testaus... 8 Liitteet... 14 Liite 1: Tehtäväpaperi... 14 Liite 2: Projektisuunnitelma... 15 Liite 3: Ohjelmalistaus... 18 Valikot.java:... 18 Joukkue.java:... 30 Lue.java:... 35 Sarja.java:... 39 Tiedostot.java:... 43

Tehtävän määrittely ja ratkaisuperiaate Tehtävän määrittely Tehtävänä oli tehdä ohjelma, joka ylläpitää jääkiekkosarjan tulostaulukkoa kunkin pelikierroksen jälkeen. Pelikierrosten ei kuitenkaan välttämättä tarvitse olla täysiä kierroksia. Lisäksi piti tehdä ohjelma, jolla pystyy tarvittaessa korjaamaan aikaisemmin virheellisesti syötettyjä tietoja. Ohjelman pitää pystyä myös tulostamaan joukkueittain paremmuusjärjestyksessä oleva sarjataulukko. Ratkaisuperiaate Tehtävä on ratkaistu kokoamalla ohjelma useista osista (luokista) jotka kukin hoitavat omat osansa ja toimintonsa mahdollistaen tehtävän annossa määritellyt asiat. Esimerkiksi yksi ohjelman osista on nimeltään "Joukkue" ja se huolehtii kaikista joukkuetta koskevista tiedoista ja niiden tietojen käsittelystä. Näitä eri ohjelman osia käsitellään enemmän osiossa "Ohjelman rakenne". Ohjelman käyttöohje Syötteet ja tulosteet Kaikki ohjelman tarvitsemat syötteet syötetään ajon aikana, eli ohjelma ei tarvitse toimiakseen komentoriviparametreina annettavia syötteitä. Kaikkien syötteiden syöttö tapahtuu silloin kun ohjelma niitä pyytää. Syöte kirjoitetaan komentoriville ja painetaan enter näppäintä. Malliajo: Tervetuloa kayttamaan jaakiekkosarjan tulostaulukon yllapitoohjelmaa. -------------------------------------------------------------------- Paavalikko -------------------------------------------------------------- ------------------------------------------------- Jatka aikaisemman sarjataulukon kasittelya: 1 Aloita uuden sarjataulukon yllapito: 2 Lopeta: 0 ------------------------------------------------- Valintasi: 2 -------------------------------------------------------------------- Uuden sarjataulukon luonti -------------------------------------------------------------- Montako joukkuetta osallistuu: 3 Anna 1. joukkueen nimi: testijoukkue1 1

Anna 2. joukkueen nimi: testijoukkue2 Anna 3. joukkueen nimi: testijoukkue3 Tallennetaanko tiedot? (k/e): k Anna tiedoston johon tiedot tallennetaan nimi (esim. sarja2010): testisarja Tiedostonimi on vapaa. Tallennetaan. Valintasi: 0 ------------------------------------------------- Syota seuraava(1.) kierros: 1 Paavalikko: 0 ------------------------------------------------- -------------------------------------------------------------------- Paavalikko -------------------------------------------------------------- ------------------------------------------------- Jatka aikaisemman sarjataulukon kasittelya: 1 Aloita uuden sarjataulukon yllapito: 2 Lopeta: 0 ------------------------------------------------- Valintasi: 0 Ohjelman suoritus loppui. Ohjelman toiminta on malliajon kaltaista koko ajan. Ohjelma huolehtii siitä, ettei käyttäjä syötä tietoja jotka eivät ole ohjelmalle kelpaavia. Ohjelman sisältämät tarkastukset ja virheilmoitukset Jokaisen ohjelmalle annetun lukusyötteen oikeellisuus tarkistetaan ja tarvittaessa syötteestä annetaan virheilmoitus ja pyydetään uutta syötettä. Merkkijono syötteitä ei sen sijaan ohjelmassa tarkisteta muulloin kuin tietojen tallennusta tai latausta suoritettaessa. Ohjelma tarkistaa näissä tapauksissa, että onko syötteenä annetun merkkijonon ja ohjelman lisäämän tiedostopäätteen nimistä tiedostoa olemassa. Jokaisesta lukusyötteestä tarkistetaan, että se todellakin on luku. Ohjelman kaikkien lukusyötteiden pitää myös olla kokonaislukuja. Tämän jälkeen tarkistetaan vielä että sen arvo on vähintään 0 ja enintään 1000. Lisäksi ohjelmassa voidaan tarkistaa, että syöte on muuten ohjelman suoritukselle kelpaava, eli esimerkiksi valikoissa naivigoitaessa hyväksytään vain ohjelman tarjoamia syötevaihtoehtoja. Ohjelman rajoitukset Ohjelman syötteitä on rajoitettu niin, että käyttäjä voisi ohjelman käytön kannalta antaa vain suhteellisen järkeviä syötteitä, vaikka lukusyötteiden yläraja on asetettu silti suhteellisen suureksi. 2

Ohjelman merkkijono syötteiden pituutta ei ole rajoitettu, vaan kaikki rajoitukset koskevat luku syötteitä. Kaikkien ohjelmaan syötettävien lukujen tulee olla joko yhtäsuuria tai suurempia kuin 0 ja suurin mahdollinen syötettävä luku on 1000. Lukusyötteiden koko on rajoitettu tuhanteen koska oletetusti ohjelmalla ei tarvita syöttää lähellekkään näin suuria lukuja. Tällä karsitaan mahdollisia virhesyötteitä. Valikoissa syötteet on kuitenkin rajoitettu juuri niiksi vaihtoehdoiksi joita ohjelma tarjoaa. Ajo-ohje Ohjelman lähdekoodi löytyy osoitteesta: cs.joensuu.fi/~mlaamane/ohjelmointityo/ Ohjelman api löytyy osoitteesta: cs.joensuu.fi/~mlaamane/ohjelmointityo/api/ Ohjelman kääntäminen lähdekoodista toiminnalliseen versioon tapahtuu antamalla komentorivillä komento: javac Valikot.java Valikot.java sisältää ohjelman pääohjelman ja sen kääntäminen kääntää myös muut ohjelman osat. Kun ohjelma on käännetty, sen voi suorittaa komentorivillä komennolla: java Valikot Ohjelman toimintaan ei tarvita parametrisyötteitä. Ohjelman toiminta Tietorakenteet Joukkue-luokka Luokassa käytetään linkitettyä listaa joukkue-olion pelaamien otteluiden tallentamiseen. Tiedostot-luokka Luokan metodit käsittelevät eli lataavat ja tallentavat olioita tiedostoihin ja tiedostoista oliotaulukkoina. Sarja-luokka Luokassa käytetään oliotaulukkoa sarjaan kuuluvien joukkueiden eli Joukkue-olioiden tallentamiseen. Sarja-luokka käyttää myös linkitettyä listaa kaikkien sarjassa pelattujen otteluiden eli Ottelu-olioiden tallentamiseen. Loput ohjelmassa käytettävistä tiedoista käsitellään lukuisissa paikallismuuttujissa. Ohjelman rakennet Ohjelma koostuu kuudesta luokasta jotka ja joiden tehtävät ovat: 3

Ottelu-luokasta luotu olio pitää sisällään tiedot kyseiseen otteluun osallistuneista joukkueista, sen aikana tehdyistä maaleista ja kierroksesta jonka aikana ottelu on pelattu. Sarja-luokasta luotu olio sisältää tiedon sarjaan osallistuvista joukkueista, jo pelatuista otteluista ja kierroksista, sekä tiedoston nimen johon sarja on mahdollisesti tallennettu. Tiedostot-luokan tarkoituksena on staattisesti tallentaa sarjoja tiedostoihin ja myös ladata jo aikaisemmin tallennettuja sarjoja. Joukkue-luokasta luotu olio sisältää tiedot yhdestä sarjaan osallistuvasta joukkueesta. Joukkueen tietoja ovat sen nimi, pelatut ottelut, otteluiden lukumäärä, voittojen-, tappioiden-, ja tasapelien lukumäärä, sekä tehtyjen- ja päästettyjen maalien lukumäärä. Näiden lisäksi joukkue olio sisältää myös joukkueen saamat pisteet eli sijoituksen sarjassa. Lue-luokka sisältää staattiset metodit lukujen sekä tekstin lukemiseen käyttäjältä. Lukujen lukemisessa varmistetaan syötteen olevan luku ja pyydetään käyttäjältä uutta lukua virheellisen syötteen sattuessa. Valikot-luokka sisältää toiminnot käyttäjän kanssa kommunikoimiseen. Luokka tulostaa kaikki valikot ja huolehtii syötteiden vastaan ottamisesta ja käsittelystä. Luokat, tietojäsenet ja metodit Joukkue-luokka Luokan attribuutit: private String nimi joukkueen nimi. private LinkedList<Ottelu> ottelut joukkueen pelaamat ottelut. private int ottelutlkm joukkueen pelaamien otteluiden lukumäärä. private int voitot joukkueen voittamien otteluiden lukumäärä. private int tasapelit joukkueen pelaamien otteluiden lukumäärä jotka ovat päättyneet tasapeliin. private int haviot joukkueen häviämien otteluiden lukumäärä. private int tehdytmaalit joukkueen tekemien maalien lukumäärä. private int paastetytmaalit joukkueen päästämien maalien lukumäärä. private int pisteet joukkueen pisteet sarjassa. Luokan metodit: public void paivitajoukkue()-metodi käy läpi kaikki joukkueen pelaamat pelit ja niiden pohjalta päivittää joukkueen tiedot, jotka ovat riippuvaisia pelatuista peleistä (esim. voitot ja häviöt). public boolean jopelattu(string joukkue, int kierros)-metodi tarkistaa, että onko joukkue pelannut jo ottelun parametrina annettua joukkuetta vastaan parametrina annettuna kierroksena. public String getnimi()-metodi joka palauttaa joukkueen nimen. public LinkedList<Ottelu> getottelut()-metodi joka palauttaa linkitetyn listan joukkueen jo pelaamista otteluista. public void tulostaottelut()-metodi joka tulostaa joukkueen pelaamat ottelut. 4

public int getottelutlkm()-metodi joka palauttaa joukkueen pelaamien otteluiden lukumäärän. public int getvoitot()-metodi joka palauttaa joukkueen voittojen lukumäärän. public int gethaviot()-metodi joka palauttaa joukkueen häviöiden lukumäärän. public int gettehdytmaalit()-metodi joka palauttaa joukkueen tekemien maalien lukumäärän. public int getpaastetytmaalit()-metodi joka palauttaa joukkueen päästämien maalien lukumäärän. public int getpisteet()-metodi joka palauttaa joukkueen pistemäärän. public String tostring()-metodi joka palauttaa joukkueen tiedot merkkijonoon kerättynä. Sarja-luokka Luokan attribuutit: private Joukkue[] joukkueet sarjaan osallistuvat joukkueet. private LinkedList<Ottelu> ottelut sarjassa pelatut ottelut. private String tiedosto tiedoston, johon sarjan tiedot on tallennettu, nimi. private int kierrokset sarjassa pelattujen kierrosten lukumäärä. Luokan metodit: public void lisaaottelu(ottelu ottelu)-metodi joka lisää parametrina syötetyn ottelun sarjan tietoihin. public void korjaaottelu(string joukkue1, String joukkue2, int kierros)-metodi tietyn ottelun korjaamiseen. Jos parametreina annettujen tietojen mukainen ottelu löytyy sarjasta, metodi poistaa sen ja aloittaa kyseisien tietojen pohjalta uuden ottelun syötön. public Ottelu getottelu(string joukkue1, String joukkue2, int kierros)-metodi joka hakee sarjasta ottelun joka tästää metodin saamiin parametreihin. public void Lajittele()-metodi joka lajittelee sarjan joukkueet paremmusjärjestykseen eli niin että eniten pisteitä omaava joukkue on ensimmäisenä. public void settiedosto(string tiedosto)- metodi asettaa sarjan tallennustiedoston nimeksi parametrina saamansa merkkijonon. public String gettiedosto()-metodi palauttaa tiedoston nimen johon sarja on tallennettu. public void setkierrokset(int kierros)-metodi joka asettaa parametrinaan saamansa kokonaisluvun sarjassa menneellään olevan kierroksen arvoksi. public int getkierrokset()-metodi palauttaa sarjassa menneillään olevan kierroksen. public Joukkue[] getjoukkueet()-metodi joka palauttaa taulukkona sarjaan osallistuvat joukkueet. public int joukkueetlkm()-metodi joka palauttaa sarjaan osallistuvien joukkueiden lukumäärän. public boolean joukkueloytyy(string joukkue)-metodi palauttaa tiedon siitä, että osallistuuko metodille parametrina annetun merkkijonon niminen joukkue sarjaan. public void tulostaottelut()-metodi joka tulosaa muotoillusti kaikki sarjassa pelatut ottelut. public void tulostasarja()-metodi tulostaa muotoillusti sarjataulukon. 5

Tiedostot-luokka Luokan attribuutit: Ei attribuutteja. Luokan metodit: public static boolean tallennus(sarja[] sarja)-staattinen metodi joka tallentaa sarjan tiedostoon joka käy ilmi sarjan sisältämistä tiedoista. public static boolean tallennus(sarja[] sarja, String tiedosto)-staattinen metodi joka tallentaa sarjan tiedostoon jonka nimi on annettu metodille parametrina. public static Sarja[] lataus(string tiedosto) throws Exception-staattinen metodi joka lataa sarjan tiedostosta jonka nimen metodi on saanut parametrinaan. Ottelu-luokka Luokan attribuutit: private Joukkue joukkue1 toinen otteluun osallistuvista joukkueista. private Joukkue joukkue2 toinen otteluun osallistuvista joukkueista. private Joukkue tasapeli tasapeli niminen joukkue joka palautetaan jos ottelu on päättynyt tasapeliin. private int j1maalit toisen joukkueen maalien lukumäärä. private int j2maalit toisen joukkueen maalien lukumäärä. private int kierros kierros jolla ottelu on pelattu. Luokan metodit: public Joukkue voittaja()-metodi joka palauttaa ottelun voittaneen joukkueen. public Joukkue getjoukkue1()-metodi joka palauttaa toisen ottelussa pelanneista joukkueista. public Joukkue getjoukkue2()-metodi joka palauttaa toisen ottelussa pelanneista joukkueista. public int getjoukkue1maalit()-metodi joka palauttaa toisen ottelussa pelanneen joukkueen ottelussa tekemät maalit. public int getjoukkue2maalit()-metodi joka palauttaa toisen ottelussa pelanneen joukkueen ottelussa tekemät maalit. public int getkierros()-metodi joka palauttaa kierroksen jolla ottelu on pelattu. public void tulostaottelu()-metodi joka tulostaa ottelun tiedot muotoillusti. Lue-luokka Luokan attribuutit: static Scanner skanneri Scanner-olio jonka avulla syötteitä luetaan komentoriviltä. Luokan metodit: public static String string()-metodi lukee käyttäjältä merkkijonon ja palauttaa sen sellaisenaan. public static int integer()-metodi lukee käyttäjältä merkkijonon josta se sitten yrittää parsia kokonaisluvun. Jos merkkijonosta saadaan kokonaisluku, palautetaan se 6

samantien. Jos merkkijonon parsiminen epäonnistuu, metodi kutsuu itseään rekursiivisesti kunnes käyttäjä antaa oikeanlaisen syötteen. Valikot-luokka Luokan attribuutit: private static Sarja sarja käsiteltävä Sarja-olio. private static Ottelu ottelu käsiteltävä Ottelu-olio. private static boolean tallennettu tieto siitä, että onko luotu sarja jo tallennettu. Luokan metodit: public static void paavalikko()-metodi piirtää päävalikon ja kutsuu valinta-metodia jossa suoritetaan valikolle sopivat kyselyt. public static int valikko1()-metodi piirtää valikon vanhan sarjataulukon lataamista varten ja kutsuu valinta-metodia jossa suoritetaan valikolle sopivat kyselyt. public static int valikko2()-metod piirtää uuden sarjataulukon luomiseen sopivan valikon ja kutsuu valinta-metodia jossa suoritetaan valikolle sopivat kyselyt. public static int valinta(int valinta)-metodi joka tuottaa parametrista riippuen erilaisia kyselyjä käyttäjälle ja jatkaa ohjelman suoritusta käyttäjän antamien syötteiden perusteella. public static void kierros(int kierros)-metodi joka pyytää käyttäjää syöttämään yhden kokonaisen kierroksen peli kerrallaan. public static void sarjantallennus(sarja sarja)-metodi joka käynnistää käsiteltävän sarjan tallennuksen. Tarvittaessa kysyy käyttäjältä tiedoston nimen johon sarja halutaan tallentaa. public static void ottelunsyotto()-metodi tuottaa yhden ottelun syöttämiseen tarkoitetun valikon jossa kaikki tarvittavat tiedot kysellään käyttäjältä. public static void ottelunsyotto(string nimi1, String nimi2, int kierros)-metodi tuottaa valikon jossa parametreina saatujen tietojen pohjalta luotuun otteluun kysellään käyttäjältä maalien määrät. public static void ottelunkorjaus()-metodi joka tuottaa ottelun korjaukseen tarvittavan valikon jossa kaikki tarvittavat tiedot kysellään käyttäjältä. public static void etsiottelu()-metodi tuottaa valikon jossa ottelun tunnistetiedot kysellään käyttäjältä ja sen jälkeen ottelun muut tiedot tulostetaan jos kyseinen ottelu käsiteltävästä sarjasta löytyy. public static void tulostakeskelle(string s)-metodi joka tulostaa parametrina saamansa merkkijonon keskitetysti Windowsin komentokehotteessa. public static void tulostaviiva()-metodi joka tulostaa 80 merkkiä pitkän viivan. public static void tulostaviiva(int pituus)-metodi joka tulostaa parametrinaan saamansa kokonaisluvun mittaisen viivan. public static String getviiva(int pituus)-metodi joka palauttaa parametrinaan saamansa kokonaisluvun mittaisen merkkijonon joka koostuu viiva-merkeistä ('-'). public static void main(string[] args)-metodi joka käynnistää koko ohjelman suorituksen. Tulostaa tervehdysviestin ja kutsuu paavalikko()-metodia. Muutosohjeet Ohjelma on harjoitustyö, eikä sitä ole tarkoitettu muutettavaksi. 7

Testaus Testeissä on pyritty suorittamaan kaikki ohjelman koodit vähintään kerrran. Osa ohjelman osista käydään testeissä kuitenkin useita kertoja läpi. Päävalikko Testin tarkoitus: Odotettu tulos: Saatu tulos: Testataan valikon toimintaa syötteellä 1 Siirrytään valikkoon jossa voidaan suorittaa aikaisemman sarjataulukon käsittelyä. Testataan valikon toimintaa syötteellä 2 Testataan valikon toimintaa syötteellä 0 Testataan jotain muuta syötettä kuin mitä ohjelma antaa vaihtoehdoiksi. Syöte: 3 Testataan jotain muuta syötettä kuin mitä ohjelma antaa vaihtoehdoiksi. Syöte A Siirrytään valikkoon jossa voidaan aloittaa uuden sarjataulukon ylläpito. Ohjelman suoritus lopetetaan. Ohjelma antaa ilmoituksen virheellisestä syötteestä ja pyytää syötettä uudelleen. Ohjelma antaa ilmoituksen virheellisestä syötteestä ja pyytää syötettä uudelleen. Uuden sarjataulukon luonti valikko, osallistuvien joukkueiden määrä. Testin tarkoitus: Odotettu tulos: Saatu tulos: Annetaan syötteeksi negatiivinen luku, jotta nähdään kuinka ohjelma reagoi epäloogiseen syötteeseen. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää syöttämään syötteen uudelleen. Annetaan syötteeksi merkkijono, ei siis lukua kuten ohjelma tarvitsee. Syöte: Aaa3 Annetaan syötteeksi kokonaisluku, jonka pitäisi olla ohjelmalle kelpaava syöte. Syöte 1 Annetaan syötteeksi kokonaisluku, jonka pitäisi olla ohjelmalle kelpaava syöte. Syöte 2 Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää syöttämään syötteen uudelleen. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää syöttämään syötteen uudelleen, koska sarjaan täytyy osallistua vähintään kaksi joukkuetta. Syöte on oikeanlainen, joten siirrytään ohjelman suorituksessa eteenpäin. Uuden sarjataulukon luonti valikko, osallistuvien joukkueiden nimet. Testin tarkoitus: Odotettu tulos: Saatu tulos: Annetaan syötteeksi Siirrytään kysymään seuraavan mikätahansa merkkijono. Syöte: joukkueen nimeä kunnes kaikki 8

joukkue1 joukkueet on nimetty. Tämän jälkeen siirrytään ohjelman suorituksessa eteenpäin. Uuden sarjataulukon luonti valikko, kysely että halutaanko syötetyt tiedot tallentaa. Testin tarkoitus: Odotettu tulos: Saatu tulos: Ohjelma tarjoaa syötteeksi Ohjelma kysyy tiedostolle kahta vaihtoehtoa joko k tai e. Syötteeksi annetaan k. nimeä johon tiedot halutaan tallentaa. Syötteeksi annetaan e. Siirrytään ohjelman suorituksessa eteenpäin Annetaan jokin muu kuin ohjelman antama syötevaihtoehto. Syöte: a. tallentamatta valittuja tietoja. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää uutta syötettä. Uuden sarjataulukon luonti valikko, syötettyjen tietojen tallennus. Testin tarkoitus: Odotettu tulos: Saatu tulos: Annetaan ohjelmalle jokin tiedoston nimi jonka tiedetään olevan vapaana. Syöte: testitallennus Tiedoston tallennus onnistuu ja ohjelman suorituksessa siirrytään eteenpäin. Annetaan ohjelmalle jokin tiedoston nimi jonka tiedetään olevan varattu. Syöte: varattunimi Ohjelma ilmoittaa, että annetun niminen tiedosto on jo olemassa ja kysyy, että halutaanko sen yli kirjoittaa. Uuden sarjataulukon luonti valikko, syötettyjen tietojen tallennus, tiedoston ylikirjoitus kysymys. Testin tarkoitus: Odotettu tulos: Saatu tulos: Annetaan syötteeksi ohjelman Tiedoston yli kirjoitetaan ja antamista syötteistä ( k tai e ) syöte: k ohjelman suoritusta jatketaan Syöte: e Tiedoston yli ei kirjoiteta ja ohjelma pyytää uutta tiedoston nimeä johon tiedot voidaan tallentaa. Annetaan syötteeksi jokin muu kuin ohjelman antama syötevaihtoehto. Syöte 10 Ohjelma jatkaa kysymyksen kysymistä kunnes käyttäjä antaa jommankumman annetuista syötevaihtoehdoista. Uuden sarjataulukon luonti valikko, seuraavaksi tehtävä asia(paluu päävalikkoon tai seuraavan kierroksen syöttäminen). 9

Testin tarkoitus: Odotettu tulos: Saatu tulos: Testataan valikon toimintaa syöttämällä jokin muu syöte kuin ehdotettu(1 tai 0) syötevaihtoehto. Syöte: B Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää syötettä uudelleen. Annetaan oikeanlainen syöte. Syöte: 1 Annetaan oikeanlainen syöte. Syöte: 0 Siirrytään valikkoon jossa syötetään seuraavan kierroksen tiedot peli kerrallaan. Siirrytään päävalikkoon. Uuden sarjataulukon luonti valikko, seuraavan kierroksen syöttäminen. Testin tarkoitus: Odotettu tulos: Saatu tulos: Annetaan syötteeksi positiivisia kokonaislukuja. Kokeilu syöte: 1 Ohjelma kysyy kierroksen kaikkien pelien tulokset ja siirtyy suorituksessa eteenpäin. Annetaan syötteeksi jokin syöte joka ei voi olla tehtyjen maalien määrä, kuten A3 Annetaan syötteeksi vielä jokin toinen syöte joka ei voi olla tehtyjen maalien määrä, kuten -3 Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää syötettä uudestaan. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää syötettä uudestaan. Kunkin syötetyn kierroksen jälkeen ohjelma tulostaa sarjataulukon ja tämän jälkeen kysyy, että haluaako käyttäjä tallentaa syötetyt tiedot. Tallennus kysely on sama kuin jo aikaisemmin testattu tallennus (syöte: k tai e ). Tämän jälkeen kysytään, että mitä seuraavaksi halutaan tehdä. Tämä on sama valikko kuin jo aikaisemmin testattu valikko. Viimeistään kun kaikki kierrokset on syötetty, palataan päävalikkoon. Aikaisemman sarjataulukon käsittelyn jatkaminen, tiedoston nimen kysely. Testin tarkoitus: Odotettu tulos: Saatu tulos: Annetaan tiedoston nimi jonka tiedetään sisältävän aikaisemmin tallennettuja tietoja. Ohjelma lataa tiedostosta aikaisemman sarjataulukon ja tulostaa sen tiedot. Tämän jälkeen tulostetaan valikko jossa kysytään, että mitä sarjataulukolle halutaan tehdä. Annetaan tiedoston nimi jonka tiedetään oikeasti puuttuvan. Annetaan syötteeksi 0. Joka on syöte jonka ohjelma ilmoittaa peruuttavan toiminnon. Ilmoitetaan, että kyseisen nimistä tiedostoa ei löytynyt ja pyydetään käyttäjää syöttämään tiedoston nimi uudelleen. Vanhan sarjataulukon lataus peruutetaan ja palataan päävalikkoon. 10

Aikaisemman sarjataulukon käsittelyn jatkaminen, kun tiedot on ladattu. Testin tarkoitus: Odotettu tulos: Saatu tulos: Testataan valikon toimintaa Tulostaa sarjan tilanteen ja syötteellä: 1 palaa takaisin samaan Testataan valikon toimintaa syötteellä: 2 Testataan valikon toimintaa syötteellä: 3 Testataan valikon toimintaa syötteellä: 4 Testataan valikon toimintaa syötteellä: 5 Testataan valikon toimintaa syötteellä: 0 Testataan valikon toimintaa syötteellä: C (ei kuulu ohjelman antamiin vaihtoehtoihin) Testataan valikon toimintaa syötteellä: -1 (ei kuulu ohjelman antamiin vaihtoehtoihin) valikkoon. Tulostaa kaikki sarjan ottelut niin että yhden joukkueen pelit näytetään kerrallaan. Palaa tulostuken jälkeen samaan valikkoon. Siirtyy kyselemään etsittävän ottelun tietoja, eli ottelun joukkueiden nimiä ja kierrosta jolla ottelu on pelattu. Jos ottelu löytyy, ohjelma tulostaa sen tiedot. Lopuksi ohjelma palaa takaisin samaan valikkoon. Siirtyy ottelun korjaus osioon jossa ohjelma kyselee halutun ottelun tiedot ja sen jälkeen tulostaa nykyiset tiedot. Tämän jälkeen ohjelman tulisi aloittaa uusien tietojen kysely käyttäjältä. Ohjelma tallentaa sarjan tiedot, oli niitä muutettu tai ei. Ohjelma myös ilmoittaa, että onnistuiko tallennus vai ei. Siirrytään takaisin päävalikkoon. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää uutta syötettä. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää uutta syötettä. Aikaisemman sarjataulukon käsittelyn jatkaminen, tietyn ottelun etsiminen joko tulostusta tai korjausta varten. Testin tarkoitus: Odotettu tulos: Saatu tulos: Testataan ohjelman toimintaa kun sille annetaan jokin joukkueen nimi joka ei kuulu käsiteltävään sarjaan. Syöte: Ohjelma ilmoittaa, että kyseisen nimistä joukkuetta ei löydy sarjasta ja pyytää käyttäjää syöttämään joukkueen nimen 11

joukkue4 kun sarjan joukkueet ovat joukkue1, joukkue2, joukkue3 Syötetään ohjelmalle joukkueen nimi jonka tiedetään osallistuvan kyseiseen sarjaan. Syöte: joukkue1 kun sarjan joukkueet ovat joukkue1, joukkue2, joukkue3 Testataan ohjelman toimintaa syötettäessä ottelun kierrosta. Syötteeksi annetaan positiivinen luku. Syöte: 1 Testataan ohjelman toimintaa syötettäessä ottelun kierrosta. Syötteeksi annetaan negatiivinen luku. Syöte: -1 Testataan ohjelman toimintaa syötettäessä ottelun kierrosta. Syötteeksi annetaan jotakin muuta kuin kokonaisluku. Syöte: D uudelleen. Kyselyä jatketaan kunnes ottelun molempiin joukkueisiin on saatu sarjassa olevien joukkueiden nimet. Ohjelma siirtyy suorituksessa eteenpäin eli kysyy toisen joukkueen nimeä ja sen saatuaan kysyy kierrosta jolla ottelu on pelattu. Ohjelma hakee syötettyjen tietojen mukaisen ottelun ja tulostaa sen. Jos ottelua ei löydy siitä ilmoitetaan käyttäjälle ja siirrytään takaisin valikkoon josta ottelun haku on käynnistetty. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää käyttäjältä uutta syötettä. Ohjelma ilmoittaa virheellisestä syötteestä ja pyytää käyttäjältä uutta syötettä. Jos ladattuun sarjataulukkoon ei vielä ole tallennettu kaikkia sarjan kierroksia tai otteluja, on aikaisemman sarjataulukon käsittelyvalikko hiukan erilainen. Siinä on silloin kaksi ylimääräistä valikon kohtaa: 1. Syota seuraava(x.) kierros ja 2. Syota ottelu. Näiden jälkeen tulee jo aikaisemmin testatut kohdat: 3. Tulosta sarjan tilanne, 4. Tulosta kaikki ottelut, 5. Etsi yksi ottelu, 6. Korjaa ottelu, 7. Tallenna ja 0. Paavalikko. Testin tarkoitus: Odotettu tulos: Saatu tulos: Testataan valikon toimintaa antamalla syötteeksi 1 Ohjelma siirtyy osioon jossa syötetään kokonainen kierros kerrallaan, jonka toiminnallisuus on jo testattu ylempänä. Testataan valikon toimintaa antamalla syötteeksi 2 Testataan valikon toimintaa antamalla syötteeksi jokin muu syöte kuin ohjelman vaihtoehdoiksi antama. Syöte: 8 Testataan valikon toimintaa antamalla syötteeksi jokin muu Ohjelma siirtyy osioon jossa kysytään käyttäjältä syötettävän ottelun tiedot. Sama toiminnallisuus on testattu jo aikaisemmin. Ohjelma ilmoittaa, että syötteen tulee olla väliltä 0-7 ja pyytää syötettä uudestaan. Ohjelma ilmoittaa syötteen olevan virheellinen ja pyytää 12

syöte kuin ohjelman vaihtoehdoiksi antama. Syöte: E käyttäjältä uutta syötettä. 13

Liitteet Liite 1: Tehtäväpaperi Ohjelmointi 3 Tee ohjelma, joka ylläpitää jääkiekkosarjan tulostaulukkoa kunkin (ei välttämättä täyden) pelikierroksen jälkeen. Tee lisäksi ohjelma, jolla on mahdollista korjata virheet jotka edellisten kierrosten tuloksien kirjoituksessa on syntynyt. Ohjelmalla on voitava tulostaa joukkueittain paremmuusjärjestyksessä oleva sarjataulukko. 14

Liite 2: Projektisuunnitelma 15

16

17

Liite 3: Ohjelmalistaus Valikot.java: import java.io.; / Pääohjelma joka huolehtii valikoiden toiminnasta ja toimintojen toteutuksesta. Suurin osa ohjelman tulostuksista suoritetaan ja muotoillaan tässä luokassa. @author Mikko Laamanen @version v1.0 / public class Valikot { private static Sarja sarja; private static Ottelu ottelu; private static boolean tallennettu = false; / Piirtää päävalikon ja kutsuu valinta-metodia jossa kysytään, että mitä tehdään seuraavaksi. / public static void paavalikko(){ int syote = 0; int val; boolean onnistui = false; int paluuarvo = 10; do { System.out.println(""); tulostaviiva(); tulostakeskelle("paavalikko\n"); tulostaviiva(); val = valinta(0); while (val!= 0); / Piirtää valikon jossa ladataan vanha sarjataulukko. Kutsuu valinta-metodia jossa kysytään, että mitä tehdään seuraavaksi. @return Palauttaa aina 0, tämä tarvitaan vain ohjelman suorituksen kontrollointiin. / public static int valikko1() { String tiedosto; Sarja[] sarjataul; int val = 0; 18

boolean onnistui = false; tulostaviiva(); tulostakeskelle("vanhan sarjataulukon lataus\n"); tulostaviiva(); System.out.print("Anna aikaisemman sarjataulukon sisaltavan tiedoston nimi (peruuta: 0): "); tiedosto = Lue.string(); do { try { tiedosto = tiedosto + ".dat"; sarjataul = Tiedostot.lataus(tiedosto); sarja = sarjataul[0]; onnistui = true; sarja.tulostasarja(); catch ( Exception e) { if(tiedosto.equals("0.dat")) return 0; System.out.println("Tiedostoa ei loytynyt!\n"); System.out.print("Anna tiedoston nimi uudelleen: "); tiedosto = Lue.string(); System.out.println(""); while (!onnistui); do { if (sarja.getkierrokset() == 3) val = valinta(1); else if (sarja.getkierrokset() < 3) val = valinta(3); while (val!= 0); return 0; / Piirtää valikon jossa luodaan uusi sarjataulukko. Kutsuu valinta-metodia jossa kysytään, että mitä tehdään seuraavaksi. @return Palauttaa aina 0, tämä tarvitaan vain ohjelman suorituksen kontrollointiin. / public static int valikko2() { int kappaletta; String syote; String tiedosto; boolean tallennusonnistui; 19

tulostaviiva(); tulostakeskelle("uuden sarjataulukon luonti\n"); tulostaviiva(); do { System.out.print("Montako joukkuetta osallistuu: "); kappaletta = Lue.integer(); System.out.println(""); kaksi.\n"); while ( kappaletta < 2 ); if ( kappaletta == 0 ) { Lue.string(); return 0; else if ( kappaletta < 2 ) { System.out.println("Joukkueita tulee olla vahintaan Joukkue[] joukkueet = new Joukkue[kappaletta]; for ( int i = 0; i < kappaletta; i++) { String nimi; System.out.print("Anna " + (i+1) + ". joukkueen nimi: "); nimi = Lue.string(); joukkueet[i] = new Joukkue(nimi); sarja = new Sarja(joukkueet); Sarja[] sarjataul = new Sarja[1]; sarjataul[0] = sarja; do { System.out.print("\nTallennetaanko tiedot? (k/e): "); syote = Lue.string(); System.out.println(""); if(syote.equals("k") syote.equals("e")) { if (syote.equals("k")) { sarjantallennus(sarja); else { tallennettu = false; else { System.out.println("Syotteen tulee olla joko 'k' tai 'e'!"); while (!(syote.equals("k") syote.equals("e"))); if (valinta(2) == 1) kierros(1); 20

if(sarja.getkierrokset() == 1) if (valinta(2) == 1) kierros(2); if(sarja.getkierrokset() == 2) if (valinta(2) == 1) kierros(3); if(sarja.getkierrokset() == 3) System.out.println("Kaikki kierrokset syotetty, palataan paavalikkoon."); return 0; / Piirtää erilaisia valintavalikkoja. @param valinta Haluttu valintavalikko @return Palauttaa tiedon valitusta valinnasta / public static int valinta(int valinta) { int syote = 0; if(valinta == 0) { // kutsuttu päävalikosta tulostakeskelle(getviiva(50)); tulostakeskelle(string.format("%-49s", "Jatka aikaisemman sarjataulukon kasittelya: ")+"1"); tulostakeskelle(string.format("%-49s", "Aloita uuden sarjataulukon yllapito: ")+"2"); tulostakeskelle(string.format("%-49s", "Lopeta: ")+"0"); tulostakeskelle(getviiva(50)); System.out.print("\n\nValintasi: "); do { syote = Lue.integer(); if(syote < 0 syote > 2) System.out.print("Syotteen tulee olla luku valilla 0-2.\nAnna valintasi uudelleen: "); while(syote < 0 syote > 2); if ( syote == 1 ) { valikko1(); else if ( syote == 2 ) { valikko2(); else if(valinta == 1) { // kutsuttu valikosta jossa käsitellään vanhaa sarjataulukkoa tulostakeskelle(getviiva(50)); tulostakeskelle(string.format("%-49s", "Tulosta sarjan tilanne: ")+"1"); 21