Commit 261403e5 authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

Merge branch 'lf'

Conflicts:
	kont2019/src/bike/bike-rental.md
	kont2019/src/stuff/LambdaUtilities.java
	kont2019/src/stuff/stuff.md
parents 479ecee0 626302b3
......@@ -4,10 +4,12 @@ Dette er en prøve-eksamen, mye basert på [konten fra 2019](https://www.ntnu.no
Det deles ut en god del kode, noe skal bare forstås og noe skal bygges videre på. Vi har prøvd å markere med `// TODO`-kommentarer i koden, hvor det skal skrives mer kode. Bruk gjerne Eclipse sitt **Tasks**-panel for å se etter slike kommentarer, men husk at det ikke nødvendigvis er dekkende for hva som faktisk mangler! Vi har prøvd å redusere mengden skriving og verktøybruk, ut over produkt skriving av kode.
Oppgaven er del i to hoveddeler, den første er mange mindre småoppgaver som kan løses nokså uavhengig av hverandre, den andre er basert på caset fra 2019-konten.
Oppgaven er delt i to hoveddeler, den første er mange mindre småoppgaver som kan løses nokså uavhengig av hverandre, den andre er basert på caset fra 2019-konten.
Koden skal leveres _samlet_, ved at koden som er delt ut skal jobbes videre med, og til slutt pakkes i en zip-fil, som lastes opp. Hvis dere trenger kopi av originalkoden, så må dere ta den selv og legge den utenfor dette kodingsprosjektet.
Teorispørsmål besvares i en egen tekstfil, [svar.md](svar.md). Velg **Markdown Source** nederst til venstre, for å redigere. Du trenger ikke tenke på formattering, men vi har brukt markdown for å lage overskriften.
## Del 1 - småplukk
Denne delen er ment å teste veldig spesifikke ferdigheter. Oppgavene har varierende vanskelighetsgrad, men hver oppgave er nokså liten og skal ikke ta mange minuttene, om en vet hva en skal gjøre. Hvis en merker at en bruker mer tid, så kan det være lurt å bare gå videre.
......
......@@ -3,7 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tdt4100</groupId>
<artifactId>risk</artifactId>
<artifactId>kont2019</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
......
......@@ -35,7 +35,7 @@ public class BikeRental {
}
/**
* @return the bikes that are close to a station (within 30m), but still are rented
* @return the bikes that are close to a station (within 30 meters), but still are rented
*/
private Collection<Bike> getUnreturnedBikes() {
// TODO: del 1
......@@ -77,9 +77,17 @@ public class BikeRental {
* @param bike
* @param now the time the bike is returned
* @throws (some subclass of) RuntimeException if the bike isn't currently being rented by the person argument
* @throws (some subclass of) RuntimeException if person isn't near (within 30m of) a station
* @throws (some subclass of) RuntimeException if person isn't near (within 30 meters of) a station
*/
public void returnBike(final Person person, final Bike bike, final LocalDateTime now) {
// TODO: del 1
}
public static void main(final String[] args) {
// Some geo-locations to use in testing:
// In the hall outside F1: 63.416522, 10.403345
// By the entrance to Realfagsbygget closest to F1: 63.416017, 10.404729
// Another spot by the same entrance, closer than 30 meters: 63.416079, 10.404565
System.out.println(GeoLocation.distance(63.416017, 10.404729, 63.416079, 10.404565));
}
}
......@@ -12,7 +12,6 @@ Del 1 av oppgaven fokuserer på administrasjon av leieforholdet. Del 2 fokuserer
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet. Der det legges opp til at dere skal kommentere valg dere gjør er det naturlig at dere legger inn dette som kommentarer i koden knyttet til metodene eller klassene dere skriver om. Videre er det lagt opp til at du kan (og skal) gjøre naturlige antakelser, men vi ber dere om å gjøre rede for dem.
## Bør vi gjøre ferdig Person litt mer? Hvis ikke bør vi si til dem at det må gjøres ting i del 1.
## Del 1 - GeoLocation-, Bike- og BikeRental-klassene
Du skal i denne delen gjøre endringer i alle disse tre klassene.
......@@ -25,7 +24,7 @@ BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Både sta
**[Bike](Bike.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram: _(NB Hallvard: I skjelettet refererer vi til Location, ikke GeoLocation)_
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram:
![Klassediagram](part1.png)
......@@ -37,7 +36,7 @@ Begge disse assosiasjonene er dynamiske, dvs. både location og renter (låntake
[BikeRental](BikeRental.java) må holde oversikt over alle stasjonene, representert med [GeoLocation](GeoLocation.java), og alle syklene ([Bike](Bike.java)).
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven. Du vil også finne en main-metode med noen eksempler på stasjoner i Trondheim sentrum, bruk gjerne disse for å teste koden din.
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar (i en kode-kommentar) hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven. Du vil også finne en `main`-metode med noen eksempler på stasjoner i Trondheim sentrum, bruk gjerne disse for å teste koden din.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie skal derimot skje i slutten av denne delen. Assosiasjonen `renter` i [Bike](Bike.java) skal holde rede på hvem ([Person](Person.java)) som evt. leier en sykkel ([Bike](Bike.java)). 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.
......@@ -77,4 +76,4 @@ Prototypen er laget vha. FXML, se [BikeRental.fxml](BikeRental.fxml), og noe Jav
- Legg først til de Java-elementene (klasser, felt og metoder) som må finnes i koden som implementerer oppførselen (logikken) til appen
- Skriv koden som er nødvendig for å vise frem prisen, når tilsvarende knapp trykkes!
- Du skal _ikke_ implementere noe i forhold til kartet i seg selv. Dette er kun et bilde.
- Du skal _ikke_ implementere noe i forhold til kartet i seg selv. Dette er kun et bilde.
......@@ -23,7 +23,7 @@ public class LambdaUtilities {
}
/**
* Adds n elements from the provided supplier to col
* Adds n elements from the provided supplier to col and returns it.
* @param col
* @param n
* @param supplier
......@@ -46,7 +46,7 @@ public class LambdaUtilities {
}
/**
* Calls cons on all items in all elements
* Calls cons on all items in elements
* @param cons
* @param elements
*/
......@@ -56,11 +56,12 @@ public class LambdaUtilities {
}
/**
* Sums the result of applying op to consecutive elements of nums1 and nums2
* @param op
* @param nums1
* @param nums2
* @return the sum of the result of applying op to consecutive elements of nums1 and nums2
* Sums the result of applying the provided BinaryOperator op to pairs of consecutive elements of nums1 and nums2.
* If one of the sequences is longer than the other, you should drop the remaining elements.
* @param op the operator to apply on pairs of elements
* @param nums1 first set of elements
* @param nums2 second set of elements
* @return the sum of the result of applying op to pairs of consecutive elements of nums1 and nums2
*/
public static double zip(final BinaryOperator<Double> op, final List<Double> nums1, final Collection<Double> nums2) {
// TODO
......@@ -81,7 +82,7 @@ public class LambdaUtilities {
// 1
forEach(System.out::println, Arrays.asList("3", "2"), Arrays.asList("1"));
// Should print 13.0 (i.e. the sum of the products)
// Should print 13.0, i.e. the sum of the products
System.out.println(zip((n1, n2) -> n1 * n2, Arrays.asList(1.0, 2.5), Arrays.asList(3.0, 4.0)));
}
}
# Småplukk
<<<<<<< HEAD
## 1 - Iteratorer
Disse oppgavene dreier seg om ulik bruk av iteratorer.
=======
Med mindre noe annet er sagt, så skal klassen implementeres.
>>>>>>> refs/heads/lf
<<<<<<< HEAD
### 1.1 - StringBuilderCharacterIterator
=======
## 1 - Iterasjon med iteratorer
### 1.1 - for-each, Iterable og Iterator
Forklar med tekst og kode sammenhengen mellom for-each-syntaksen, altså den på formen `for (<type> <var> : <uttrykk>) ...`, og **Iterable** og **Iterator**-grensesnittene.
Skriv svaret i [svar.md](../../svar.md)-fila.
### 1.2 - StringBuilderCharacterIterator
>>>>>>> refs/heads/lf
[StringBuilderCharacterIterator](StringBuilderCharacterIterator.java)-klassen skal implementere en iterator av tegnene (Character) inni en `StringBuilder`. `StringBuilder` er en `String`-aktig klasse med den (viktige) forskjellen at instanser kan endres etter opprettelsen. Klassen testes av StringBuilderCharacterIteratorTest.
- Implementer StringBuilderCharacterIterator.
<<<<<<< HEAD
=======
### 1.3 - StringBooleanMetaIterator
>>>>>>> refs/heads/lf
<<<<<<< HEAD
### 1.2 - StringBooleanMetaIterator
Klassen [StringBooleanMetaIterator](StringBooleanMetaIterator.java) er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre. Den første itererer over strenger, den andre itererer over boolske verdier.
=======
[StringBooleanMetaIterator](StringBooleanMetaIterator.java)-klassen er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, en for `String` og en for `Boolean`, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre. De to iteratorene kan antas å være like lange.
>>>>>>> refs/heads/lf
Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er", "ikke", "kult"` og den andre gir ut `true, true, false, true` så skal StringBooleanMetaIterator-instansen gi ut `"meta-iteratorer", "er", "kult"`. Det tredje elementet (`"ikke"`) ble altså utelatt siden den tredje logiske verdien var `false`.
......@@ -20,27 +44,46 @@ Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er",
Klassen testes av StringBooleanMetaIteratorTest.
<<<<<<< HEAD
- Implementer StringBooleanMetaIterator.
- Du kan forvente at de to sekvensene (strenger og boolske verdier) er like lange.
### 1.3 - EverySecondMetaIterator og EverySecondMetaIteratorTest **(navn endret, la på Meta på begge)**
=======
### 1.4 - EverySecondMetaIterator og EverySecondMetaIteratorTest
>>>>>>> refs/heads/lf
[EverySecondMetaIterator](EverySecondMetaIterator.java) er også en meta-iterator. Den tar inn en annen iterator og slipper gjennom _annenhvert_ element.
<<<<<<< HEAD
Eksempel: Hvis iteratoren den tar inn gir ut `"1", "2", "3", "4"`, så skal EverySecondMetaIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondMetaIteratorTest](EverySecondMetaIteratorTest.java)-testklassen.
=======
Eksempel: Hvis iterator-argumentet gir ut `"1", "2", "3", "4"`, så skal EverySecondIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondMetaIteratorTest](EverySecondMetaIteratorTest.java)-testklassen.
>>>>>>> refs/heads/lf
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfellet. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfelle. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Din oppgave er skrive to testmetoder som identifiserer begge feilene (ved at testmetoden utløser unntak på vanlig testmetodevis):
<<<<<<< HEAD
- en testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på.
- en annen testmetoden skal identifisere den fundamentale feilen.
=======
- én testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på
- en annen testmetoden skal identifisere den fundamentale feilen
>>>>>>> refs/heads/lf
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
## 2 - Funksjonelle grensesnitt og lambda
<<<<<<< HEAD
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java). `main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
- Implementer metodene beskrevet i [LambdaUtilities](LambdaUtilities.java).
- Over hver metode i kildekoden finner dere en beskriver forventet oppførsel.
\ No newline at end of file
- Over hver metode i kildekoden finner dere en beskriver forventet oppførsel.
=======
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java) iht. det som står i javadoc-en over metodene. Metodesignaturene (parameter- og retur-typer) skal _ikke_ endres.
`main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
>>>>>>> refs/heads/lf
# Svar på teorispørsmål
Her besvares teorispørsmål. Hvis du bruker Eclipse, så velg **Markdown Source** nederst til venstre, for å redigere. Du trenger ikke tenke på formattering, men vi har brukt markdown for å lage overskriften.
### 1.1
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment