Tehtävät viikolle 4

Pakolliset tehtävät on merkitty harmalla taustavärillä.

HUOM: nimeä tiedostot otsikossa olevan sanan mukaan

Lämmittely

Sisennä oikein ja korjaa

Tämän viikon luentomateriaalissa on kappale lähdekoodin sisentämisestä. Lue se, ja sisennä seuraava lähdekoodi oikein. Korjaa myös ohjelmassa oleva virhe.

public class Laskin {
	public static void main(String[] komentoriviParametrit) {
	int i = 0;
    Laskuri omaLaskuri = new Laskuri(0);
    System.out.println("omaLaskurin arvo on " + omaLaskuri.annaArvo());
		omaLaskuri.kasvataArvoa();omaLaskuri.kasvataArvoa();
		omaLaskuri.kasvataArvoa();omaLaskuri.kasvataArvoa(); omaLaskuri.kasvataArvoa(); omaLaskuri.kasvataArvoa();	
if (i == 0 ); { System.out.println("i on 0");
System.out.println("ja pysyy"); }
else { System.out.println("i oli jotain muuta"); i=0; System.out.println("mutta nyt se on 0"); }
int arvo = omaLaskuri.annaArvo();
	System.out.println("omaLaskurin arvo on " + arvo);
    }
}

Laskuri

KahviJaTee

Toteuta luentomateriaalissa olevaan Laskuri-luokkaan tarvittava toiminnallisuus jotta seuraava ohjelma toimisi oikein. Varmista ohjelman toimivuus!

public class KahviJaTee {

  public static void main(String[] komentoriviParametrit) {

    Laskuri kahvitMattiL = new Laskuri(2);
    Laskuri teeMattiL = new Laskuri(4);

    System.out.println("Matti L. on juonut " + kahvitMattiL.annaArvo() + " kahvia.");
    System.out.println("Matti L. on juonut " + teeMattiL.annaArvo() + " teetä.");

    System.out.println("Juodaan kahvia.");

    kahvitMattiL.kasvataArvoa();
    kahvitMattiL.kasvataArvoa();

    System.out.println("Maksetaan pois velkoja.");

    kahvitMattiL.vahennaArvoa();
    teeMattiL.vahennaArvoa();

    System.out.println("Matti L. on juonut " + kahvitMattiL.annaArvo() + " kahvia.");
    System.out.println("Matti L. on juonut " + teeMattiL.annaArvo() + " teetä.");
    }
}

Moottori

Tee ohjelma moottori, joka käyttää Laskuri-luokkaa. Tee ohjelmassa olio moottori, jonka alkuarvo on 0. Tämän jälkeen kasvata laskurin kasvataArvoa()-metodilla moottorin kierrosluku arvoon 4200 ja tulosta tilanne. Tämän jälkeen vähennä kierroksia vahennaArvoa()-metodilla siten, että kierroksia on 3200. Lopuksi vähennä kierrokset arvoon 0.

Lisäksi tee toString()-metodi, joka palauttaa muotoillun tekstin.

Moottorin kierrosluku on nyt 0
Moottorin kierrosluku on nyt 4200
Moottorin kierrosluku on nyt 3200
Moottorin kierrosluku on nyt 0

MoottoriMaksimi

Laajenna Laskuria siten, että luokan konstruktori ottaa parametrikseen myös maksimiarvon.

Toteuta kasvataMaksimiin()-metodi, joka asettaa moottorin kierrosluvun maksimiarvoonsa.

Tee kasvataArvoa()-metodiin tarkastus, että arvo ei asetu maksimiarvon yli. Testaa seuraavasti:

moottori.asetaMaksimiin();
System.out.println(moottori) // tulostaa 4200 (tai muun maksimiarvon)

moottori.kasvataArvoa();
System.out.println(moottori) // tulostaa saman kuin edellinen, eli arvo ei ole muuttunut.

Kuulaskuri

Tee ohjelma käyttäen materiaalin pohjana materiaalin kuulaskurin oliototeutusta. Muokkaa toteutusta siten, että ohjelma pitää kirjaa myös vuodesta.

Anna vuosi: 2010
Anna kuukausi: 8

Seuraavat 24 kuukautta:
2010 - 9
2010 - 10
2010 - 11
2010 - 12
2011 - 1
2011 - 2
2011 - 3
2011 - 4
2011 - 5
2011 - 6
2011 - 7
2011 - 8
2011 - 9
2011 - 10
2011 - 11
2011 - 12
2012 - 1
2012 - 2
2012 - 3
2012 - 4
2012 - 5
2012 - 6
2012 - 7
2012 - 8
2012 - 9
2012 - 10
2012 - 11
2012 - 12
2013 - 1
2013 - 2
2013 - 3
2013 - 4
2013 - 5

NeliLaskija

Toteuta nelilaskin olioversiona. Tee uusi projekti, johon laitat alla olevan pääohjelman. Toteuta samaan projektiin luokka NeliLaskin.

import java.util.Scanner;

public class NeliLaskija {
  public static Scanner lukija = new Scanner(System.in);

  public static void main(String[] komentoriviParametrit) {

    NeliLaskin laskin = new NeliLaskin();

    System.out.print("Anna ensimmäinen luku: ");
    int eka = lukija.nextInt();

    System.out.print("Anna toinen luku: ");
    int toka = lukija.nextInt();

    System.out.println("Summa: " + laskin.summa(eka, toka));
    System.out.println("Erotus: " + laskin.erotus(eka, toka));
    System.out.println("Jako: " + laskin.jako(eka, toka));
    System.out.println("Kerto: " + laskin.kerto(eka, toka));

  }
}

NeliLaskija2

Tee kuten edellisessäkin tehtävässä, mutta nyt käyttäen olion sisäisiä attribuutteja (kaksi kokonaislukua). Tässä versiossa laskin siis tietää kaksi lukuaan, joille se osaa suorittaa operaatioita. Mieti kahden eri toteutustavan (NeliLaskija ja NeliLaskija2) eroja.

import java.util.Scanner;

public class NeliLaskija {
  public static Scanner lukija = new Scanner(System.in);

  public static void main(String[] komentoriviParametrit) {

    System.out.print("Anna ensimmäinen luku: ");
    int eka = lukija.nextInt();

    System.out.print("Anna toinen luku: ");
    int toka = lukija.nextInt();

    NeliLaskin laskin = new NeliLaskin(eka,toka);

    System.out.println("Summa: " + laskin.summa());
    System.out.println("Erotus: " + laskin.erotus());
    System.out.println("Jako: " + laskin.jako());
    System.out.println("Kerto: " + laskin.kerto());

  }
}

Opintopistelaskuri

OpintopisteetTunneiksi

Tee ohjelma, jolla voi laskea opintopisteiden laskennallisen työmäärän. 1 opintopiste on 27 tuntia.

Toteuta TyomaaraMuunnin luokka, josta teet oliot esimerkin mukaisesti. Oliolla tulee olla toString() -metodi, joka palauttaa valmiiksi muotoillun tekstin.

import java.util.Scanner;

public class OpintopisteetTunneiksi {

    public static Scanner lukija = new Scanner(System.in);

    public static void main(String[] komentoriviParametrit) {

        TyomaaraMuunnin ohpe = new TyomaaraMuunnin("Ohjelmoinnin perusteet", 5.0, 6);
        TyomaaraMuunnin ohja = new TyomaaraMuunnin("Ohjelmoinnin jatkokurssi", 4.0, 6);

        System.out.println(ohpe);
        System.out.println("---");
        System.out.println(ohja);

    }
}
Kurssin Ohjelmoinnin perusteet (5.0op) laskennallinen työmäärä
Yhteensä 135.0h
Viikossa 22.5h
---
Kurssin Ohjelmoinnin jatkokurssi (4.0op) laskennallinen työmäärä
Yhteensä 108.0h
Viikossa 18.0h

OpintopisteetTunneiksi2

Tee luokkaa käyttäen ohjelma, joka kysyy kurssin nimeä, opintopisteitä ja työmäärää. Tämän jälkeen ohjelma tulostaa olion tiedot kuten edellisessä tehtävässä.

Kurssin nimi: Agile Entwicklung mit Ruby über Gleis
Opintopisteitä: 5.0
Kesto viikkoina: 6

Kurssin Agile Entwicklung mit Ruby über Gleis (5.5op) laskennallinen työmäärä
Yhteensä 148.5h
Viikossa 24.75h

Varasto

KahvikassaVarasto

Toteuta materiaalin luokan Varasto avulla ohjelma, joka pitää kirjaa jäljellä olevan kahvin määrästä.

Älä muuta luokan Varasto valmiina olevia metodeja, mutta voit lisätä omia metodeja entisten rinnalle. Varaston tilan muuttamisen tulee kuitenkin tapahtua valmiiden otaVarastosta() ja lisaaVarastoon() -metodien avulla.

Hoida tilan tulostaminen toString()-metodin avulla.

Aloita ohjelman tekeminen tämän avulla:

import java.util.Scanner;

public class KahvikassaVarasto {

    public static Scanner lukija = new Scanner(System.in);

    public static void main(String[] args) {
        Varasto kahvi = new Varasto(3, 2);

        System.out.println("Kahvikassa");
        System.out.println("1\tJuo kahvi");
        System.out.println("0\tPoistu\n");

    }


}
	

Ohjelman suoritus näyttää seuraavalta:

Kahvikassa
1   Juo kahvi
0   Poistu

Kahvia on jäljellä 2.0/3.0 kuppia
Valitse toiminto: 1

Kahvia on jäljellä 1.0/3.0 kuppia
Valitse toiminto: 1

Kahvia on jäljellä 0.0/3.0 kuppia
Valitse toiminto: 1

Kahvi on loppu!

Kahvia on jäljellä 0.0/3.0 kuppia
Valitse toiminto: 0

KahvikassaVarasto2

Laajenna toteutusta siten, että ohjelmaan tulee uusi toiminto: kahvin keittäminen. Kahvin keittäminen on mahdollista kaikissa ohjelman vaiheissa, mutta kahvia ei voi keittää enempää kuin tilaa on jäljellä.

Kahvikassa
1   Juo kahvi
2   Keitä kahvia
0   Poistu

Kahvia on jäljellä 2.0/3.0 kuppia
Valitse toiminto: 2
Kuinka monta kuppia keitetään: 2

Ei ole tilaa!

Kahvia on jäljellä 2.0/3.0 kuppia
Valitse toiminto: 2
Kuinka monta kuppia keitetään: 1

Kahvia on jäljellä 3.0/3.0 kuppia
Valitse toiminto: 0

Arvauspeli

Tehdään arvaajapeli, jossa tietokone yrittää arvata annatko syötteeksi 0 vai 1 edellisten arvaustesi perusteella.

Arvaaja

Luokka Arvaaja pitää yllä arvausten määrää, ja yrittää arvata seuraavan luvun. Arvaajalla on metodit syotaArvaus, jolle annetaan parametriksi pelaajan viimeksi arvaama luku. Metodi annaArvaus palauttaa arvaajan arvaaman luvun. Voit käyttää alla olevaa runkoa arvaajan toteutukseen.

public class Arvaaja {
  // ..
  
  public Arvaaja() {
    // ..
  }
  
  public void syotaArvaus(int luku) {
    // .. 
  }
  
  public int annaArvaus() {
    // ..
  }
}

Tee toteutuksesta sellainen, mikä pitää kirjaa arvattujen nollien ja ykkösten määristä. Jos nollia on enemmän kuin ykkösiä, arvataan aina nolla. Muulloin arvataan aina yksi.

ArvaajaPeli

Itse pääohjelma sijaitsee luokassa ArvaajaPeli. ArvaajaPeli lukee käyttäjältä syötteitä numero kerrallaan. Kun käyttäjä syöttää luvun, arvaajalta kysytään lukua. Jos luku on sama, saa tietokone pisteen, muutoin käyttäjä saa pisteen. Pelin loputtua tulostetaan pelitulos.

Voit käyttää seuraavaa runkoa ohjelman alkuun. Tarvitset ohjelmaan toiston lukemiseen.

import java.util.Scanner;

public class ArvaajaPeli {
    public static Scanner lukija = new Scanner(System.in);

    public static void main(String[] komentoriviParametrit) {
        Arvaaja arvaaja = new Arvaaja();
        int tietokoneenPisteet = 0;
        int pelaajanPisteet = 0;
        int pelaajanSyote;
        int arvaajanArvaus;

        System.out.println("--Arvaaja--");
        System.out.println("1\tKone arvaa yksi.");
        System.out.println("0\tKone arvaa nolla.\n");
        System.out.println("Muut luvut lopettavat\n");
        
        pelaajanSyote = lukija.nextInt();
        
        // toista kunnes?
        arvaajanArvaus = arvaaja.annaArvaus();
        arvaaja.syotaArvaus(pelaajanSyote);
              
        if(pelaajanSyote == arvaajanArvaus)
          tietokoneenPisteet = tietokoneenPisteet + 1;
        else
          pelaajanPisteet = pelaajanPisteet + 1;
          
        // tulosta pistetilanne
          
        pelaajanSyote = lukija.nextInt();
        
        
        // kun toisto loppuu, tulosta lopputilanne
    }
}

Ohjelman tulostus voi olla esimerkiksi seuraavanlaista:

--Arvaaja--
1   Kone arvaa yksi.
0   Kone arvaa nolla.
Muut luvut lopettavat.

Syöte: 0
Kone arvasi: 1
Tilanne: Pelaaja 1, Kone 0

Syöte: 0
Kone arvasi: 0
Tilanne: Pelaaja 1, Kone 1

Arvaus: 1
Kone arvasi: 0
Tilanne: Pelaaja 2, Kone 1

Arvaus: 42
Kiitos pelistä!
Lopputilanne: Pelaaja 2, Kone 1