eksamenssett
.no
Tren målrettet
Ungdomsskole/VGS
Høyskole
Ressurser
Skolenyttig
Forum
eksamenssett
.no
Tren målrettet
Ungdomsskole/VGS
Høyskole
Ressurser
Skolenyttig
Forum
eksamenssett
.no
Tren målrettet
Ungdomsskole/VGS
Høyskole
Ressurser
Skolenyttig
Forum
IN1010
Cheat Sheet
Formler, begreper og oppsummering
Objektorientert programmering
eksamenssett.no
Formler
Klassehierarki
•
class Sub extends Super { ... }
•
abstract class Navn { abstract returtype metode(); }
•
interface Navn { returtype metode(); }
•
class A extends B implements C, D { ... }
•
super(parametere); // forste linje i konstruktor
Tilgangsmodifikatorer
•
private: kun egen klasse
•
protected: egen klasse + subklasser + samme pakke
•
(ingen): samme pakke (package-private)
•
public: tilgjengelig overalt
Lenket liste-operasjoner
•
Innsetting forst: ny.neste = forste; forste = ny;
•
Innsetting sist: siste.neste = ny; siste = ny;
•
Uttak forst: temp = forste; forste = forste.neste; return temp;
•
Toveis: oppdater bade neste og forrige ved alle operasjoner
Viktige grensesnitt
•
Comparable
: int compareTo(T other) -> negativt/0/positivt
•
Iterable
: Iterator
iterator()
•
Iterator
: boolean hasNext(), T next()
•
Runnable: void run()
Flertrading
•
extends Thread -> overstyr run() -> kall start()
•
synchronized void metode() { ... }
•
wait() -- sov og slipp lasen (i synchronized)
•
notifyAll() -- vekk ventende trader (i synchronized)
•
Thread.sleep(ms) -- sov i ms millisekunder (try-catch pabudt!)
Generics
•
class Navn
{ T felt; }
•
> -- begrenset type
•
Bruk wrapper-typer: Integer, Double, Boolean (ikke int, double, boolean)
•
Kan IKKE: new T[n], instanceof T
Nøkkelformler per tema
Arv og polymorfisme
•
class Subklasse extends Superklasse { ... }
•
abstract class Navn { abstract void metode(); }
•
super(parametere) -- kall superklassens konstruktor
•
@Override -- markerer at metoden overstyrer superklassens versjon
•
instanceof -- sjekker om et objekt er av en bestemt type
Grensesnitt (interface)
•
Comparable
: int compareTo(T other) -- negativt/0/positivt
Generics
•
class Navn
{ T felt; ... } -- generisk klasse
•
> -- begrenset typeparameter
•
Prioritetskoe
-- generisk ko der T er elementtypen
•
Type erasure: T erstattes med Object ved kompilering
•
Kan IKKE skrive: new T[10] eller T instanceof ...
Lenkede lister
•
Enveis: Node { T data; Node neste; }
•
Toveis: Node { T data; Node neste; Node forrige; }
•
Innsetting sortert: traverser til p.neste > ny, sett inn etter p
•
Uttak forst (O(1)): temp = forste; forste = forste.neste; return temp;
Rekursjon
•
Basistilfelle: betingelsen der rekursjonen stopper og returnerer direkte
•
Rekursivt kall: metoden kaller seg selv med et 'mindre' problem
•
Graftraversering: send med 'komFra'-parameter for a unnga sykler
•
Tretraversering: rekurser pa venstre og hoyre barn
•
Husk: hvert rekursivt kall legger en ramme pa kallstabelen
Unntakshandtering
•
throw new MinException("melding"); -- kast et unntak
•
try { ... } catch (ExType e) { ... } -- fang unntak
•
class MinException extends RuntimeException { ... } -- eget unntak
•
throws ExType -- deklarer at metoden kan kaste sjekket unntak
•
finally { ... } -- kjores alltid, enten unntak kastes eller ikke
Flertrading og synkronisering
•
class MinTraad extends Thread { public void run() { ... } }
•
traad.start() -- starter traden (IKKE traad.run()!)
•
synchronized void metode() { ... } -- gjensidig utelukkelse
•
wait() -- trad sover og slipper lasen (ma vaere i synchronized)
•
notifyAll() -- vekker alle ventende trader (ma vaere i synchronized)
Simulering og hovedprogram
•
public static void main(String[] args) { ... }
•
Simulator-lokken: hentUt -> oppdater tid -> handling -> settInn
•
Skog-konstruktoren: opprett kryss-array, deretter stier med tilfeldige endepunkter
•
Trekk.trekkInt(min, max) -- tilfeldig heltall i [min, max]
•
Math.random() * N gir tilfeldig double i [0, N)
Datastrukturer: stakker, koer og traer
•
Stakk (LIFO): push = legg til pa topp, pop = fjern fra topp
•
Ko (FIFO): enqueue = legg til bak, dequeue = fjern fra front
•
Binaert tre: Node { T data; Node venstre; Node hoyre; }
•
Preorder: rot -> venstre -> hoyre
•
Inorder: venstre -> rot -> hoyre (gir sortert for BST)
Vanlige feil å unngå
Arv og polymorfisme
•
Glemme a kalle super() i subklassens konstruktor nar superklassen ikke har parameterlos konstruktor.
•
Deklarere instansvariabler som private i superklassen og sa prove a aksessere dem direkte i subklassen -- bruk protected eller get-metoder.
•
Forveksle abstrakt klasse med grensesnitt. Abstrakte klasser kan ha tilstand (instansvariabler) og implementerte metoder.
•
Glemme @Override-annotasjonen. Den er ikke pabudt, men fanger skrivefeil i metodenavn ved kompilering.
Grensesnitt (interface)
•
Glemme a implementere alle metoder fra grensesnittet -- da kompilerer ikke klassen (med mindre den er abstrakt).
•
Forveksle interface med abstrakt klasse. Interface kan ikke ha instansvariabler (kun konstanter).
•
Skrive 'extends' i stedet for 'implements' nar en klasse skal implementere et grensesnitt.
•
Glemme a deklarere metoder i grensesnittet som public (de er implisitt public, men det er god praksis a skrive det).
Generics
•
Prove a opprette array med generisk type: new T[10] er ikke lovlig i Java. Bruk Object-array og cast, eller bruk ArrayList.
•
Glemme typeparameteren nar du instansierer: Prioritetskoe
ko = new Prioritetskoe<>(); (ikke bare new Prioritetskoe()).
•
Bruke == i stedet for compareTo() for a sammenligne generiske objekter.
•
Blande primitiv type (int, double) med generics. Bruk wrapper-klasser (Integer, Double) i stedet.
Lenkede lister
•
Glemme a oppdatere bade neste- og forrige-peker i toveis lenket liste. Alle fire pekere ma settes riktig ved innsetting.
•
Glemme spesialtilfellet: innsetting i tom liste, innsetting forst, eller innsetting sist.
•
Ikke nullstille neste/forrige-pekerne pa noder som tas ut av listen. Dette kan forarsake uventede effekter.
•
Miste referansen til resten av listen ved innsetting (glemme a sette ny.neste for du overtar p.neste).
Rekursjon
•
Glemme basistilfellet -- forer til uendelig rekursjon og StackOverflowError.
•
I graftraversering: glemme a holde styr pa besokte noder, slik at rekursjonen gar i sirkel.
•
Returnere feil verdi fra det rekursive kallet. Test med enkle eksempler for a verifisere logikken.
•
I V2021 oppgave 4: glemme at komFra-parameteren er nodvendig for a stoppe uendelig rekursjon i trestrukturer.
Unntakshandtering
•
Arve fra Exception nar oppgaven ber om RuntimeException-subklasse. Les oppgaveteksten noyaktig.
•
Glemme a kalle super(melding) i konstruktoren til det egendefinerte unntaket.
•
Fange for brede unntak (catch Exception) i stedet for den spesifikke unntakstypen.
•
Ikke validere input i konstruktorer og set-metoder -- dette er nettopp det oppgave 2f i V2021 handler om.
Flertrading og synkronisering
•
Kalle run() direkte i stedet for start(). Da kjorer koden i samme trad, ikke i en ny trad.
•
Bruke wait/notify utenfor synchronized-blokk. Dette gir IllegalMonitorStateException.
•
Bruke notify() i stedet for notifyAll() nar flere trader kan vente. notifyAll() er alltid trygt.
•
Glemme try-catch rundt Thread.sleep() og wait(). Begge kaster InterruptedException som ma fanges.
Simulering og hovedprogram
•
Glemme at simulatoren ma sette globaltid for handling() kalles -- ellers er tidsberegningen feil.
•
Ikke sette aktiviteten tilbake i koen etter handling(). Da simuleres den bare en gang.
•
I Skog-konstruktoren: glemme a legge stiene til i kryssenes datalister nar de opprettes.
•
Bruke Trekk.trekkInt feil: husk at begge grensene er inklusive.
Datastrukturer: stakker, koer og traer
•
Forveksle stakk (LIFO) og ko (FIFO). Stakk: inn og ut fra toppen. Ko: inn bak, ut foran.
•
Glemme a oppdatere 'siste'-pekeren i ko ved innsetting og uttak.
•
I binaert soketrae: glemme a returnere node-referansen etter rekursivt kall (nodvendig for a koble treet riktig).
•
Blande preorder, inorder og postorder. Husk: 'in' betyr at roten besookes mellom barna.
Eksamenstips
Arv og polymorfisme
•
Eksamen starter nesten alltid med 'tegn klassehierarkiet'. Bruk piler fra subklasse til superklasse, og stiplet linje til interface.
•
Nar oppgaven sier 'det er ingen forskjell pa klassene annet enn navnet' (som V2021), betyr det at subklassene er tomme bortsett fra konstruktoren.
•
Vis at du forstar polymorfisme ved a bruke superklassetypen i parametere og returtyper.
Grensesnitt (interface)
•
Oppgaven beskriver ofte en egenskap som 'noen klasser har' -- dette signaliserer et interface (f.eks. 'god utsikt' i V2021, 'MidtgangSete' i V2018).
•
Comparable dukker opp nesten hvert ar. Skriv compareTo riktig: returner this.felt - annen.felt for stigende rekkefølge.
•
Nar du tegner klassehierarki, bruk stiplet linje med pil for interface-implementering og heltrukket for arv.
Generics
•
V2018 ba eksplisitt om generisk prioritetsko. Skriv Node som indre klasse med data av type T og en int prioritet.
•
Nar oppgaven sier 'uten bruk av Javas bibliotek', ma du implementere alt fra bunnen av -- ingen ArrayList, HashMap osv.
•
Generics kombineres ofte med Comparable: du trenger T extends Comparable
for a sortere/prioritere elementer.
Lenkede lister
•
Prioritetskoen kommer nesten hvert ar. Oev pa a implementere bade enveis og toveis sortert lenket liste.
•
V2021 spesifiserte at settInn skal lete bakfra. Bade fremfra og bakfra er gyldige strategier, men folg oppgaveteksten.
•
Tegn alltid datastrukturen pa papir for du koder. Identifiser spesialtilfellene (tom liste, ett element, flere elementer).
Rekursjon
•
Identifiser basistilfellet forst. Skriv det som det forste i metoden, for det rekursive kallet.
•
Nar oppgaven ber om rekursiv metode, er det ALLTID en grunn. Bruk ikke lokker som erstatning.
•
V2021 oppgave 4 (10%) og V2019 oppgave 2d (20%) handlet begge om rekursjon. Dette gir mange poeng for relativt kort kode.
Unntakshandtering
•
Nar oppgaven sier 'kast et unntak (subklasse av RuntimeException)', lag en kort klasse med konstruktor som tar String og kaller super().
•
V2021 oppgave 2f (2%) er en typisk teorioppgave: forklar hvordan man gjor klassen mer robust. Svar: gjor feltet private, bruk setter med validering.
•
try-catch rundt Thread.sleep() og wait() er obligatorisk -- de kaster sjekket InterruptedException.
Flertrading og synkronisering
•
Trad-oppgaven er alltid siste deloppgave og gir 10-22% av poengene. Den bygger pa de tidligere oppgavene.
•
V2021 oppgave 3 (15%): konverter simulatoren til trader med synkroniserte sitteplasser. V2018 oppgave 10 (22%): monitor med produsent-konsument.
•
Monitor = klasse med synchronized metoder + wait/notify. Oev pa dette monsteret -- det kommer hvert ar.
•
Husk: main() trenger ikke vente pa at tradene blir ferdige (oppgaven sier dette eksplisitt).
Simulering og hovedprogram
•
Main-metoden (V2021 oppgave 2e, 9%) er enkel a skrive og gir mange poeng. Ikke hopp over den!
•
Folg oppgavetekstens oppskrift punkt for punkt. Den beskriver noyaktig hva main skal gjore.
•
Simulatoren fra V2021 er et elegant designmonster. Forsta det, for det kan komme lignende monstre i fremtiden.
Datastrukturer: stakker, koer og traer
•
Prioritetskoen pa eksamen er egentlig en sortert ko. Forstar du ko-operasjoner, klarer du ogsa prioritetskoen.
•
Tegn alltid datastrukturen for du implementerer. Spesielt for lenkede strukturer er det lett a miste pekere.
•
Stakk og ko implementeres ofte som indre del av storre oppgaver. Vit hvordan de fungerer, sa kan du bruke dem som byggeklosser.
IN1010 Formelark | Eksamenssett