Hyppää sisältöön

Osan kaikki tehtävät

Huomautus

Jos palautat tehtävät ennen osan takarajaa (ks. toteutuksesi takarajat), voit saada DL-BONUS-pisteitä harjoitustehtäviin. Lue DL-BONUS-pisteistä lisää suorittaminen-sivulta.

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

1.1Oma ohjelma Javalla1 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
1.2Sanojen 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
1.3Kokonaislukujen 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.

1.4Merkkijonon pakkaaminen1 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:

0 1 2 3 a a b b i jono.length i 1 1
1.5Salasanan vahvuuden tarkistaminen1 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.

1.6Matriisin tulostus1 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 
1.7Numerolaskuri Bonus1 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.

1.8Puuttuva luku Bonus1 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);
1.9Alkuluvut Bonus1 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.