Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 1 – BikeRental-, Bike-, og Location-klassene (35%)

BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Vi gjør det enkelt og identifiserer stasjonene med et geografisk punkt (GeoLocation, se skjelettet), altså lengde- og breddegrad. GeoLocation brukes også for lagring av posisjonen til syklene.

Oppgave 1 a) - GeoLocation

GeoLocation er kodet slik at instansene ikke kan endres. Hva er fordelen med dette?

Expand
titleLF
  • ...
  • ...
Code Block

Vanlige feil: ...

Oppgave
b
1b) - GeoLocation

Skriv ferdig double distance(GeoLocation)-metoden i GeoLocation.

Expand
titleLF

Det eneste en skulle implementere her var distance(Geolocation other). Det var fullt mulig å implementere denne uten å bruke noen matematiske ting. Hvis en ser på skjelettet for GeoLocation eksisterer det en metode der allerede - distance(lat1, long1, lat2, long2). Det eneste en må gjøre er å returnere et kall til denne metoden.

Vi legger også ved en implementasjon av denne hjelpemetoden, mens den i skjelettet var tom.

Code Block
public class GeoLocation {

// Slettet gettere og settere etc.

// Kode for 1b
 public double distance(final GeoLocation other) {
  return distance(latitude, longitude, other.latitude, other.longitude);
 }


// Under følger kode for metoden dere kunne forvente at eksisterte.
 /*

Kommer

Code Block
public class GeoLocation {

// Slettet gettere og settere etc.

// Kode for 1b
 public double distance(final GeoLocation other) {
...
 }


// Under følger kode for metoden dere kunne forvente at eksisterte.
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
 /*::                                                                         :*/
 /*::  This routine calculates the distance between two points (given the     :*/
 /*::  latitude/longitude of those points). It is being used to calculate     :*/
 /*::  the distance between two locations using GeoDataSource (TM) prodducts  :*/
 /*::                                                                         :*/
 /*::  Definitions:                                                           :*/
 /*::    South latitudes are negative, east longitudes are positive           :*/
 /*::                                                                         :*/
 /*::  Passed to function:                                                    :*/
 /*::    lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees)  :*/
 /*::    lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees)  :*/
 /*::  Worldwide cities and other features databases with latitude longitude  :*/
 /*::  are available at http://www.geodatasource.com                          :*/
 /*::                                                                         :*/
 /*::  For enquiries, please contact sales@geodatasource.com                  :*/
 /*::                                                                         :*/
 /*::  Official Web site: http://www.geodatasource.com                        :*/
 /*::                                                                         :*/
 /*::           GeoDataSource.com (C) All Rights Reserved 2015                :*/
 /*::                                                                         :*/
 /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
 public static double distance(final double lat1, final double lon1, final double lat2, final double lon2) {
  final double theta = lon1 - lon2;
  double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
  dist = Math.acos(dist);
  // convert to degrees
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  // convert to meters
  dist = dist * 1609.344;
  return dist;
 }
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
 /*:: This function converts decimal degrees to radians       :*/
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
 private static double deg2rad(final double deg) {
  return (deg * Math.PI / 180.0);
 }
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
 /*:: This function converts radians to decimal degrees       :*/
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
 private static double rad2deg(final double rad) {
  return (rad * 180 / Math.PI);
 }
}




Vanlige feil:

 

Oppgave c) - Bike

Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram.

Image Removed

(Location i bildet over skulle hett GeoLocation, men det var tydelig nok i forhold til teksten hva som er ment.)

Begge disse assosiasjonene er dynamiske, dvs. både location og renter (låntaker) kan endres. location-koblingen endres (automagisk, du kan bare forholde deg til at location hele tiden oppdateres) når sykkelen beveger seg, mens renter-koblingen endres når leieforhold innledes og avsluttes.

Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner.

Expand
titleLF

Her var det snakk om ....

Code Block
Kommer

Vanlige feil:

 

Oppgave d) - DiceIterator (6 poeng)

Lag en implementasjon av Iterator<Integer>kalt DiceIterator, slik at den kan brukes slik det er vist i Dice sin iterator()-metode. Du kan anta at valueCounters-feltet i Dice er synlig i DiceIterator-klassen.

/
 private static double rad2deg(final double rad) {
  return (rad * 180 / Math.PI);
 }
}




Vanlige feil:

 Det viser seg ganske vanlig at folk på eksamen ikke leser hele oppgaven, ei heller hele klassen til en metode som skal implementeres, før en implementerer den. Dette er ikke lurt.

Oppgave 1c) - Bike

Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram.

Image Added

(Location i bildet over skulle hett GeoLocation, men det var tydelig nok i forhold til teksten hva som er ment.)

Begge disse assosiasjonene er dynamiske, dvs. både location og renter (låntaker) kan endres. location-koblingen endres (automagisk, du kan bare forholde deg til at location hele tiden oppdateres) når sykkelen beveger seg, mens renter-koblingen endres når leieforhold innledes og avsluttes.

Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner.

Expand
titleLF

Bike skal potensielt lagre én lokasjon (GeoLocation) og én Person. Her spør vi kun om å implementere feltene, samt metoden for å sette inn og hente ut verdiene.

Code Block
public class Bike {
 @Override

 private GeoLocation location;
 private Person renter;

 public GeoLocation getLocation() {
  return location;
 }
 void setLocation(final GeoLocation location) {
  this.location = location;
 }
 public Person getRenter() {
  return renter;
 }
 void setRenter(final Person renter) {
  this.renter = renter;
 }


Vanlige feil:

 

Oppgave 1d) - BikeRental

BikeRental må holde oversikt over alle stasjonene, representert med GeoLocation, og alle syklene (Bike). Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Du skal ikke skrive metoder for å konfigurere systemet med stasjoner og sykler, men anta at slike finnes.

Expand
titleLF

Her skulle du skrive

Code Block

Vanlige feil:

 

Beskrivelse av oppgavene 1e og 1f


I første omgang skal du skrive forenklet kode for leie og retur av sykler, hvor det ikke tas hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie ser vi foreløpig bort fra. renter-assosiasjonen i Bike skal holde rede på hvem (Person) som evt. leier en sykkel (Bike). Du bestemmer selv hvor/hvordan du vil representere når leieforholdet starter og når det forventes at sykkelen leveres tilbake. Det viktigste er at informasjonen kan brukes når sykkelen leveres og leien skal beregnes og betales.

Expand
titleLF


Oppgave 1e) - BikeRental

Skriv metodene under i klassen BikeRental (se skjelettet til venstre for detaljene). Disse metodene bygger på representasjonen du valgte i 1d.

  • countAvailableBikesNearby - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
  • getStationNearby – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
  • getRentedBikes – returnerer alle syklene som er lånt ut
  • getUnreturnedBikes – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter)  (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
Expand
titleLF


Code Block

Vanlige feil:

 


Oppgave 1f) - BikeRental (mer)

Skriv metodene rentBike og returnBike i klassen BikeRental (se skjelettet for detaljene, merk spesielt krav om utløsing av unntak). Disse metodene endrer tilstanden som brukes av de foregående metodene. Velg selv passende unntakstype(r).

LocalDateTime brukes for å representere tid (erstatter Date i moderne Java). Gjør nødvendige antakelser om metoder den har, som trengs for tidsberegninger, og bruk disse antakelsene.


rentBike – kalles når en person starter å leie en gitt sykkel
returnBike – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time)

Expand
titleDel 1 – BikeRental-, Bike-, og Location-klassene (35%)
Expand
titleLF


 




Trikset her er å skjønne at terningverdiene skal komme i samme rekkefølge som det en får fra getDieValue med stigende indekser. Her blir altså logikken helt uavhengig av hvordan terningsverdiene er representert internt i Dice-klassen.

Expand
titleDel 2 – Gebyr og kvittering (20%)

BikeRental-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid. I tillegg skal det lagres nok data om dette, så en kan få skrevet ut en kvittering med forklaring på hvordan prisen framkom.


Oppgave 2a)

Forklar med tekst og/eller kode hvordan du vil lagre informasjon om evt. forlengelser av leieforholdet, slik at systemet har nok informasjon til å kunne

Expand
titleLF
Code Block

Vanlige feil: ...

Oppg
Expand
titleLF
Code Block
public class DiceIterator implements Iterator<Integer> {
	private final Dice dice;
	private int dieNum = 0;

	public DiceIterator(final Dice dice) {
		this.dice = dice;
	}

	@Override
	public boolean hasNext() {
		return dieNum < dice.getDieCount();
	}

	@Override
	public Integer next() {
		final int value = dice.getDieValue(dieNum);
		dieNum++;
		return value;
	}
}

Vanlige feil: