Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Relaterede dokumenter
class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Tree klassen fra sidste forelæsning

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Aritmetiske Forelæsning Pr ogrammering operatorer tir 1999 sda præcedens september 1999 Logiske Sammenligningsoperatorer operatorer præcedens

Eksempel: Skat i år 2000

Hanne Niels Edith Harald Carsten Jørgen Henrik.

DANMARKS TEKNISKE UNIVERSITET

Ugeseddel 4 1. marts - 8. marts

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Løsning af møntproblemet

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). if (udtryk) else

DM502. Peter Schneider-Kamp

Syntaks og syntaksgenkendelse, særligt regulære udtryk og tilstandsmaskiner og lidt om anvendelser i bioinformatik

Kursus navn: Indledende programmering Kursus nr

Forelæsning Uge 2 Torsdag

Skriftlig eksamen i Datalogi

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Rekursion og dynamisk programmering

Rekursion C#-version

Skriftlig eksamen i Datalogi

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

DRONNINGER (QUEENS) Opgave 1

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

Forelæsning Uge 4 Torsdag

Programmering. Udvidet Programmering. Kurserne. Kurset: programmering i sproget Java. Lærerne: Morten Larsen og Peter Sestoft

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Hvad er Objekter - Programmering

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag

Find største element, sæt det på sidste plads. Grundidé i hobsortering. er er

Forelæsning Uge 2 Mandag

Forelæsning Uge 1 Torsdag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 10

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Introduktion til funktioner, moduler og scopes i Python

Skriftlig eksamen i Datalogi

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

Forelæsning Uge 4 Mandag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Forelæsning Uge 1 Torsdag

BRP Kursusintroduktion og Java-oversigt

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Torsdag

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Virkefeltsregler i Java

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Forelæsning Uge 2 Torsdag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 6

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Opgaven fortsat. Opfølgning på Opgave 2 og Use Cases. Opgaven. Trin 1: Væsentlige begreber. Resultatliste: 100 bryst, herrer

Mere om tilfældige tal

Der er fejl i programmer. Ikke-trivielle programmer er næsten altid fejlbehæftede.

Skriftlig eksamen i Datalogi

Forelæsning Uge 2 Mandag

BRP Sortering og søgning. Hægtede lister

Databaseadgang fra Java

Forelæsning Uge 4 Torsdag

Forelæsning Uge 3 Torsdag

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

Software Construction 1 semester (SWC) Spørgsmål 1

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Dynamisk programmering

Forelæsning Uge 2 Mandag

Klasser og objekter. (Afsnit i manualen)

Procedurer og funktioner - iteration og rekursion

Java Klasse nedarvninger

Forelæsning Uge 3 Mandag

Programmering i C. Lektion november 2008

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Anvendelse af metoder - Programmering

Dynamisk programmering

Eksempel på en database: studenter, kurser, eksamener

Forelæsning Uge 3 Torsdag

Singleton pattern i Java

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

SWC eksamens-spørgsmål. Oversigt

Programmering og Problemløsning, 2017

Abstrakte datatyper C#-version

Danmarks Tekniske Universitet

Over Forelæsning omponenter ogrammering sigt 14, 1999 freda containere 15. oktober 1999 Eksempel: out GUI til beregning fakultet.

14.1 Internationale programmer

Programmering i C. Lektion september 2009

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Forelæsning Uge 5 Mandag

Opgaver. Oktober 2009

Forelæsning Uge 3 Mandag

Danmarks Tekniske Universitet

Test af It-komponent

3 Algebraisk Specifikation af Abstrakte Datatyper.

Transkript:

Programmering 1999 Forelæsning 5, tirsdag 14. september 1999 Oversigt Mere om klasser og objekter Klassefelter: static Konstante felter: final Indkapsling og synlighed: private og public Overlæsning af konstruktorer Klassen Random: pseudo-tilfældige tal Rekursion: metoder der kalder sig selv NB: Opgave java11 på løbeseddel 2 skal ikke afleveres i denne uge da stoffet ikke blev gennemgået sidste uge. Programmering 1999 KVL Side 5-1 Klassen Time: metoder Felter i objektet indeholder objektets tilstand. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden. int hours, min; // since midnight Time(int hours, int min) { this.hours = hours; this.min = min; String twodigits(int n) { return "" + (n / 10) + (n % 10); public String tostring() { return twodigits(hours) + "." + twodigits(min); Time plus(int min) { int totalmin = 60 * this.hours + this.min + min; return new Time(totalmin / 60, totalmin % 60); int to(time t) { return 60 * t.hours + t.min - 60 * hours - min; boolean before(time t) { return hours < t.hours hours == t.hours && min <= t.min; Programmering 1999 KVL Side 5-2 Eksempel på brug af Time-objekter public class Time2 { Time t1, t2; t1 = new Time(12, 35); System.out.println("t1 er " + t1.tostring()); t2 = t1.plus(40); System.out.println("t2 er " + t2); System.out.println("t1 før t2 er " + t1.before(t2)); System.out.println("fra t1 til t2 er der " + t1.to(t2) + " minutter"); System.out.println("t1 er stadig " + t1); Prik-notationen t1.plus(40) betyder: kald metoden plus i det objekt som t1 henviser til. Udtrykket ("t2 er " + t2) betyder det samme som ("t2 er " + t2.tostring()) Programmering 1999 KVL Side 5-3 Nyt objekt eller ændret objekt? Bemærk at t1.plus(40) laver et nyt Time-objekt. Der ændres ikke på t1. En anden mulighed er at lade metoden ændre på objektet. Den skal bare ændre objektets felter i stedet for at kalde new Time() Opgave: Definér en metode void move(int min) som flytter et tidspunkt i stedet for at lave et nyt. Opgave: Lav en for-løkke der udskriver alle klokkeslet fra 00.00 til 23.59 (der er 1440 minutter på et døgn). Programmering 1999 KVL Side 5-4

Klassen Appointment En aftale (Appointment) har et starttidspunkt, et sluttidspunkt, og en tekst: class Appointment { Time starttime, endtime; String text; Appointment(Time starttime, Time endtime, String text) { this.starttime = starttime; this.endtime = endtime; this.text = text; void prolong(int min) { endtime = endtime.plus(min); public String tostring() { return "fra " + starttime + " til " + endtime + ": " + text; Et Appointment-objekt indeholder to henvisninger til Time-objekter. Metoden tostring i Appointment udnytter indirekte tostring fra Time. Felterne starttime og endtime konverteres til tegnstrenge ved kald af tostring() i klassen Time. Programmering 1999 KVL Side 5-5 Brug af klassen Appointment class Appointment2 { Appointment app1, app2, app3; Time t1 = new Time(13, 0); app1 = new Appointment(new Time(8, 0), new Time(9, 20), "forelæsning"); app2 = new Appointment(t1, new Time(15,0), "bestyrelse"); app3 = new Appointment(t1, new Time(15,0), "øvelser"); System.out.println("" + app1); System.out.println("" + app2); System.out.println("" + app3); app3.prolong(120); System.out.println("" + app3); Objekterne app2 og app3 henviser til samme klokken 13 objekt, men to forskellige klokken 15 objekter. Opgave: Hvilken effekt vil t1.move(30) have på app1, app2 og app3? Programmering 1999 KVL Side 5-6 Fælles klassefelter: nøgleordet static Et klassefelt (eller en klassevariabel) er fælles for alle objekter i klassen. For eksempel kunne vi definere timezone (antal minutter øst for Greenwich) fælles for alle tidspunkter. En klassevariabel erklæres med nøgleordet static. static int timezone = 60; Programmering 1999 KVL Side 5-7 Konstante felter: nøgleordet final Undertiden ved vi at et felts værdi aldrig vil blive ændret: det er konstant. Desuden vil vi gerne sikre at resten af programmet ikke ændrer feltet ved en fejl. Det kan gøres med attributtet final. For eksempel kan man i klassen Time definere tidspunktet noon (middag) en gang for alle: final static Time noon = new Time(12, 0); Programmering 1999 KVL Side 5-8

Indkapsling: private felter og metoder Felter der erklæres private kan kun ses og ændres inde i klassen: private int hours, min; De kan ikke læses eller ændres af metoder der hører til andre klasser. God programmeringsskik i store programmer: Lav alle felter private Hvis et felt skal kunne aflæses udefra, så definér en get-metode for feltet: public int gethours() { return hours; Så skal brugere af Time-klassen skrive t1.gethours() i stedet for t1.hours Programmering 1999 KVL Side 5-9 Hvorfor gøre livet besværligt for andre klasser? For at sikre dataintegritet i Time-klassen: Det er f.eks. ønskeligt at konstruktorer og metoder i Time sikrer at 0 min 59. Men så kan vi jo ikke tillade udefrakommende at udføre eksempelvis t1.min = 62. Altså må andre klasser ikke få adgang til feltet min. For at sikre at man kan skifte datarepræsentation i Time-klassen: Vi kunne ombestemme os og repræsentere et tidspunkt som antal minutter siden midnat: int min; // Since midnight Det ville gøre de fleste metoder i Time simplere. Men hvis der stod t1.hours alle mulige andre steder i programmet, skulle det rettes alle de steder. Hvis der står t1.gethours() i stedet, så skal vi kun rette ét sted, i Time-klassen: public int gethours() { return (min / 60); I dette kursus er der ikke brug for at skelne mellem public og standardtilfældet (ingenting). Programmering 1999 KVL Side 5-10 Time med private og public (filnavn Time2b.java) private int hours, min; // since midnight public final static Time noon = new Time(12, 0); public static int timezone = 60; public Time(int hours, int min) { this.hours = hours; this.min = min; public int gethours() { return hours; public int getmin() { return min; private static String twodigits(int n) { return "" + (n / 10) + (n % 10); public String tostring() { public Time plus(int min) { public int to(time t) { public boolean before(time t) { Metoden twodigits er private (lokal i klassen); og static (afhænger ikke af felterne). Programmering 1999 KVL Side 5-11 Klassefelter og -metoder: static static standard Antal kopier Én fælles Én for hvert objekt Fælles for klasse Ja Nej Konstante felter: final final standard Kan ændres Nej Ja Synlighed: private og public public standard private Andre klasser Ja Ja Nej (Der er mere at sige om synlighed når vi har lært om subklasser og pakker) Opgave: Forklar public static void main(string[] args) Programmering 1999 KVL Side 5-12

, der udtales Overlæsning af konstruktorer og metoder En konstruktor kendes ikke blot på sit navn men på sin signatur. Signaturen er konstruktorens navn samt typerne af dens formelle parametre. Eksempel: Signaturen for konstruktoren Time fra før er Time(int, int). En klasse kan have flere konstruktorer med samme navn så længe deres signaturer er forskellige. Dette kaldes overlæsning af konstruktoren. På engelsk: overloading. Metoder kan overlæsses lige som konstruktorer. Signaturen er metodens navn samt typerne af dens formelle parametre. Metodens resultat-type indgår ikke i signaturen. Overlæssede metoder med samme navn kan have forskellige resultat-typer. Programmering 1999 KVL Side 5-13 Eksempel: Overlæsning af konstruktorer i Time public final static Time noon = new Time(12); private int hours, min; // since midnight public Time(int hours, int min) { this.hours = hours; this.min = min; public Time(int hours) { this.hours = hours; public Time(Time t) { hours = t.hours; min = t.min; public void move(int min) { int totalmin = 60 * this.hours + this.min + min; this.hours = totalmin / 60; this.min = totalmin % 60; andre metoder Programmering 1999 KVL Side 5-14 Programmering 1999 KVL Side 5-16 Den anden definition programmeres nemmest med en metode der kalder sig selv (rekursivt). Den første definition programmeres nemmest med en løkke (iterativt). hvis hvis Men fakultetsfunktionen kan også defineres rekursivt: Fakultetsfunktionen kan defineres som F.eks. kan 3 personer sættes i forskellige rækkefølger på en bænk. Eksempel: Funktionen fakultet, beregner antallet af rækkefølger (permutationer) af ting. En metode kan også kalde sig selv. Det kaldes rekursion. En metode kan kalde en anden metode (f.eks. tostring kalder twodigits i Time). Rekursion: metoder der kalder sig selv Programmering 1999 KVL Side 5-15 System.out.println("t3 = " + t3); System.out.println("t1 = " + t1); t2 = t1.plus(40); t3 = new Time(t1); t3.move(45); System.out.println("t2 = " + t2); Time t0, t1, t2, t3; t0 = new Time(12); t1 = new Time(12, 35); System.out.println("t0 = " + t0); System.out.println("t1 = " + t1); class Time3 { Test af ny Time-klasse

med med Iterativ og rekursiv udregning af fakultetsfunktionen public class IterekFak { public static void main(string args[]) { int n = Integer.parseInt(args[0]); System.out.println(n + "! er " + ifak(n)); System.out.println(n + "! er " + rfak(n)); static int ifak(int n) { // Iterativ fakultetsfunktion int resultat = 1; for (int i=n; i >= 1; i=i-1) resultat = resultat * i; return resultat; static int rfak(int n) { // Rekursiv fakultetsfunktion if (n == 0) return 1; else return n * rfak(n - 1); Programmering 1999 KVL Side 5-17 Sådan beregnes rfak(3) i maskinen rfak(3) 3 * rfak(2) 3 * (2 * rfak(1)) 3 * (2 * (1 * rfak(0))) 3 * (2 * (1 * 1)) 3 * (2 * 1) 3 * 2 6 Under beregningen kræver rekursive metodekald plads til uafsluttede udtryk i maskinen. Rekursive metodekald er lidt langsommere end gentagelser i en løkke. Programmering 1999 KVL Side 5-18 Programmering 1999 KVL Side 5-20 For at flytte nul skiver (hvis ) behøver man ikke at gøre noget. Tilsvarende for trin 3: Erstat, erstat A med C og erstat C med A. Svar: brug opskriften oven for, men erstat, erstat B med C og erstat C med B Hvordan udfører vi trin 1? 3. Flyt de øverste skiver fra tårn C til tårn B. 2. Flyt den nederste skive fra tårn A til tårn B. 1. Flyt de øverste skiver fra tårn A til tårn C. Flyt en stak af skiver fra tårn A til tårn B med tårn C til hjælp: Eksempel: Tårnene i Hanoi, algoritme Programmering 1999 KVL Side 5-19 A B C En større skive må aldrig ligge oven på en mindre skive. Kun én skive må flyttes ad gangen. Alle skiver skal flyttes fra tårn A til tårn B. Eksempel: Tårnene i Hanoi Nogle problemer løses nemmest ved hjælp af rekursive metoder

for hvilket Programmering 1999 KVL Side 5-22 Metoden Math.random() virker som r.nextdouble(), for en indbygget generator. Metoden r.nextint() givet et ligefordelt tilfældigt heltal. Metoden r.nextdouble() givet et ligefordelt tilfældigt. Dette er nyttigt når man skal finde fejl i programmer, fordi resultaterne er reproducerbare. Ud fra et givet frø vil generatoren altid lave den samme sekvens af tilfældige tal. Konstruktoren new Random() laver en generator med et frø taget fra datamatens indbyggede ur. Konstruktoren new Random(79891263152) laver en generator med frø 79891263152. Den indbyggede klasse Random Pseudo-tilfældige tal kan bruges til at simulere komplicerede (naturlige) processer. Men faktisk er hvert tal helt bestemt af det foregående. Det første tal kaldes sekvensens frø (engelsk: seed). En pseudo-tilfældig talfølge forekommer tilfældig: Pseudo-tilfældige tal Programmering 1999 KVL Side 5-21 System.out.println("Flytning af " + n + " skiver fra A til B (via C):"); System.out.println(); flyt("a", "B", "C", n); public static void main(string args[]) { int n = Integer.parseInt(args[0]); public static void flyt(string fra, String til, String via, int antal) { if (antal > 0) { flyt(fra, via, til, antal-1); System.out.println("Flyt en skive fra " + fra + " til " + til); flyt(via, til, fra, antal-1); public class Hanoi { Eksempel: Tårnene i Hanoi i Java At bruge Random til at kaste terninger import java.util.random; public class Random1 { Random r = new Random(); for (int i=0; i < 10; i++) { int res = (int)(1 + 6 * r.nextdouble()); System.out.print(res + " "); System.out.println(); For at generere et tilfældigt heltal mellem 1 og 6 (inklusive), brug (int)(1 + 6 * r.nextdouble()) Brug ikke det der foreslås i Lewis og Loftus: 1 + r.nextint() % 6 Årsag: de nederste bit i et pseudo-tilfældigt tal er mindre tilfældige end de øverste. Programmering 1999 KVL Side 5-23 Sammenfatning: Med overlæsning kan flere metoder have samme navn når bare de tager parametre af forskellige typer. Overlæsning er især nyttigt for konstruktorer. En konstruktor kan kalde en anden konstruktor. En rekursiv metode er defineret ved hjælp af sig selv. Rekursion løser problemer efter princippet del og hersk. Læs: L&L kapitel 4.9 og kapitel 12. Programmering 1999 KVL Side 5-24