- COMP.CS.140
- 4. Suuren ohjelman toteuttaminen
- 4.4 ⌛⌛ Sudoku
⌛⌛ Sudoku¶
Tehtävään on tarjolla valmista materiaalia etätietovarastossa:
Materiaali on varaston hakemistossa
round4/sudoku
.SudokuTest.java
: valmis testiohjelma toteutuksesi testaamiseen.input.txt
: testisyöte ohjelmalle.output.txt
: esimerkkituloste, joka on luotu antamalla ohjelmalleinput.txt
-tiedoston syötteet.
Tehtävä: Sudoku¶
Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml
-tiedosto paikallisen tietovarastosi
round4/sudoku
-hakemistoon ja tee tähän hakemistoon src/main/java
-niminen alihakemisto.
Tee luokkatiedosto Sudoku.java ja liitä se
fi.tuni.prog3.sudoku
-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa
round4/sudoku/src/main/java/fi/tuni/prog3/sudoku
. NetBeans osaa luoda tehtävässä
pakkausta vastaavan hakemistorakenteen automaattisesti, kun annat Maven-projektia luodessasi
oikeat tiedot.
Toteuta luokka Sudoku
, joka ylläpitää Sudoku-ruudukkoa ja osaa esimerkiksi tarkistaa sen
laillisuuden. Jos olet onnistunut välttymään tietämästä, mikä Sudoku on, tutustu ensin vaikkapa
Wikipedia-artikkeliin aiheesta.
Tarkemmin sanoen tehtävänä on toteuttaa luokka Sudoku, jolla on alla annetut julkiset piirteet. Älä tekee luokkaan muita julkisia piirteitä. Esimerkiksi apufunktioiden tulee olla kätkettyjä.
Parametriton rakennin
Sudoku()
: alustaa Sudoku-olion tallettamaan 9 × 9 -kokoisen Sudoku-ruudukon, jonka kaikki ruudut ovat tyhjiä (esitetty välilyöntimerkeillä' '
).Voit sinänsä vapaasti päättää, millaisessa muodossa luokka ylläpitää ruudukkoa. Tässä tulee luonnollisesti huomioida alla kuvattujen jäsenfunktioiden ominaisuudet.
Jäsenfunktio
set(int i, int j, char c)
: asettaa Sudoku-ruudukon rivini
sarakkeenj
ruutuun merkinc
.Rivit numeroidaan 0…8 ja sarakkeet 0…8. Funktion tulee tarkistaa, että
i
jaj
vastaavat laillista riviä ja saraketta. Ellei näin ole, tulostetaan muotoa “Trying to access illegal cell (i, j)!
” oleva viesti.Sudoku-ruudukkoon saa tallettaa ainoastaan välilyöntejä
' '
(tarkoittaa tyhjää ruutua) sekä numeromerkkejä'1'
,'2'
,'3'
,'4'
,'5'
,'6'
,'7'
,'8'
ja'9'
. Jos annettu merkkic
on jokin muu merkki, ei sitä aseteta ja tulostetaan muotoa “Trying to set illegal character c to (i, j)!
” oleva viesti.
Jäsenfunktio
check()
: tutkii, onko Sudoku-ruudukon nykyinen sisältö laillinen. Palauttaatrue
, jos on, ja muutenfalse
.Sudoku on laillinen, ellei mikään rivi, sarake tai 3 x 3 -kokoinen alilohko sisällä kahta tai useampaa keskenään samaa numeromerkkiä (tyhjiä ruutuja luonnollisesti saa olla monta).
Tarkista ensin rivit, sitten sarakkeet, ja lopuksi 3 x 3 lohkot vasemmasta yläkulmasta riveittäin edeten.
Jos rivin, sarakkeen tai lohkon tarkistuksen aikana löytyy useita toistuvia numeromerkkejä, otetaan näistä yksikäsitteisyyden vuoksi talteen pienin numeromerkki
c
. Tämän jälkeen tulostetaan jokin alla kuvatuista viesteistä ja tarkistus päättyy palauttaen arvonfalse
. Tarkistus siis lopetetaan heti, kun ensimmäinen laiton kohta löytyy.Rivi: “
Row i has multiple c's!
”, missäi
on rivin indeksi.Sarake: “
Column j has multiple c's!
”, missäj
on sarakkeen indeksi.Alilohko: “
Block at (x, y) has multiple c's!
”, missäx
jay
ovat alilohkon vasemman yläkulman ruudun rivi ja sarake.
Jäsenfunktio
print()
: tulostaa Sudoku-ruudukon. Ruudukon rajat esitetään merkkien'#'
,'-'
,'|'
ja'+'
avulla ja ruudun arvon molemmin puolin on yksi välilyönti. Katso tarkempi muoto tehtävän yhteydessä annetusta esimerkkitulosteesta.
Kaikki tulostukset tulee tehdä
System.out
-virtaan.
Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml
seuraavat määritykset:
artifactId
-elementin arvo onsudoku
.version
-elementin arvo on1.0
.maven.compiler.source
jamaven.compiler.target
-elementtien arvo on17
tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.Onejar-liitännäisen määritys, jonka
mainClass
-elementin arvo onSudokuTest
, joka on alla kuvattu valmiina annettu testiluokka.
Toteutuksen testaus¶
Voit testata luokkaasi tiedostossa SudokuTest.java
annetun valmiin testiohjelman,
tiedostossa input.txt
annetun testidatan ja tiedostossa output.txt
annetun
esimerkkitulosteen avulla.
Aseta SudokuTest.java
Maven-projektisi alihakemiston src/main/java
juureen ja muut
tiedostot Maven-projektisi juurihakemistoon pom.xml
tiedoston seuraksi. Edellä on huomattava,
että SudokuTest.java
ei sisällä pakkausmääritystä, joten sitä ei siksi aseteta syvempään
alihakemistoon.
Voit tämän jälkeen kääntää ohjelman komennolla mvn package
ja suorittaa testin antamalla komennon
java -jar target/sudoku-1.0.one-jar.jar input.txt
projektin juurihakemistossa. Suorituksen
pitäisi tuottaa tiedostossa output.txt
kuvattu tuloste.
Palautus¶
Tehtävä palautetaan tavalliseen tapaan puskemalla tiedostot etätietovarastoon ja antamalla etätietovaraston verkko-osoite alla olevaan kenttään.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.