Ohjelmoinnin perusteet, koe 2.3.2010

Introduction to Programming, exam 2.3.2010

Vastaa tehtävät 1, 2, 3 ja 4 erillisille konsepteille. Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, nimi, nimikirjoitus ja opiskelijanumero. Vastaukset palautetaan tehtäväkohtaisiin pinoihin. Vaikka jättäisit johonkin tehtävään vastaamatta, tulee vastauspaperi siinäkin tapauksessa palauttaa.

Answer questions 1, 2, 3 and 4 on to separate sheets. On each sheet write the name of the course, date, your name, your signature and student number. Answers to each question are returned on separate stacks. You have to return a answer sheet for each question with your details, even if you didn't answer to all questions.

Lyhennä metodien nimiä nopeuttaaksesi kirjoittamista: System.out.println();S.o.p();

You can shorten method names for faster writing: System.out.println();S.o.p();

Tule HETI koetilaisuuden jälkeen luokkaan B221 tekemään viimeinen laskarikerroin.
Come right after the paper exam to the class B221 for the final machine examination.

Laiva (7 p)

Ship (7 p)

Laivalla on attribuutteina nimi, vesillelaskuvuosi, sekä maksiminopeus. Nopeus ilmaistaan solmuina. Laivan nopeus on maksimissaan konstruktorissa annettu arvo, eikä se voi olla negatiivinen. Suunta ilmaistaan astelukuna väliltä 0 ja 359.

Ship has attributes name, launch year and maximum speed. The speed is displayed as knots. Speed of the ship is at maximum the value given in the constructor, and it's speed cannot be negative. The direction of the ship is displayed as degrees between 0 and 359.

Toteuta luokka Laiva ja yllä olevat metodit. Toteuta luokalle Laiva myös metodi toString(), joka palauttaa laivan-olion tilan merkkijonona. Laiva-luokan pitäisi toimia seuraavassa esimerkkiohjelmassa. (Älä kopioi esimerkkiohjelmaa vastauspaperiin!)

Implement class Ship and the methods above. Implement also method toString(), which returns a String representation of the ship-object. Ship class should work in the following example. (Do not copy the example to your answersheet!)

import java.util.Scanner;

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

  public static void main(String[] komentoriviParametrit) {
    System.out.print("Anna laivan nimi: ");
    String nimi = lukija.nextLine();
    System.out.print("Anna laivan maksiminopeus: ");
    int maksiminopeus = lukija.nextInt();
    System.out.print("Anna laivan vesillelaskuvuosi: ");
    int vesillelaskuvuosi = lukija.nextInt();
    System.out.println();

    Laiva gigantic = new Laiva(nimi, maksiminopeus, vesillelaskuvuosi);
    gigantic.vahennaVauhtia();
    System.out.println(gigantic);

    for (int i = 0; i < maksiminopeus + 5; i++) {
      gigantic.lisaaVauhtia();
    }
    gigantic.vahennaVauhtia();

    for (int i = 0; i < 5; i++) {
      gigantic.styyrpuuriin();
    }
    System.out.println(gigantic);

    for (int i = 0; i < 10; i++) {
      gigantic.paarpuuriin();
    }
    System.out.println(gigantic);
  }
}
import java.util.Scanner;

public class ShipOwner {
  public static Scanner reader = new Scanner(System.in);

  public static void main(String[] args) {
    System.out.print("Enter the name for the ship: ");
    String name = reader.nextLine();
    System.out.print("Enter the maximum speed for the ship: ");
    int maxSpeed = reader.nextInt();
    System.out.print("Enter the launch year for the ship: ");
    int launchYear = reader.nextInt();
    System.out.println();

    Ship gigantic = new Ship(name, maxSpeed, launchYear);
    gigantic.decreaseSpeed();
    System.out.println(gigantic);

    for (int i = 0; i < maxSpeed + 5; i++) {
      gigantic.increaseSpeed();
    }
    gigantic.decreaseSpeed();

    for (int i = 0; i < 5; i++) {
      gigantic.starboard();
    }
    System.out.println(gigantic);

    for (int i = 0; i < 10; i++) {
      gigantic.port();
    }
    System.out.println(gigantic);
  }
}

Ohjelman tulostuksen pitäisi olla esimerkkisyötteillä suunnilleen seuraava.

The output of the program with the above example should be as follows.

Anna laivan nimi: Britannic
Anna laivan maksiminopeus: 22
Anna laivan vesillelaskuvuosi: 1914

Laiva: Britannic (1914)
Nopeus: 0 solmua
Suunta: 0 astetta

Laiva: Britannic (1914)
Nopeus: 21 solmua
Suunta: 5 astetta

Laiva: Britannic (1914)
Nopeus: 21 solmua
Suunta: 355 astetta
Enter the name for the ship: Britannic
Enter the maximum speed for the ship: 22
Enter the launch year for the ship: 1914

Ship: Britannic (1914)
Speed: 0 knots
Direction: 0 degrees

Ship: Britannic (1914)
Speed: 21 knots
Direction: 5 degrees

Ship: Britannic (1914)
Speed: 21 knots
Direction: 355 degrees

Kulunvalvonta (8 p)

Access Control (8 p)

Tietojenkäsittelytieteen laitoksella on käytössä magneettiavaimet, joilla laitokselle pääsee sisälle myös aukioloaikojen ulkopuolella. Toteutetaan kulunvalvontajärjestelmä. Käytössämme on valmiiksi toteutettu luokka Kulkukortti, jota ei siis tarvitse toteuttaa. Kulkukortti saa konstruktorissaan parametrina omistajan nimen.

Computer Science Department gives it's employees magnet keys, that allow entrance to the department even outside opening hours. Let's implement an access control system. We have an existing class called MagnetKey, which we do not have to implement. Class MagnetKey gets the owner as a parameter in it's constructor.

Kulkukortti-luokalla on olemassa myös seuraavat metodit.

MagnetKey-class has the following methods.

Kulunvalvontalaite

Access control machine

Jokaisella kulunvalvontalaitteella on sijainti. Sijanti voi olla esimerkiksi "Luokka B222" tai "Huone A242". Kulunvalvontalaitteet saavat myös konstruktorissaan parametreina tämän päivän (2.3.2010). Tällä kertaa ei tarvitse toteuttaa Päivämäärä-luokkaa! Kulunvalvontalaite tarjoaa myös metodin onkoKulkulupaa, jolle annetaan parametrina Kulkukortti-olio. Metodi onkoKulkulupaa vertaa kulunvalvontalaitteen päivämäärää Kulkukortin viimeiseen voimassaolopäivämäärään, ja palauttaa tiedon pääsystä.

Each access control machine has a location. A location may be for example "Class B222" or "Room A242". Access control machines get also the current day (2.3.2010) as parameters in the constructor. This time you don't have to implement a Date-class! Access control machine has also a method hasAccess, that gets a MagnetKey-object as a parameter. The method hasAccess compares the date on the access control machine to the MagnetKey-object's expiration date, and returns information on whether the access was granted.

Toteuta luokka Kulunvalvontalaite.

Implement Access control machine (class AccessControlMachine).

HUOM! Kulunvalvontalaitteessa ei saa olla yhtään tulostuskäskyä (System.out.println())

NOTE! The class AccessControlMachine must not contain any print commands (System.out.println())

Pääohjelma

Main

Luo pääohjelma Kulunvalvontaa jossa

Create main-program AccessControl, where

Pistelaskuri (8 p)

Scoreboard (8 p)

Useiden urheilulajien pistelaskussa (mm. Uimahyppy) lasketaan pistetulokseksi pisteiden keskiarvo siten, että paras ja huonoin tulos jätetään pois. Toteutetaan yleiskäyttöinen pistelaskuri. Pistelaskuri saa konstruktorin parametrina kirjattavien pisteiden lukumäärän. Pistelaskurimme kirjaa pisteitä vain kokonaislukuina (keskiarvo voi tietysti olla liukuluku!).

Scoring for several sports (for example Diving) is counted as an average from the scores so that the best and worst score is left out. Let us implement a generic scoreboard. The scoreboard receives the number of scores it will contain as a parameter for it constructor, and it will contain an integer array for the scores (average can of course be a double!).

Pistelaskuri tarvitsee konstruktorin lisäksi seuraavat kolme metodia.

In addition to constructor, the scoreboard needs the three following methods.

Toteuta luokka Pistelaskuri

Implement class Scoreboard

HUOM! Pistelaskurin pitää varautua tilanteeseen, jossa tulos halutaan ennen kuin pistetaulukko on täyttynyt. Tässä tehtävässä ei tarvitse toteuttaa pääohjelmaa.

NOTE! Scoreboard has to be able to work in a situation, where the score is required even before the score array is full (i.e. all points have been entered). You don't have to implement the main-program for this task.

Alkeis- ja viittaustyyppien ero (7 p)

Difference between primitive and reference types (7 p)

Mitä ovat Javassa alkeis- ja viittaustyyppiset muuttujat? Miten ne eroavat toisistaan, kun niitä käytetään metodien parametreina ja paluuarvoina? Selitä tekstin ja/tai koodiesimerkkien avulla. Koodiesimerkeissä riittää oleellinen toteutus (ei siis koko luokkaa). Pituus maksimissaan 1 sivu.

What are primitive and reference types in Java? How do they differ from each others when they are used as method parameters and return values? Explain with text and/or code examples. In code examples it is enough to display the important parts (not the whole class). Length max one page.