Harjoitustyö, aihe "Janat"

(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:

  • Rivi 1,1 -> 1,3 on jana, joka sisältää pisteet 1,1, 1,2, ja 1,3.
  • Rivi 9,7 -> 7,7 on jana, joka sisältää pisteet 9,7, 8,7, ja 7,7.

Osa 1

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

# osa1tarkista

Osa 2

Seuraavaksi, ota vaaka- ja pystyjanojen lisäksi huomioon myös vinoviivat.

  • Rivi 1,1 -> 3,3 kattaa pisteet 1,1, 2,2, ja 3,3.
  • Rivi 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.

# osa2tarkista

Vaatimukset

  1. Ohjelman täytyy tulostaa tulos alla olevassa muodossa (esimerkki). Ohjelma ei saa tulostaa mitään muuta.
Osa 1: 234
Osa 2: 4321
  1. Aineisto on luettava annetusta tiedostosta.
  2. Aineistoa ei saa muuttaa.
  3. Aineistoa ei saa kopioida lähdekooditiedostoon edes osittain. Yksikkötestejä voit kuitenkin kirjoittaa.

Työn palauttaminen

Työ tallennetaan versiohallintaan kuten mikä tahansa harjoitustyö.

Arviointi

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.

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.