Takaisin kurssin pääsivulle

Kurssikoe 29.6.

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.

Tehtävä 1

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.

Ratkaisu

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);
	}
    }
}

Tehtävä 2

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

Ratkaisu

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();
	}
    }
}

Tehtävä 3

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.

Ratkaisu

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.");
	}
    }
}

Tehtävä 4

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

Ratkaisu

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;
    }
}

Tehtävä 5

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

Ratkaisu

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);
        }
    }
}

Takaisin kurssin pääsivulle