Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Osan kaikki tehtävät

huomautus

Jos palautat tehtävät ennen osion takarajaa (ma 19.1.2026 klo 11:59 (keskipäivä)), voit saada DL-BONUS-pisteitä harjoitustehtäviin. Lue lisää suorittaminen-sivulta.

Ennen kuin aloitat tehtävien tekemisen, on syytä tutustua opintojakson eettisiin ohjeisiin.

Tehtävä 1.1: Oma ohjelma Javalla 1 p.

Tee uusi IDEA-projekti nimeltään Viikko1 (ks. Luo uusi projekti ohje). Lisää projektiin moduuli Tehtava11 (ks. Luo Java-moduuli -ohje).

Lisää projektiin Java Compact File -tiedosto nimeltään OmatTiedot.java. Kirjoita tiedostoon ohjelma, joka tulostaa kullekin eri riville

  • nimesi,
  • puhelimesi merkin
  • puhelimesi mallin
Tee tehtävä TIMissä
Tehtävä 1.2: Sanojen määrä 1 p.

Tee ohjelma, joka tulostaa konsolisyötteenä annetun merkkijonon sisältämien sanojen määrän. Voit olettaa, että sanat on eroteltu yhdellä välilyönnillä. Muita välimerkkejä ei tarvitse huomioida.

Ohjelman pitää tulostaa "Ei sanoja", jos syöte on tyhjä merkkijono.

Ohjelma lopettaa voi toimintansa tulosteen näyttämisen jälkeen. Ohjelman ei tarvitse kysyä syötettä jatkuvasti.

Testaa ohjelmaasi lukemalla käyttäjältä merkkijono ja tulostamalla sanojen määrä, esimerkiksi:

Sanojen määrä: 5
Tee tehtävä TIMissä
Tehtävä 1.3: Kokonaislukujen lukeminen käyttäjältä 1 p.

Tee ohjelma, joka lukee käyttäjältä ei-negatiivisia kokonaislukuja yksi rivi kerrallaan silmukassa käyttäen IO.readln()-metodia, kunnes käyttäjä antaa tyhjän merkkijonon. Tallenna nämä luvut listaan.

Tee sitten aliohjelmat summa, keskiarvo, pienin ja suurin, jotka laskevat listan pienimmän luvun, suurimman luvun, lukujen summan ja lukujen keskiarvon. Tulosta aliohjelmien palauttamat arvot käyttäjälle. Lisää aliohjelmiin sopiva käsittely tyhjille listoille ja dokumentoi ne.

Voit olettaa, että käyttäjä kirjoittaa vain ei-negatiivisia kokonaislukuja syötteenä. Jos aliohjelma saa syötteenä tyhjän listan, sen tulee palauttaa arvo -1.

Valmiiden Collections-luokan metodien, kuten Collections.min() ja Collections.max(), käyttö on kielletty.

Vinkki

Voit muuntaa merkkijonon numeroksi käyttäen Integer.parseInt(luku)-metodia.

Tee tehtävä TIMissä
Tehtävä 1.4: Merkkijonon pakkaaminen 1 p.

Tee aliohjelma pakkaaMerkkijono, joka ottaa parametrina String-merkkijonon ja palauttaa uuden String-merkkijonon tiivistettynä siten, että peräkkäiset samat merkit ilmoitetaan merkillä ja niiden lukumäärällä.

Esimerkiksi:

  • pakkaaMerkkijono("aaaabbbccd") palauttaisi merkkijonon "a4b3c2d1",
  • pakkaaMerkkijono("00666663332222222") palauttaisi merkkijonon "02653327",
  • pakkaaMerkkijono("Niiiiiin") palauttaisi merkkijonon "N1i6n1",
  • pakkaaMerkkijono("nnNNnnnN") palauttaisi merkkijonon "n2N2n3N1",
  • pakkaaMerkkijono("ohjelmointi") palauttaisi merkkijonon "o1h1j1e1l1m1o1i1n1t1i1".

Kirjoita aliohjelmalle myös sopiva dokumentaatiorivi ja lisää ainakin yksi toimintaesimerkki main()-pääohjelmaan.

Vinkki 1

Käytä StringBuilder-merkkijonoa ja sen metodeja merkkijonon rakentamiseen.

Vinkki 2

Kokeile ratkaista ongelma ensin paperilla käsin lyhyelle jonolle (esim. "aabb"). Mistä asioista on pidettävä kirjaa (muuttujat)?

Vinkki 3

Voi olla helpompaa aloittaa toisesta merkistä ja verrata se aina edeltävään:

0123aabbijono.lengthi11
Tee tehtävä TIMissä
Tehtävä 1.5: Salasanan vahvuuden tarkistaminen 1 p.

Tee funktio onkoSalasanaVahva, joka tarkastaa parametrina saadun salasanan (String) vahvuuden. Salasanan tulee olla vähintään 8 merkkiä pitkä, sisältää yhden luvun, sekä vähintään yhden suuren ja pienen kirjaimen.

Funktio palauttaa true, jos merkkijonona annettu salasana täyttää yllä olevat vaatimukset, muuten se palauttaa false.

Kirjoita aliohjelmalle myös sopiva dokumentaatiorivi ja lisää ainakin yksi toimintaesimerkki main()-pääohjelmaan.

Vinkki

Katso Character-luokan metodi isDigit.

Esimerkiksi kutsumalla Character.isDigit(merkki) saat paluuarvona true, jos merkki on numero, ja vastaavasti false, jos merkki ei ole numero.

Vastaavalla periaatteella toimivat myös metodit isUpperCase ja isLowerCase, jotka löytyvät myös samasta luokasta.

Tee tehtävä TIMissä
Tehtävä 1.6: Matriisin tulostus 1 p.

Tee aliohjelma tulostaMatriisi, joka tulostaa kaikki parametrina annetun kokonaislukumatriisin luvut samalle riville. Aliohjelma ei palauta mitään.

Esimerkki aliohjelman toiminnasta

int[][] matriisi = {
    {42, 2, 3},
    {4, 67, 6},
    {7, 8, 9}
};

tulostaMatriisi(matriisi);

Tulostuksen pitäisi silloin olla:

42 2 3 4 67 6 7 8 9 
Tee tehtävä TIMissä
Bonus: Tehtävä 1.7: Numerolaskuri 1 p.

Tee ohjelma, joka kysyy käyttäjältä syötteen ja tulostaa, kuinka monta kertaa kukin numero (0–9) esiintyy syötteessä.

Esimerkiksi, jos käyttäjä antaa syötteenä 12223, ohjelma tulostaa:

1: 1 kpl
2: 3 kpl
3: 1 kpl

Vastaavasti, jos syötteenä annetaan 10002244412, ohjelma tulostaa.

0: 3 kpl
1: 2 kpl
2: 3 kpl
4: 3 kpl

Tulostamisen jälkeen ohjelma kysyy käyttäjältä uuden syötteen. Jos käyttäjä antaa tyhjän syötteen, ohjelman suoritus päättyy.

Vinkki

Yksittäisen merkin saa muunnettua kokonaisluvuksi yhdistämällä Character.toString ja Integer.parse:

int numeroLukuna = Integer.parseInt(Character.toString(a));

Huomaa, että Integer.parseInt olettaa, että annettu merkkijono on todellakin numero; jos se sisältää jotain muuta kuin numeroa, funktio heittää virheen. Voit tarkistaa, että onko yksittäinen merkki numero käyttämällä Character.isDigit-funktiota.

Tee tehtävä TIMissä
Bonus: Tehtävä 1.8: Puuttuva luku 1 p.

Tee funktio int puuttuvaLuku(int[] taulukko). Funktiolle annetaan parametriksi taulukko, joka sisältää luvut 1-N satunnaisessa järjestyksessä, mutta yksi luvuista puuttuu. Funktion on palautettava luku, joka puuttuu. Funktio ei saa aiheuttaa sivuvaikutuksia.

Esimerkiksi:

  • puuttuvaLuku(new int[] { 1, 6, 3, 4, 5 }) palauttaa 2
  • puuttuvaLuku(new int[] { 8, 2, 4, 1, 3, 5, 6 }) palauttaa 7
  • puuttuvaLuku(new int[] { }) palauttaa 1
  • puuttuvaLuku(new int[] { 2 }) palauttaa 1

Voit käyttää alla olevaa apufunktiota satunnaisen taulukon luomiseksi:

int[] annaSyote(int maxLuku) {
    Random r = new Random();
    List<Integer> luvut = new ArrayList<>(IntStream.range(1, r.nextInt(2, maxLuku + 1)).boxed().toList());
    Collections.shuffle(luvut);
    luvut.remove(r.nextInt(luvut.size()));
    return luvut.stream().mapToInt(Integer::intValue).toArray();
}

Voit käyttää aliohjelmaa seuraavasti:

// Tekee taulukon luvuista 1-10, mutta yksi luku puuttuu
int[] syote = annaSyote(10); 
// Selvitetään, mikä luvuista puuttuu
int puuttuva = puuttuvaLuku(syote);
Tee tehtävä TIMissä
Bonus: Tehtävä 1.9: Alkuluvut 1 p.

Tulosta kaikki alkuluvut väliltä 1-100.

Alkuluku on lukua 1 suurempi kokonaisluku, joka on jaollinen vain itsellään ja luvulla 1.

Vinkki

Tee ensin funktio onAlkuluku, joka saa parametrinaan kokonaisluvun ja palauttaa totuusarvon, joka kertoo onko luku alkuluku vai ei. Käytä tätä funktiota apuna pääohjelmassa, jossa tulostat silmukkaa apuna käyttäen kaikki alkuluvut väliltä 1-100.

Tee tehtävä TIMissä