Mer objektorientert programmering

Like dokumenter
Innhold. INF1000 Høst Klasser og objekter. Uke 7: Mer objektorientert programmering Siri Moe Jensen

Fra problem til program

INF Løsning på seminaropppgaver til uke 8

Læreboken på 45 minutter

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Dagens tema Kapittel 8: Objekter og klasser

UNIVERSITETET I OSLO

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

INF Notat om I/O i Java

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Introduksjon til objektorientert programmering

IN Notat om I/O i Java

Enkel lesing og skriving i Java

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

UNIVERSITETET I OSLO

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

UNIVERSITETET I OSLO

Jentetreff INF1000 Debugging i Java

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

INF 1010, vår 2005 Løsningsforslag uke 11

Oblig 4Hybelhus litt mer tips enn i oppgaven

Fra Python til Java, del 2

TOD063 Datastrukturer og algoritmer

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

import java.io.*; import java.util.*; import javagently.text;

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Forelesning inf Java 5

Forelesning inf Java 5

INF1010 våren 2018 tirsdag 23. januar

Leksjon 7. Filer og unntak

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Leksjon 7. Filer og unntak

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1000 Prøveeksamen Oppgave 7 og 9

TDT4100 Objektorientert programmering

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

Å lese tall fra en fil, klassen Scanner

Løse reelle problemer

Java-kurs. Andreas Knudsen Nils Grimsmo 9th October 2003

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

INF Obligatorisk innlevering 7

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF1000 undervisningen INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

INF1010 våren januar. Objektorientering i Java

INF2100. Oppgaver 26. september til 1. oktober 2007

UNIVERSITETET I OSLO

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Blokker og metoder INF1000 (Uke 6) Metoder

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Løsningsforslag Test 2

INF1000: noen avsluttende ord

INF Obligatorisk innlevering 6

HØGSKOLEN I SØR-TRØNDELAG

Eksempel 1 Eksempel 2 Dramatisering. INF1000 uke 3. Sundvollen 7. september 2015 Dag Langmyhr. INF1000 Sundvollen

Leksjon 7. Filer og unntak

INF Uke 10. Ukesoppgaver oktober 2012

Objektorientert Programmering Ekstraordinær eksamen 2014

Repetisjon. INF gruppe 13

INF1000 : Forelesning 4

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

Avdeling for ingeniørutdanning Institutt for teknologi

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000: Forelesning 6. Klasser og objekter del 1

Post-it spørsmål fra timen (Arv og subklasser)

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Kapittel 8: Programutvikling

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

INF1000-SIKT - Notat om I/O i Java

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

Eksamen. Objektorientert Programmering IGR 1372

INF våren 2017

Programmering Høst 2017

Kapittel 5: Objektkommunikasjon

Gjennomgang av eksamen H99

Transkript:

Mer objektorientert programmering Klasser og objekter En klasse med konstruktør og en array Innkapsling En klasse med datafil og kommandoløkke Klassen ArrayList

Hva er hva? Klasser og objekter Det er viktig å ha klart for seg hva som er hva: En klasse er en arbeidsbeskrivelse for hvordan man skal lage objekter. Det finnes alltid nøyaktig ett eksemplar av klassen når programmet kjører. Objekter er instanser laget utifra beskrivelsen i en klasse. Når programmet starter, er det ingen objekter; de lages etter hvert med new. Derfor kan det være vilkårlig mange objekter av hver klasse.

Hva er hva? Objektvariabler og -metoder class C { private int v; int f(int x) { :... new C()... new C()... class C v int int f(int x) C v 0 int int f(int x) C v 0 int int f(int x)

Hva er hva? Klassevariabler og -metoder C v class C { private static int v; static int f(int x) { :... new C()... new C()... class C v 0 static int static int f(int x) static int static int f(int x) C v static int static int f(int x)

Hva gjør en timer? Eksempel 1: En timer En timer varsler når en gitt tid har gått.

Steg 1 Steg 1: Hvilke klasser trenger vi? Svaret er innlysende: class Timer.

Steg 2 Steg 2: Hva er grensesnittet? Hva hvis vi jobber med flere ting samtidig? Hadde det ikke vært fint å ha flere klokker i den samme timer? Tenk om vi bare kunne skrive og så hadde vi fire klokker. new Timer(4) Dette gjøres i Java med en konstruktør med parametre: Konstruktør med antall klokker: Timer(int antallklokker) {... (En konstruktør ligner på en metode, men har intet navn, kun klassenavnet.)

Steg 2 Resten av grensesnittet Velge klokke: void nesteklokke() {... Stille tiden for valgte klokke: void stilltid(int m, int s) {... Starte valgte klokke: void start() {... Stoppe valgte klokke: void stopp() {... Ta imot klokkesignal hvert sekund: void tikk() {... Vise gjenværende tid for valgte klokke: public String tostring() {...

Steg 2 Å kunne skrive ut seg selv Det er veldig nyttig å kunne skrive ut seg selv; alle klasser bør kunne det. Dette ordnes i Java ved å definere public String tostring() {... Når vi skjøter sammen tekster med +, er det faktisk elementenes tostring()-resultater vi bruker. Eksempel Timer t = new Timer(1); System.out.println("Tiden er " + t.tostring()); System.out.println("Tiden er " + t); // Det samme!

Steg 3 Steg 3: Representasjonen Hva må vi lagre? Tiden i minutter og sekunder for hver klokke: private int[] min; private int[] sek; Hvilken klokke ser vi nå på skjermen? private int denneklokke; Hvilke klokker er aktive nå? private boolean[] aktiv;

Steg 4 Steg 4: Skriv ferdig grensesnittmetodene class Timer { private int[] min; private int[] sek; private boolean[] aktiv; private int denneklokke; Timer(int antallklokker) { min = new int[antallklokker]; sek = new int[antallklokker]; aktiv = new boolean[antallklokker]; denneklokke = 0; public String tostring() { return "[" + denneklokke + "] " + min[denneklokke] + ":" + sek[denneklokke];

Steg 4 void stilltid(int m, int s) { min[denneklokke] = m; sek[denneklokke] = s; void start() { aktiv[denneklokke] = true; void stopp() { aktiv[denneklokke] = false; void nesteklokke() { denneklokke++; if (denneklokke >= aktiv.length) { denneklokke = 0;

Steg 4 void tikk() { for (int i = 0; i < aktiv.length; i++) { if (aktiv[i]) { if (sek[i] > 0) { sek[i]--; else if (min[i] > 0) { min[i]--; sek[i] = 59; if (min[i]==0 && sek[i]==0) { System.out.print("ALARM #" + i); aktiv[i] = false;

Alltid lurt å teste! Et testprogram class TestTimer { public static void main(string[] arg) { Timer t = new Timer(2); t.stilltid(0, 10); t.stilltid(0, 20); t.nesteklokke(); System.out.println(t); t.nesteklokke(); System.out.println(t); t.start(); t.start(); t.nesteklokke(); for (int i = 1; i <= 25; i++) { System.out.print("."); t.tikk(); System.out.println(); Kjøring $ java TestTimer [1] 0:20 [0] 0:10...ALARM #0...ALARM #1...

Innkapsling er en flott egenskap ved objektorientert programmering Innkapsling I klassen Timer valgte vi å representere tiden med to verdier: minutter og sekunder. Kunne vi valgt noe annet? I klasser er svaret: selvfølgelig! Hva må endres for å lagre tiden bare som sekunder?

Innkapsling er en flott egenskap ved objektorientert programmering class Timer { private int[] min; private int[] sek; private boolean[] aktiv; private int denneklokke; Timer(int antallklokker) { min = new int[antallklokker]; sek = new int[antallklokker]; aktiv = new boolean[antallklokker]; denneklokke = 0; public String tostring() { return "[" + denneklokke + "] " + min[denneklokke] + ":" + sek[denneklokke]; void stilltid(int m, int s) { min[denneklokke] = m; sek[denneklokke] = s; void start() { aktiv[denneklokke] = true; void stopp() { aktiv[denneklokke] = false; class Timer2 { private int[] sek; private boolean[] aktiv; private int denneklokke; Timer2(int antallklokker) { sek = new int[antallklokker]; aktiv = new boolean[antallklokker]; denneklokke = 0; public String tostring() { return "[" + denneklokke + "] " + (sek[denneklokke]/60) + ":" + (sek[denneklokke]%60); void stilltid(int m, int s) { sek[denneklokke] = 60*m + s; void start() { aktiv[denneklokke] = true; void stopp() { aktiv[denneklokke] = false;

Innkapsling er en flott egenskap ved objektorientert programmering void nesteklokke() { denneklokke++; if (denneklokke >= aktiv.length) { denneklokke = 0; void tikk() { for (int i = 0; i < aktiv.length; i++) { if (aktiv[i]) { if (sek[i] > 0) { sek[i]--; else if (min[i] > 0) { min[i]--; sek[i] = 59; if (min[i]==0 && sek[i]==0) { System.out.print("ALARM #" + i); aktiv[i] = false; void nesteklokke() { denneklokke++; if (denneklokke >= aktiv.length) { denneklokke = 0; void tikk() { for (int i = 0; i < aktiv.length; i++) { if (aktiv[i]) { if (sek[i] > 0) { sek[i]--; if (sek[i] == 0) { System.out.print("ALARM #" + i); aktiv[i] = false;

Innkapsling er en flott egenskap ved objektorientert programmering Dette er det fine med innkapsling: Innkapsling Siden representasjonen og innmaten i grensesnittmetodene er innkapslet, kan de endres uten at det affiserer kode som benytter klassen.

Hvordan holde oversikt over DVDene sine Eksempel 2: Et DVD-arkiv Vi ønsker oss et arkiv over DVDene våre, med muligheter til å redigere arkivet. Designvalg Vi vil lagre arkivet på disk mellom hver gang vi benytter det. Vi vil ha et program der vi kan gi kommandoer som så blir utført av programmet.

Lesing og skriving mot disk Lesing fra fil Linux-programmet cat skriver ut innholdet av en tekstfil; dette programmet gjør det samme: import java.util.scanner; import java.io.*; class Cat { public static void main(string[] arg) throws Exception { File f = new File(arg[0]); if (f.exists()) { Scanner s = new Scanner(f); while (s.hasnextline()) { String t = s.nextline(); System.out.println(t); s.close();

Lesing og skriving mot disk Skriving til fil import java.io.*; void m() throws Exception { PrintWriter f = new PrintWriter("filnavn");... f.print("a");... f.println("z");... f.close();

Lesing og skriving mot disk Fase 1: Hvilke klasser trenger vi? Det virker naturlig å ha tre klasser: class DVD for å lagre data om en DVD class DVDArkiv for å representere et arkiv class TestDVDArkiv for å sjekke det vi har skrevet

class DVD Klassen DVD Fase 2: Grensesnitt Konstruktør med angitt DVD-tittel: DVD(String n) {... Vise tittel: public String tostring() {... Fase 3: Representasjon Navnet på DVDen: private String navn;

class DVD Fase 4: Implementasjon class DVD { private String navn; DVD(String n) { navn = n; DVD.java public String tostring() { return navn;

class DVDArkiv Klassen DVDArkiv Steg 2: Grensesnitt Konstruktør med filnavnet der arkivet lagres: DVDArkiv(String navn) {... Navnet på arkivet (til f eks utskrift): public String tostring() {... Les arkivet inn fra disk: void lesarkiv() throws Exception {... Skriv arkivet tilbake til disk: void skrivarkiv() throws Exception {... Utfør kommandoer brukeren gir: void utfoerkommandoer() {...

class DVDArkiv Steg 3: Representasjon Navnet på arkivet (dvs filnavnet der det ligger lagret): private String arkivnavn; Alle DVDene: private DVD[] arkiv; Antall DVDer: private int antall;

class DVDArkiv Kommandoløkke Mange programmer som kommuniserer bruker, gjør det med en kommandoløkke: brukeren gir én og én kommando som programmet utfører. while (true) { «Be om en kommando.» «Les en kommando.» if (kommando.startswith("...")) { «Utfør kommandoen.» else if (kommando.startswith("...")) { «Utfør kommandoen.» else { «Gi melding om ulovlig kommando.» Husk at minst én kommando må avslutte løkken med f eks en return.

class DVDArkiv Steg 4: Resten av koden import java.util.scanner; import java.io.*; DVDArkiv.java class DVDArkiv { private String arkivnavn; private DVD[] arkiv = new DVD[1000]; private int antall = 0; DVDArkiv(String navn) { arkivnavn = navn; public String tostring() { return "DVD-arkivet " + arkivnavn;

class DVDArkiv void lesarkiv() throws Exception { File f = new File(arkivnavn); if (f.exists()) { Scanner s = new Scanner(f); while (s.hasnextline()) { arkiv[antall] = new DVD(s.nextLine()); antall++; s.close(); System.out.println("Arkivet " + arkivnavn + " er lest."); else { System.out.println("Nytt arkiv " + arkivnavn + " opprettet.");

class DVDArkiv void skrivarkiv() throws Exception { PrintWriter p = new PrintWriter(arkivnavn); for (int i = 0; i < antall; i++) { p.println(arkiv[i]); p.close();

class DVDArkiv void utfoerkommandoer() { Scanner s = new Scanner(System.in); while (true) { System.out.println(); System.out.println("Gi en kommando:"); System.out.println(" A (Avslutt)"); System.out.println(" N (Ny DVD)"); System.out.println(" V (Vis oversikt)"); System.out.print("Kommando: "); String kommando = s.nextline(); if (kommando.startswith("a")) { return; else if (kommando.startswith("n")) { System.out.print("DVDens navn: "); arkiv[antall] = new DVD(s.nextLine()); antall++; else if (kommando.startswith("v")) { for (int i = 0; i < antall; i++) { System.out.println(i + ". " + arkiv[i]); else { System.out.println(" " + kommando + " er en ulovlig kommando!");

Klassen TestDVDArkiv Testprogrammet TestDVDArkiv.java class TestDVDArkiv { public static void main(string[] arg) throws Exception { DVDArkiv a = new DVDArkiv("dvd-arkiv.text"); a.lesarkiv(); a.utfoerkommandoer(); a.skrivarkiv();

Og her er resultatet: Kjøringen $ javac TestDVDArkiv.java $ java TestDVDArkiv Arkivet dvd-arkiv.text er lest. Gi en kommando: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: Vis 0. Ringenes herre 1-3 1. Harry Potter 1-7 Gi en kommando: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: Ny DVDens navn: Hobbiten 1-3 Gi en kommando: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: Vis 0. Ringenes herre 1-3 1. Harry Potter 1-7 2. Hobbiten 1-3 Gi en kommando: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: Avslutt

Hva hvis vi ennå ikke har noe å peke på? Peker til ingenting Når vi opprettet arrayen private DVD[] arkiv = new DVD[1000]; hva peker alle elementene i arkiv på før vi tilordner noe? Svaret er: ingenting. I Java heter det null.

Hva om vi glemmer det? Et eksempel med feil class Feil { public static void main(string[] arg) { DVD[] arkiv = new DVD[10]; System.out.println("Min eldste DVD er " + arkiv[0].tostring()); $ javac Feil.java $ java Feil Exception in thread "main" java.lang.nullpointerexception at Feil.main(Feil.java:5) Da må vi finne ut hvor feilen skjedde og hvorfor.

Hva er bra med arrayer? Arrayer Arrayer er en usedvanlig nyttig mekanisme så alle programmeringsspråk har dem. Enkel og klar notasjon: a[i] u Rask i bruk d Må oppgi antallet elementer når arrayen lages Hvis antallet er for stort, sløser vi med plassen. d Hvis det er for lite, krasjer programmet

Kan noen forbedre arrayer? Klassen ArrayList Biblioteksklassen ArrayList er et forsøk på forbedre arrayer: String[] a = new String[100]; int antall = 0; a[0] = "Bergen"; a[1] = "Oslo"; s = a[1]; n = antall; antall++; antall++; import java.util.arraylist; ArrayList<String> a = new ArrayList<>(); a.add("bergen"); a.add(1, "Oslo"); s = a.get(1); n = a.size();

Kan noen forbedre arrayer? u Vi trenger ikke oppgi størrelsen; et ArrayList-objekt vil øke i størrelse automatisk. d Litt kronglete notasjon. d Fungerer best for å lagre pekere; verditypene int, float etc må gis særbehandling. Det er opp til deg som programmerer å velge hva du foretrekker.