Tällä sivulla ovat kurssikokeen 29.6. tehtävät ratkaisuineen. Tehtävät voi usein ratkaista monella eri tavalla, jotka saattavat poiketa paljonkin malliratkaisuista.
Tee ohjelma, joka tulostaa tiedoston testi.txt rivit käänteisessä järjestyksessä.
Esimerkki:
Tiedoston testi.txt sisältö on seuraava:
Tämä rivi on ensimmäinen. Sitten tulee toinen rivi. Kolmas rivi on jo viimeinen.
Nyt ohjelman tulostuksen tulisi olla seuraava:
Kolmas rivi on jo viimeinen. Sitten tulee toinen rivi. Tämä rivi on ensimmäinen.
import java.util.*; import java.io.*; public class TiedostonRivit { public static void main(String[] args) throws Exception { Scanner tiedosto = new Scanner(new File("testi.txt")); ArrayList<String> rivit = new ArrayList<String>(); while (tiedosto.hasNextLine()) { rivit.add(tiedosto.nextLine()); } Collections.reverse(rivit); for (String rivi : rivit) { System.out.println(rivi); } } }
Tee ohjelma, joka tulostaa "shakkiruudukon", joka muodostuu numeroista 0 ja 1. Ohjelma kysyy ensin käyttäjältä ruudukon koon. Ruudukon vasemmassa ylänurkassa on numero 0 ja kaikissa vierekkäisissä ruuduissa on eri numero.
Esimerkki 1:
Anna koko: 4 0101 1010 0101 1010
Esimerkki 2:
Anna koko: 5 01010 10101 01010 10101 01010
import java.util.*; public class Shakkiruudukko { private static Scanner input = new Scanner(System.in); public static void main(String[] args) { System.out.print("Anna koko: "); int koko = Integer.parseInt(input.nextLine()); for (int i = 0; i < koko; i++) { for (int j = 0; j < koko; j++) { System.out.print((i + j) % 2); } System.out.println(); } } }
Tee ohjelma, joka kysyy käyttäjältä kaksi sanaa ja ilmoittaa, ovatko sanat anagrammit. Sanat ovat anagrammit, jos ne muodostuvat samoista kirjaimista ja jokainen kirjain esiintyy yhtä monta kertaa kummassakin sanassa. Voit olettaa, että sanat muodostuvat kirjaimista a–z.
Esimerkki 1:
Anna 1. sana: ohpe Anna 2. sana: ohja Sanat eivät ole anagrammit.
Esimerkki 2:
Anna 1. sana: talo Anna 2. sana: lato Sanat ovat anagrammit.
Esimerkki 3:
Anna 1. sana: osuus Anna 2. sana: suo Sanat eivät ole anagrammit.
import java.util.*; public class Anagrammit { private static Scanner input = new Scanner(System.in); public static boolean anagrammit(String sana1, String sana2) { if (sana1.length() != sana2.length()) { return false; } ArrayList<Character> merkit1 = new ArrayList<Character>(); ArrayList<Character> merkit2 = new ArrayList<Character>(); for (int i = 0; i < sana1.length(); i++) { merkit1.add(sana1.charAt(i)); merkit2.add(sana2.charAt(i)); } Collections.sort(merkit1); Collections.sort(merkit2); for (int i = 0; i < sana1.length(); i++) { if (merkit1.get(i) != merkit2.get(i)) { return false; } } return true; } public static void main(String[] args) { System.out.print("Anna 1. sana: "); String sana1 = input.nextLine(); System.out.print("Anna 2. sana: "); String sana2 = input.nextLine(); if (anagrammit(sana1, sana2)) { System.out.println("Sanat ovat anagrammit."); } else { System.out.println("Sanat eivät ole anagrammit."); } } }
Tee luokka Arpoja
, jonka tehtävänä on arpoa kokonaislukuja
tietyltä lukuväliltä. Luokan konstruktorissa annetaan pienin ja suurin luku.
Lisäksi luokassa on metodi arvoLuku
, joka palauttaa satunnaisen
kokonaisluvun konstruktorissa annetulta lukuväliltä.
Seuraavan koodin avulla voit arpoa kokonaisluvun väliltä
alaraja
...yläraja
.
Random arpoja = new Random(); int luku = arpoja.nextInt(ylaraja - alaraja + 1) + alaraja;
Seuraava koodi testaa luokkasi toimintaa:
Arpoja noppa = new Arpoja(1, 6); System.out.println("Kolme heittoa nopasta:"); System.out.println(noppa.arvoLuku()); System.out.println(noppa.arvoLuku()); System.out.println(noppa.arvoLuku());
Seuraavassa on esimerkkejä koodin suorituksesta:
Kolme heittoa nopasta: 5 2 4
Kolme heittoa nopasta: 1 4 1
Kolme heittoa nopasta: 6 5 1
import java.util.*; public class Arpoja { private Random arpoja = new Random(); private int alaraja; private int ylaraja; public Arpoja(int alaraja, int ylaraja) { this.alaraja = alaraja; this.ylaraja = ylaraja; } public int arvoLuku() { return arpoja.nextInt(ylaraja - alaraja + 1) + alaraja; } }
Rajapinta Tulostaja
on määritelty seuraavasti:
public interface Tulostaja { public void tulosta(String viesti); }
Tee luokat Tavallisesti
, Vaarinpain
ja
Toistaen
, jotka toteuttavat rajapinnan Tulostaja
.
Luokan Tavallisesti
metodin tulosta
tulee tulostaa
viesti sellaisenaan.
Luokan Vaaarinpain
metodin tulosta
tulee tulostaa
viesti väärinpäin.
Luokan Toistaen
metodin tulosta
tulee tulostaa
viesti konstruktorissa annetun määrän kertoja.
Seuraava koodi testaa luokkien toimintaa:
Tulostaja t1 = new Tavallisesti(); Tulostaja t2 = new Vaarinpain(); Tulostaja t3 = new Toistaen(5); t1.tulosta("apina"); t2.tulosta("banaani"); t3.tulosta("cembalo");
Yllä olevan koodin tulisi tulostaa seuraavat rivit:
apina inaanab cembalo cembalo cembalo cembalo cembalo
public class Tavallisesti implements Tulostaja { public void tulosta(String viesti) { System.out.println(viesti); } }
public class Vaarinpain implements Tulostaja { public void tulosta(String viesti) { for (int i = viesti.length() - 1; i >= 0; i--) { System.out.print(viesti.charAt(i)); } System.out.println(); } }
public class Toistaen implements Tulostaja { private int toistokerrat; public Toistaen(int toistokerrat) { this.toistokerrat = toistokerrat; } public void tulosta(String viesti) { for (int i = 0; i < toistokerrat; i++) { System.out.println(viesti); } } }