(Siirry takaisin harjoitustyön pääsivulle.)
Tämän harjoitustyön aineistona on tiedosto, joka sisältää tietoa seuraavassa muodossa (alla oleva on esimerkki).
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2
Tiedoston jokainen rivi sisältää tiedon janan päätepisteistä muodossa x1,y1 -> x2,y2, missä x1,y1 on janan toinen päätepiste ja x2,y2 on toinen päätepiste. Jana sisältää kuitenkin myös kaikki päätepisteiden väliin jäävät pisteet. Esimerkiksi:
1,1 -> 1,3 on jana, joka sisältää pisteet 1,1, 1,2, ja 1,3.9,7 -> 7,7 on jana, joka sisältää pisteet 9,7, 8,7, ja 7,7.Keskitytään tässä osassa vain vaaka- ja pystysuuntaisiin janoihin: ts. janoihin, joissa x1=x2 tai y1=y2.
Yllä oleva esimerkki tuottaisi meille seuraavan näköisen kuvion:
.......1..
..1....1..
..1....1..
.......1..
.112111211
..........
..........
..........
..........
222111....
Tässä kuviossa vasemman yläreunan koordinaatti on 0,0 ja oikean alareunan koordinaatti on 9,9. Taulukon kussakin kertoo janojen lukumäärän, jotka sisältävät kyseisen pisteen; ts. kuinka monta janaa on päällekkäin kyseisessä pisteessä. Piste-merkillä merkitään niitä sijainteja joihin yksikään jana ei osunut.
Esimerkiksi vasemmalla ylhäällä oleva ykköspari tulee janasta 2,2 -> 2,1, kun aivan alin rivi on janojen 0,9 -> 5,9 sekä 0,9 -> 2,9 seurausta.
Tavoitteena on selvittää, kuinka monessa pisteessä on vähintään kaksi janaa päällekkäin. Yllä olevassa esimerkissä näitä pisteitä on 5 kappaletta.
Tee ohjelma, joka laskee, kuinka monessa pisteessä vähintään kaksi janaa.
Huomaa, että aineistossa on muitakin kuin vain vaaka- tai pystysuuntaisia.
Lataa aineisto tästä: janat.txt
Seuraavaksi, ota vaaka- ja pystyjanojen lisäksi huomioon myös vinoviivat.
1,1 -> 3,3 kattaa pisteet 1,1, 2,2, ja 3,3.9,7 -> 7,9 kattaa pisteet 9,7, 8,8, ja 7,9.Huomioiden kaikki yllä olevassa esimerkissä olevat janat saadaan seuraava kuvio.
1.1....11.
.111...2..
..2.1.111.
...1.2.2..
.112313211
...1.2....
..1...1...
.1.....1..
1.......1.
222111....
Edelleen, tavoitteena on tutkia ne pisteet, joissa vähintään kaksi janaa on päällekkäin. Esimerkissämme näin on 12 pisteen kohdalla.
Tee ohjelma, joka laskee, kuinka monessa pisteessä vähintään kaksi janaa.
Osa 1: 234
Osa 2: 4321
Työ tallennetaan versiohallintaan kuten mikä tahansa harjoitustyö.
Kaikki "tavalliset" harjoitustyön vaatimukset (nimeäminen, koodauskäytänteet, jne.) pätevät myös tässä harjoitustyössä.
Työ on hyväksytettävä ohjaajalla. Ohjaaja voi antaa korjauskehotuksia, ja opiskelijan on toteutettava ne jotta työ voidaan hyväksyä.
Mikäli ohjaaja hyväksyy molempien osien ratkaisut, JA koodi on helppolukuista ja eleganttia --> tenttitulos +1 arvosana, ja arvosana on silloin vähintään 1.
Harjoitustyö hyväksytään, mikäli saat vain toisen osan valmiiksi, kunhan koodi on helppolukuista, eikä siinä ole käytetty epäsoveliaita ratkaisuja, esimerkiksi kohtuuttomasti sisäkkäisiä if-lauseita, kohtuuttomasti yhdistettyjä ehtoja tms.
Työssä saa käyttää kaikkia C#:n valmiita työkaluja, myös LINQ:ta. Ulkopuolisia kirjastoja ei saa käyttää.
Mikäli koodin luettavuus on hyvin heikkoa, on käytetty huomattavia määriä huonoja koodauskäytänteitä tai muutoin epäsoveliaita ratkaisuja --> Hylätty.