Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

0.00: INFORMASJON

Dette er en gammel og utdatert Trix-side!

Dersom du ser etter oppgaver for IN1010, finner du disse i eget kurs på Trix-forsiden. Disse oppgavene tilhører kurset IN_F_1010, som gikk siste gang våren 2017.

01.1: Person.java

a) Skriv en klasse Person som inneholder en privat instansvariabel navn av typen String.

b) Skriv en konstruktør i klassen Person som tar en tekststreng som parameter, og setter denne inn som personens navn.

c) Skriv et fullstendig program som oppretter to Person-objekter. Du velger selv navn på personene.

d) Tegn datastrukturen slik den ser ut etter utført program.

01.2: Hus.java

a) Opprett en klasse Hus, og utvid Person.java fra oppgave 1.1 slik Person har en referanse til et objekt av denne.

b) Skriv og utfør et fullstendig program som oppretter et Person-objekt og etHus-objekt, og la personen eie dette huset. Tegn datastrukturen slik den utvikler seg mens programmet utføres. (Her vil du ikke få noe utskrift som indikerer at programmet er riktig).

c) Utvid programmet slik at også huset vet hvem eieren er. Skriv til slutt ut navnet på personen som eier huset. Tegn datastrukturen slik den utvikler seg mens programmet utføres.
Hint: La Hus-objektet være slik at det inneholder en peker til et Person-objekt

d) I oppgavene over skulle du lage to objekter som peker på hverandre. Diskuter når du kan sette slike pekere i konstruktøren, og når du må gjøre det ved hjelp av egne metoder. Diskuter også hva som skjer om pekerne er private og når de ikke er det (public).

e) Skriv programmer som gjør begge deler (dvs. setter flest mulig peker i konstruktørene kontra det å sette alle pekerne senere (f.eks. ved hjelp av metoder). Tegn og forklar.

Vis løsningsforslag
class Hus{
    private Person eier;

    public void settEier(Person p) {
        eier = p;
    }
}

01.3: Beholder.java

I denne oppgaven skal vi lage en beholder som skal kunne holde på elementer av vilkårlig type. Vi kommer til å opprette klassene Kvadrat.java, Sirkel.java og KvadratBeholder.java for å teste denne.

a) Start med å skrive en klasse Kvadrat. Et kvadrat har en sidelengde som er av typen double, og denne skal være deklarert private. Kvadrat skal ha to offentlige metoder, en til å beregne omkrets, og en til å beregne areal.

b) Dette er en uferdig beholder for kvadratobjekter:

public class KvadratBeholder {

    private ??? kvadrat;

    public ??? settInn(??? kvadrat) {
        this.kvadrat = kvadrat;
    }

    public ??? taUt() {
        return this.kvadrat;
    }
}

Fyll inn for de fire ???.

c) Skriv en klasse Sirkel, denne kan være helt tilsvarende Kvadrat, men skal ha en radius i stedet for sidelengde.
(Hint: Du kan bruke Math.PI for å få en god tilnærming til verdien av pi)

d) Vi ønsker å ha en beholder for sirkler også. Istedet for å skrive en beholder for sirkler kan vi generalisere kvadrat-beholderen slik at den kan holde på et objekt av vilkårlig type. Dette kan vi gjøre ved å skrive beholderen som en parametrisert klasse. Skriv klassen Beholder.

01.4: Parkeringsplass.java

I denne oppgaven lager vi klassene Bil.java og Motorsykkel.java, for å teste beholderen vår.

I denne oppgaven skal vi lage en klasse for å modellere en parkeringsplass. På parkeringsplassen kan både biler og motorsykler parkere. Dette må vi ta høyde for i programmet vårt.

a) Opprett klassen Bil.java. Hver bil skal inneholde informasjon om registreringsnummer og antall passasjerseter.

b) Opprett klassen Motorsykkel.java. Hver motorsykkel skal inneholde informasjon om registreringsnummer og motorstørrelse i kubikkcentimeter (avrundet til nærmeste heltall).

c) Skriv klassen Parkeringsplass.java. Klassen skal være generisk, slik at både biler og motorsykler kan benytte parkeringsplassen. Parkeringsplassen må inneholde en peker til kjøretøyet som er parkert på plassen, samt offentlige metoder for å parkere kjøretøy, og kjøre parkerte kjøretøy ut av parkeringsplassen.

01.5: Parkeringshus.java

I denne oppgaven trenger du klassene Bil.java, Motorsykkel.java og Parkeringsplass.java fra forrige oppgave.

Vi skal nå modellere et parkeringshus. Parkeringshuset vårt skal ha to etasjer, og det er 10 plasser i hver etasje.

a) Skriv klassen Parkeringshus.java. Klassen skal inneholde to arrayer, etasje1 og etasje2 av pekere til objekter av Parkeringsplass. Hver array skal ha 10 plasser.

b) Skriv et fullstendig program som gjør følgende:

  • Opprett tre biler og tre motorsykler
  • Opprett parkeringsplasser i første og andre etasje, og parker to bilene og motorsyklene på plassene. Du velger selv hvilke som skal stå hvor. (Tips: Husk at klasseparameteren til de nyopprettede parkeringsplassene må stemme overens med typen av kjøretøy som skal parkere på plassen).
  • La alle motorsyklene kjøre ut av parkeringshuset. Husk å sette pekerne til parkeringsplass-objektene de har stått på til null, slik at man evt. kan opprette nye parkeringsplasser med annen generisk parameter her, om man trenger plassen senere.

c) Tegn datastrukturen slik den ser ut etter endt kjøring av programmet du skrev i b.

02.1 Grensesnitt for geometriske former

a) Vi skal lage et grensesnitt for geometriske former. Dokumentasjonen er gitt:

/**
* Grensesnittet <code>Figur</code> gir metoder for å
* beregne areal og omkrets.
*/
???

    /**
    * Beregner en figurs areal.
    * @return figurens areal.
    */
    ???

    /**
    * Beregner en figurs omkrets.
    * @return figurens omkrets.
    */
    ???
}

Skriv grensesnittet i henhold til dokumentasjonen.

b) Lag klassene Kvadrat og Sirkel.

Start med å skrive en klasse Kvadrat. Et kvadrat har en sidelengde som er av typen
double, og denne skal være deklarert private. Kvadrat skal ha to offentlige metoder,
en til å beregne omkrets, og en til å beregne areal.

Skriv en klasse Sirkel, denne kan være helt tilsvarende Kvadrat, men skal ha en radius istedenfor sidelengde.

(Hint: i Java kan vi bruke Math.PI som en god tilnærming til π.)

Utvid disse til å implementere grensesnittet fra deloppgave a.

c) Vi kan finne summen av arealet og omkretsen til alle kvadrater og sirkler slik:

public class Test {

    public static void main(String[] args) {

        Kvadrat[] kvadrater = {new Kvadrat(1), new Kvadrat(2), new Kvadrat(3)};
        Sirkel[] sirkler = {new Sirkel(4), new Sirkel(5), new Sirkel(6)};

        double totaltAreal = 0, totalOmkrets = 0;
        for (Kvadrat k : kvadrater){
            totaltAreal += k.areal();
        }
        for (Kvadrat k : kvadrater){
            totalOmkrets += k.omkrets();
        }
        for (Sirkel s : sirkler){
            totaltAreal += s.areal();
        }
        for (Sirkel s : sirkler){
            totalOmkrets += s.omkrets();
        }
        System.out.println("totaltAreal:\t" + totaltAreal);
        System.out.println("totalOmkrets:\t" + totalOmkrets);
    }
}

Skriv om programmet slik at en kun bruker én for-each løkke. Programmet skal gi følgende utskrift:

totaltAreal: 255.9026343264141
totalOmkrets: 118.2477796076938

02.2 Grensesnitt i Javas API (Comparable<T>)

Vi skal her se på et eksempel på et grensesnitt som implementeres av over hundre klasser i Javas bibliotek. Grensesnittet Comparable gir en garanti for at det finnes en metode compareTo(), som kan sammenligne dette (eller this) med et annet objekt.
Hvis vi antar at a og b er av samme type, og den typen implementerer Comparable er:

    a.compareTo(b) < 0 - sant dersom a < b
    a.compareTo(b) > 0 - sant dersom a > b
    a.compareTo(b) == 0 - sant dersom a = b

Når en skal implementere Comparable må en spesifisere hva en skal kunne sammenlignes med. Klassen String implementerer Comparable, det betyr at en String kun kan sammenlignes med andre objekter av typen String.

a) Opprett et String-array. Finn den største og den minste strengen i arrayen ved å bruke compareTo().

b) Skriv en klasse Person som skal implementere grensesnittet Comparable. Personen skal ha et navn og en alder, disse skal deklareres private. Personene skal sammenlignes etter alder. Opprett fem Person-objekter og legg disse i et array. Finn den eldste og den yngste
personen i arrayen.

c) Skriv om compareTo() i klassen Person slik at vi sammenligner personer ved hjelp av navn. Bruk de samme personobjektene som i deloppgave b og finn personen med det navnet som er hhv. først og sist i alfabetet.

d) Lag en beholder som kun kan holde på to objekter av vilkårlig type om gangen. Et objekt skal kun legges i beholderen dersom det er mindre enn det minste eller større enn det største objektet i beholderen. For å kunne avgjøre om et objekt er større eller mindre enn et annet må vi ha en garanti for at disse objektene kan sammenlignes med hverandre. Vi får dermed følgende klassesignatur:

public class MinMaksBeholder<E extends Comparable<E>> 

Koden > forteller oss at elementene vi legger i beholderen implementerer grensesnittet Comparable. Dette kravet tilfredsstilles av Person-klassen (fra deloppgave b), og kan derfor legges i beholderen.

Beholderen skal ha tre metoder, en for å legge til elementer, en for å hente ut det minste elementet og en for å hente ut det største elementet.

Du kan teste beholderen ved å legge til de samme personobjektene som i deloppgave b og c, og hente ut hhv. det minste og største elementet.

02.3 Grensesnitt for kjøtt- og planteetere

Vi skal lage en enkel modell av en næringskjede. På toppen av næringskjeden finnes rovdyrene og på bunnen finnes planteeterne.

a) Skriv to grensesnitt, et for rovdyr og et for planteetere. Rovdyrene skal kunne jakte, mens planteeterne skal kunne beskytte seg selv.

b) Skriv klassene Bjorn, Ulv, Elg og Sau som implementerer de riktige grensesnittene over. Opprett objekter av klassene og legg alle rovdyrene i en array av rovdyr, mens du legger alle planteeterne i en array av planteetere. Test programmet ditt.

02.4 Grensesnitt for motorkjøretøyer

Staten har bestemt at alle motorkjøretøyer (biler, busser, lastebiler osv) skal bli mer miljøvennlige. For å få til dette vil de ha informasjon om alle kjøretøyene og hvor mye CO2 de slipper ut. Derfor krever de at alle nye kjøretøy skal oppgi hvor mye CO2 de slipper ut i året. Denne informasjonen skal myndighetene lagre i et arkiv, for å senere beregne mengden av årlig CO2-utslipp. Som INF1010-student blir du bedt om å simulere dette i et dataprogram. Dette kan vi gjøre på følgende måte:

Vi skal deklarere et interface for miljøvennlige kjøretøy med en metode double mengdeCO2();

a) Skriv en klasse for miljøvennlige biler, miljøvennlige busser og miljøvennlige lastebiler som implementerer interfacet for miljøvennlige kjøretøy. Alle kjøretøyene skal ha informasjon om hvor mange liter bensin de bruker i året. En personbil bruker ca. 9000 liter, en buss ca. 18 000 og en lastebil ca. 12 000. For hver liter bensin et kjøretøy bruker, slippes det ut 2,32 kilo CO2. En bil skal i tillegg ha informasjon om antall seter, en buss om maks antall passasjerer, og en lastebil skal ha info om maksvekt av last.

b) Opprett en tabell som kan holde miljøvennlige objekter. I denne tabellen skal du legge flere miljøvennlige biler, busser og lastebiler.

c) Myndighetene vil beregne mengden CO2 som slippes ut fra bil-, buss- og lastebiltrafikk i året. Gå igjennom alle kjøretøyene i tabellen din og legg sammen det totale CO2-utslippet for et år.

d) I denne oppgaven skal vi finne mengdenCO2 som slippes ut per person. I denne oppgaven skal vi kun se på biler og busser. Vi antar at alle bilene og bussene er fulle, dvs. at i personbilen er alle setene fylt opp, og hver buss er lastet med et maks antall passasjerer. Regn ut hvor mye CO2 som slippes ut per person for alle bilene og bussene våre. Hva blir resultatet dersom du bytter ut noen av personbilene med en buss?

(Hint: Bruk operatoren instanceof til å finne ut om objektet ditt er en bil eller en buss.)

03.1 Virveldyr og pattedyr

Vi har fire klasser: Virveldyr, Pattedyr, Primat og Fisk. Noen klasser skal være subklasser av andre klasser. Vis forholdet mellom klassene ved å tegne et klassediagram.

03.2 Arv av variabler

Gitt følgende programkode:

class A {
    int x, y;
}

class C {
    int i, j;
}

class B extends A {
    int q;
}

Hvilken av klassene vil ha tilgang på flest variabler?

03.3 Geometriske figurer

Trekanter, sirkler, rektangler og kvadrater er alle geometriske figurer. For alle slike figurer skal det være mulig å beregne figurens areal.

a) Tegn et klassediagram som viser forholdet mellom de geometriske figurene.
(Hint: det bør bli fem klasser!)

b) Skriv programkode som gjenspeiler klassediagrammet fra deloppgave a.

c) Lag en tabell med geometriske figurer som skal inneholde:

  • En trekant med høyde 2 og bredde 3.
  • En sirkel med radius 3.
  • Et rektangel med bredde 3 og høyde 7.
  • Et kvadrat med sidelengde 4.

Summér arealet av de geometriske figurene. Svaret skal bli 68.2743.

03.4 Arv av egenskaper

Opprett to klasser A og B, hvor B er en subklasse av A. Begge klasser skal kun ha en metode som skriver ut hvilken klasse de befinner seg i. Opprett et objekt av typen B og la to pekere peke til dette objektet, en peker av type A og en av type B.

a) Kall på utskriftsmetoden for hver av de to pekerne. Forklar hva som skjer.

b) Kommenter vekk utskriftsmetoden fra klassen A. Hva skjer?

c) Fjern kommenteringen fra utskriftsmetoden i A, men kommenter vekk utskriftsmetoden fra B. Hva skjer?

04.1 Bygninger

a) Lag en klasse Bygning og en subklasse Skyskraper. Deklarer konstruktører i begge klassene og la dem kun skrive ut en identifiserende tekst. Opprett et objekt av klassen Skyskraper og forklar med én setning hva som skjer.

b) Utvid konstruktøren i Skyskraper med et kall på super(), og forklar igjen med én setning hva som skjer.

c) Utvid konstruktøren i Bygning til å ta en parameter bruttoAreal (double), og utvid konstruktøren i Skyskraper til å ta to parametere bruttoAreal (double) og antallEtasjer (int). Hvilke forandringer må gjøres for at konstruktøren i Bygning skal bli kalt når et Skyskraper-objekt opprettes?

d) Er det mulig å kalle på konstruktører i superklassen ved hjelp av konstruktøren sitt navn?

04.2 Tomme klasser

Lag en klasse helt uten innhold, og opprett en instans av denne. Kall på dette objektet sin toString()-metode og skriv ut returverdien.

a) Hva slags informasjon blir skrevet ut på skjermen? Hvordan er dette mulig når det ikke er deklarert noen metode toString() i den tomme klassen?

b) Hvor mange metoder inneholder en tom klasse?

04.3 Abstrakte personer

Skriv et klassehierarki for personer, studenter, bachelorstudenter, masterstudenter, ansatte, forskere og professorer. En person har et navn og en alder, mens en student i tillegg har et kurs og et lærested. En bachelorstudent har ikke tilgang til lærestedet utenfor åpningstidene, mens en masterstudent kan komme inn når som helst. Ansatte har en timeslønn, mens forskere i
tillegg har et fagområde. En professor underviser i et gitt kurs i tillegg til å forske.

a) Tegn først et klassediagram av hierarkiet.

b) Implementer klassehierarkiet i Java. Hver klasse skal ha en konstruktør som tar i mot relevant informasjon og en utskritsmetode. Bruk abstrakte klasser og metoder.

c) Test programmet ditt ved å skrive et lite testprogram i main

04.4 Biler og busser

I denne oppgaven skal du lage et program som skal holde styr på data om motorkjøretøy av ulike slag (busser, personbiler og varebiler) og deres eiere.

For hvert kjøretøy - uansett slag - skal følgende data lagres:

  • Registreringsnummer (String)
  • Fabrikkmerke (String)
  • Eierens navn (String)

Alle kjøretøy har ulike registreringnummer. Du kan anta at alle eiere har ulike navn. Eierens navn er enten navnet til en person eller et firma. Programmet skal håndtere kjøretøy av følgende slag:

  • Busser. I tillegg til det som lagres for alle kjøretøy, skal det for hver buss lagres antall sitteplasser.
  • Personbiler, med antall sitteplasser.
  • Varebiler, med maksimal lastevekt.

For personbiler og varebiler skal programmet kunne beregne årsavgift, som for personbiler er konstant lik 3000 kroner, mens den for varebiler er lik 4 * maksimal lastevekt.

a) Deklarer klassene for kjøretøy, busser, biler, personbiler og varebiler med deklarasjoner av passende attributter (husk subklasser!). Alle klassene skal inneholde metoder for å lese inn og skrive ut data. For hver bil skal også årsavgiften skrives ut.

b) Lag et kommandostyrt program som holder styr på data om kjøretøy. Programmet skal kunne håndtere kommandoer for å:

  • Registrerer nytt kjøretøy, etter å ha spurt brukeren om typen kjøretøy.
  • Skrive ut alle data om kjøretøyet hvis det finnes, etter å ha spurt bruken om et registreringsnummer.
  • Summere registreringsavgiften for alle biler registrert på en eier, etter å ha spurt brukeren om et navn (på person eller firma).

05.1: Butikk.java

Vi skal nå lage en kø i en butikk.

a) Lag en klasse Person. Den skal ha et navn, en tekst som angir hvilken gjenstand personen skal kjøpe og en peker til neste person. Et eksempel på en person:

Navn: Niels Henrik Abel
Gjenstand: Kladdebok med ruter
Neste person: Vilhelm Bjerknes

b) Lag en klasse Butikk som inneholder en peker til første person i køen. Den har en metode for å legge til personer i køen med signaturen:

public void entreButikk(Person p)

Butikk skal ha en metode kassa(), som ikke skal ha noen returverdi. Den skal betjene den første personen i køen fram til køen er tom. Dette skal gjøres ved å skrive ut hvem som står først i køen, samt hva de kjøper. Så skal denne personen fjernes fra køen ved at pekeren til første personen i køen flyttes til neste person (hvis det finnes noen).

Eksempelutskrift:

Niels Henrik Abel kjøper kladdebok med ruter.
- Hade bra!
Vilhelm Bjerknes kjøper termometer.
- Hade bra!
Sheldon Cooper kjøper lego.
- Hade bra!
Ingen flere kunder. Vi stenger butikken for i dag.

c) Skriv en klasse som inneholder main-metoden. Her skal du opprette 5 Person-objekter og legge til disse i køen i butikken. Test alt sammen ved å kalle metoden kassa().

05.2: KvadratStabel.java

Vi skal implementere en enkel stabel (eng: stack) som skal ha tre metoder:

  • leggPaa() - et element dyttes på toppen av stabelen.
  • taAv() - et element tas av toppen av stabelen og returneres. Hvis stabelen er tom skal den returnere null.
  • erTom() - returnerer sant hvis, og bare hvis, stabelen er tom.

a) Stabelen skal kunne ta vare på objekter av typen Kvadrat. Lag Kvadrat dersom du ikke har gjort det tidligere (del av oppgave 1.3).

b) Skriv klassen KvadratStabel med metodene leggPaa(), taAv() og erTom(). Klassen må også inneholde en indre klasse Node, som holder en peker til et Kvadrat. Nodene skal inneholde alle data i listen. leggPaa() skal legge en ny node med et kvadrat på toppen av stabelen, altså før forrige objekt som ble lagt til. taAv() skal ta av det øverste objektet og returnere dette.

public class TestKvadratStabel {
    public static void main(String[] args) {
        KvadratStabel stabel = new KvadratStabel();
        stabel.leggPaa(new Kvadrat(1));
        stabel.leggPaa(new Kvadrat(2));
        stabel.leggPaa(new Kvadrat(3));
        stabel.leggPaa(new Kvadrat(4));
        stabel.leggPaa(new Kvadrat(5));
        stabel.leggPaa(new Kvadrat(6));
        double sum = 0, siste = 0;
        while (!stabel.erTom()){
            Kvadrat k = stabel.taAv();
            sum += k.areal();
            siste = k.areal();
        }
        System.out.println("Summen av kvadratenes areal er "
                           + sum);
        System.out.println("Det siste kvadratet i stabelen har areal: " 
                           + siste);
    }
}