Oversikt (for deg som ikke er helt sikker på å få A) Repetisjon Inf000 uke 2 4.nov. 2008 Arne Maus, Gruppen for objektorientering, modellering og språk (OMS) Inst. for informatikk, Univ i Oslo Pensumoversikt i store trekk variabler, typer og tilordning inn- og ut-lesning (løkker og if) (tekster) metoder (parametere og retur av verdi) klasser og objekter mengder (array og HashMap) UML IKT og samfunn, Lov om behandling av persondata Sjekkliste Vanlige feil på eksamen Eksamenstips variabler, typer og tilordning En enkelvariabel beskriver én ting/én egenskap Har tre (fem) egenskaper: Et navn En type En verdi (+ en nummerert plass /adresse i lageret) (+ en størrelse i antall bit ) int i ; i = 4; i = i+; i 45 Sjekkliste forts. Bruk av arrayer Hvordan deklarere og opprette en array Hvordan legge inn verdier i en array Hvordan ta ut verdier av en array Hvordan gå gjennom alle verdier i en array Bruk av HashMaper Hvordan deklarere og opprette en HashMap. Hvordan legge nøkkel/verdi inn i en HashMap Hvordan ta ut nøkkel/verdi av en HashMap Hvordan gå gjennom alle nøkler/verdier i en HashMap
Sjekkliste forts. Sjekkliste forts. Bruk av metoder Hvordan kalle på en metode Hvordan lage en metode uten parametre/med parametre uten returverdi/med returverdi Forskjellen mellom elementære typer og klasser elementære typer: int, double, char, boolean,. Kan ikke lage objekter av dem klasser: String, HashMap, etc + våre egendefinerte klasser Kan lage objekter av dem Bruk metoder for å splitte opp koden i mer håndterlige biter lette skrivingen av programmet lette lesingen av programmet lette feilretting av programmet Et java-program består av klasser og metoder En klasse er noe - en metode gjør noe Et stort program må deles opp i mindre deler for: Å greie å få det riktig (sjekke/teste hver del for seg) Dele det opp i logiske biter (ha sammen det som logisk hører sammen) Det er to måter i et Objekt-orientert t programmereings-språk eings sp (som Java) å dele opp programmet: Metoder: Slå sammen noen setninger (tilordninger, while-, for-, deklarasjoner av noen variable) og gi dette et navn. Klasser: Dele opp programmet i de store delene det består av. En klasse inneholder metoder og deklarasjoner og har et navn ( eks: class Bankkunde {.. ) Er en modell av en del av problemet. Vi ønsker en oppdeling som gjør det lettere å programmere: Metoder lager store instruksjoner som er enkle å bruke (eks: sort(), sqrt() ) Klasser deler hele problemet opp i håndtérbare deler. Splitt og hersk! 7 Metoder: Vi deler opp handlingene i programmet i metoder. En metode er da noen vanlige programsetninger som vi setter krøll-parenteser rundt. Metoden gjør det navnet på metoden sier. Vi velger selv navnet på de metodene vi lager. EKS Banksystem: En metode for hver av handlingene: innskudd, uttak, beregnrenter, skrivrapport, Klasser: Vi deler dataene og metodene i programmet opp i deler slik at hver av disse (klassene) tilsvarer en naturlig del av problemet: EKS Banksystem: En klasse for hver av Banken, Kunde, Konto, En klasse er noe, en metode gjør noe 8
Å deklarere en metode Generelt har en metode-deklarasjon følgende form: null, en eller to, eks: public static beskrivelse av hva slags output metoden gir, f.eks. void, int, double, char, modifikatorer returverditype metodenavn (parametre) { instruksjon ; instruksjon 2; et navn som vi velger. instruksjon n; beskrivelse av hva slags input metoden skal ha - gis i form av variabel-deklarasjoner separert av komma Merk at en metode kan kreve input og at den kan returnere en verdi, men ingen av delene er nødvendig. I enkleste tilfelle er det ingen input og ingen output. 9 Å bruke en metode Når vi bruker en metode sier vi at vi kaller på metoden. For å kalle på en metode uten parametre, skriver vi ganske enkelt metodenavn(); For å kalle på en metode med parametre, må vi i tillegg oppgi like mange verdier som metoden har parametre, og ite i'te verdi må ha samme datatype som i'te parameter i metodedeklarasjonen. Eksempel: metodenavn2(34.2, 53, 6); Hvis metoden returnerer en verdi, kan vi velge om verdien skal tas vare på eller ikke når metoden kalles. Eksempel på å ta vare på verdien: int alder = metodenavn3(25.3, 3 52, 7); 0 Bruk av variable og gparametre og variable Eksempel Vi kan ha tre typer variable i en metode: Klassevariable og objektvariable: dette er variable som er deklarert på klassenivå, utenfor metoden. Lokale variable: dette er variable som deklareres inni metoden. Disse er definert fra og med der deklarasjonen gjøres og til slutten av blokken de er deklarert i. Parametre: dette er variable som deklareres i hodet på metoden. Disse er definert i hele metodekroppen. Viktig: ved gjentatte kall på en metode er det et nytt sett med lokale variable og parametre som lages hver gang. class Variable { static int tid = 0; // Klassevariabel public static void main (String[] args) { int intervall = 3; // Lokal variabel Variable vl = neww Variable(); // Lokal variabel vl.øktid(intervall); vl.øktid(intervall); void øktid (int t) { // Parameter tid += t; System.out.println(tid); 2
Verdien til parmeterene kopieres over til metoden Metodekall Når vi kaller metoden (bruker navnet i en annen metode), så oveføres verdienene til de parameterene som ble brukt i kallet slik: public static void main (String[] args) { int i = 7; minmetode(3.4, i +2); Anta at følgende eksekveres: double [] lengde = {..; double total = l.finnsum(lengde); Eksekveringsrekkefølgen: Metoden som kalles: double finnsum(double[] x) { double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; double total = l.finnsum(lengde); static void minmetode (double x, int y) { // nå kan x og gy brukes med de verdier de fikk i kallet.. De verdiene som ble brukt ved kallet, blir kopiert over i parameterene før setningene i metoden blir utført. 3 total = 22.05; double[] x = lengde; double sum = 0.0; 0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; 4 Eksempel på bruk Oppsummering om metoder import easyio.*; class Lengde { public static void main (String[] args) { Out skjerm = new Out(); Lengde l = new Lengde(); double[] lengde = {2.3, 5.22, 3.6, 2.33, 8.6; double total = l.finnsum(lengde); skjerm.out("samlet lengde: "); skjerm.outln(total, 2); double finnsum (double[] x) { double sum = 0.0; for (int i=0; i<x.length; i++) { sum += x[i]; return sum; > java Lengde Samlet lengde: 22.05 5 Deklarasjon (lage metoden) : Man pakker sammen de handlinger som hører sammen (gjør noe sammen) med krøllparenteser, og gir metoden et navn med vanlige parenteser bak navnet. Man må også si om metoden returnere noe: Returnerer ingenting: sett da void foren navnet Returneren en verdi, sett typen til verdien foran navnet ( Eks: int, double, int[],..) Metoden må da si return XXX; et sted i koden og hvor XXX er et uttrykk av den typen metoden skal returnere (eks return i +4;). Hvis metoden bare tilhører klassen, skrives static foran returtypen Hvis metoden trenger noen data som den skal jobbe med for å gjøre jobben, settes de med type inn i parentesen bak navnet Eks: double kvadratrot(double x) {; return Bruk / kall på metoden: Man nevner navnet (i koden til en metode) med evt. parametere: y = 2.0 + kvadratrot(x*3 3.4); 6
Oppsummering om klasser, objekter, pekere og. Verden består av objekter av ulike typer (klasser). Ofte er det mange objekter av en bestemt type. Objekter som er av samme klasse, beskrives med de samme variablene, men vil ha forskjellige verdier på noen av disse. Eks: To bankkonti med ulik eier og kontonummer, men kan f.eks ha samme beløp på saldo (tilfeldigvis) Vi lager OO-programmer ved å lage en modell, en kopi av problemområdet i Javaprogrammet ett objekt i verden gir ett tilsvarende Java-objekt i programmet Objekter kan være av ulik type, og for hver slik type deklarerer vi en klasse i programmet.. oppsummering forts. Et Javaprogram består av en eller flere klasser En klasse er en deklarasjon av data og metoder for ett objekt av klassen. Vi deklarerer pekere til objekter av en bestemt klasse f.eks. class Kurs {.. slik: Kurs kurs4, k2, k; Vi lager objekter fra klassen med new k2 = new Kurs(); Et objekt inneholder en kopi av alle ikke-statiske variable og ikke-statiske metoder i klasse Disse kalles objekt-variable og objekt-metoder Vi får adgang (lese, skrive og kalle metoder) til det som er inni et objekt ved. Operatoren : Vi må ha en peker til et objekt etterfulgt av punktum. s2.adresse ="bokhandelen i Kabul"; s.skrivut(); 7 8 Klasse med 2 konstruktører Oppsummering om klasser. class Student { String navn; Kurs [] minekurs = new Kurs[3]; Student() { minekurs = new Kurs[0]; Student(String navn, Kurs [] k){ this.navn = navn; for (int i = 0; i<k.length; i++ ){ minekurs[i] = k[i]; minekurs[i].antstudenter++; Klasser er oppskrifter for hvordan vi lager objekter med new Vi deklarerer pekere til objekter og bruker operatoren:. Kan ha arrayer av pekere til objekter Klasse- og objektvariable og metoder. Konstruktører er startmetoder med samme navn som klassen, Kalles hver gang vi sier new. UML-diagrammer (Objekt- og Klasse-diagram) gir oversikt og forenkling som skikkelige ingeniører i lager vi tegninger før vi lager systemet t (programmerer) 9 20
Hvordan vi skal tenke oss en HashMap Løp gjennom alle objekter i HashMap Java.5 en HashMap er som en slags dobbelt-array (f.eks bomringbilene) HashMap bomringbilene = new HashMap(); bomringbilene BD 23709 FS 44202 Bil Bil 2 For å løpe gjennom alle objektene i en HashMap, lager vi en oppramsing og låser samtidig det vi skal hente til en bestemt klasse: Iterator <Person> it = h.values().iterator(); Deretter kan vi se på hvert enkelt objekt i HashMap'en ved å gå i løkke: while (it.hasnext()) { Person p = it.next(); System.out.println( Navn: + p.fånavn()); AS 65432 Bil 3 Vi kan også i.5 nytte den nye for-løkka som automatisk lager en iterator nøkler verdier (keys) (values) for (Person p: h.values()) { System.out.println( Navn: + p.fånavn()); 2 22 Metoder i HashMap Metode Eksempel Beskrivelse put h.put(nøkkel, objekt); Legg inn objekt med gitt nøkkel get -.4 Person p = (Person) h.get(nøkkel); Finn objekt get -.5 Person p = h.get(nøkkel); remove h.remove(nøkkel); Fjern objekt containskey if (h.containskey(nøkkel)) { // gjør et eller annet Sjekk om nøkkel finnes i tabell values Iterator it = h.values().iterator(); Lag oppramsing av objektene keyset Iterator it = h.keyset().iterator(); Lag oppramsing av nøklene 23 Iterator (oppramsing) Eksempel Iterator it = h.values().iterator(); Iterator it2 = h.keyset().iterator(); hasnext() while (it.hasnext()) { < les neste og gjør noe>; next().5 Person p = it.next(); next().4 Person p = (Person) it.next(); t() Beskrivelse deklararasjon returnerer true hvis flere objekter igjen i oppramsingen Finn neste objekt remove() Person p = it.next(); Fjern siste objekt som if (p.navn.equals( Arne )) ble returnert med it.remove(); next() while (it.hasnext()) { To måter å gå Person p = it.next(); for (Person p2 : h.values()){ gjennom alle verdiene (objektene) i h. 24
import java.util.*; import easyio.*; class Hasheksempel { public static void main(string[] argv) { In tastatur = new In(); HashMap <String,Person> personregister = new HashMap <String,Person>(); System.out.print(ʺAntall personer som registreres : ʺ); int ant = tastatur.inint(); class Person { String navn, adresse, telefonnr; for (int i = 0; i < ant; i++) { System.out.println( Gi neste person ); Person (In tastatur) { Person p = new Person(tastatur); System.out.print("Oppgi ppg navn : "); personregister.put(p.telefonnr, p); navn = tastatur.inline(); System.out.print("Oppgi adresse : "); // Skriv ut alle personobjektene adresse = tastatur.inline(); System.out.print("Oppgi ppg telefonnummer : "); System.out.println(ʺViser alle personerʺ + telefonnr = tastatur.inline(); ʺ(ukjent rekkefølge):ʺ); void skrivdata() { for (Person p: personregister.values() ){ System.out.println("Navn : " + navn); p.skrivdata(); System.out.println("Adresse : " + adresse); System.out.println("Telefonnummer : +telefonnr); String fånavn() { return navn; Eksempel fra boka s.86 Generell løsningsmetode Husk vi skal lage en kopi av virkeligheten i Java-programmet. Finn klassene (hvilke objekter er det i problemet). Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?) 2. Finn ut hvilke objekter som eier objekter ( tegn UML diagram). Lag pekere (enkle pekere, arrayer eller HashMap er) som binder systemet sammen 3. Finn ut hva systemet skal gjøre = metoder vi skal ha.. Finn på et navn på hver av dem foreløpig uten kode inni {. 4. Plasser metodene (og andre datafelter) i de klassene de naturlig hører hjemme 5. Finn ut hvordan vi skal kjøre programmet anta at vi har laget en klasse som er selve systemet. Lag et objekt av XXSystem (fra main) 2. I konstruktoren leser du inn file(ne) i systemet og lager alle objektene som selve Systemet eier for eksempel Et hybelhus Utsyn med sine 2 hybler. 3. Kall en kommandoløkke() metode i System.et 4. Skriv ut nytt innhold av filer når kommandoløkke() er ferdig 5. Ferdig! 6. Lag et kjørende system med (bare) tomme metoder 7. Programmer hver metode for seg, test 26 Eksempel: Flyreservasjon Klasser Egenskaper Prosedyerer Vi skal lage et system for et flyselskap s som eier e en rekke e fly Systemet skal holde orden på alle selskapets flyvninger og reservasjoner (booking) av seter på en flyvning En flyvning har en kode, et avreisested og avreisetid, ankomsttid og en destinasjon, i tillegg til et fly, som har et identifikasjonsnummer Et fly består av seterader, med seter Oppgavene systemet skal løse er å lese inn en beskrivelse av alle flyene, med antall seter, klasser på de forskjellig seteradene, osv Så skal man kunne reservere seter, avbestille og skrive ut en oversikt over flyets seter, med klasse og om det er ledig eller ikke Eksempel: Flyreservasjon Klasser Egenskaper Prosedyerer Vi skal lage et system for et flyselskap l som eier en rekke fly Systemet skal holde orden på alle selskapets flyvninger og reservasjoner (booking) av seter på en flyvning En flyvning har en kode, et avreisested og avreisetid, ankomsttid og en destinasjon, i tillegg til et fly, som har et identifikasjonsnummer Et fly består av seterader, med seter Oppgavene systemet skal løse er å lese inn en beskrivelse av alle flyene, med antall seter, klasser på de forskjellig seteradene, osv Så skal man kunne reservere seter, avbestille og skrive ut en oversikt over flyets seter, med klasse og om det er ledig eller ikke
UML-diagram - flyreservasjon Systemet Systemet FlySelskap? import easyio.*; import java.util.*; * Fly * Seterad * Flyvninger fra til Sted * Booking class Systemet { public static void main (String[] args) { String s = Fly.txt"; String s2 = Bestillinger.txt"; FlySelskap f = new FlySelskap (s,s2); f.ordreløkke();..7 Sete 29 Flyreservasjon class FlySelskap { HashMap <String,Fly> fly = new HashMap <String,Fly> (); HashMap <Destinasjon, Fly> flyvninger = new HashMap <Destinasjon, Fly> (); Datastruktur FlySelskap(String s, String s2) { lesfly(s); Metoder for å lese fra lesreservasjoner(s2); fil og for å lese inn kommando fra bruker void lesfly(string fnavn) { void lesreservasjoner(string fnavn) { void ordreløkke() { Her kommer det metoder som skal kalles fra ordreløkken FlySelskap Programmere ordreløkken For hver kommando som skal utføres, skal ordreløkken kalle på en passende metode i klassen FlySelskap. For at programmet skal kompilere, sørg for å deklarere alle de metodene som du kaller på fra ordreløkke-metoden. Du kan vente med å fylle inn innholdet i disse metodene, dvs bare fyll inn en utskriftssetning i hver av metodene. Eksempel: hvis ordreløkken kaller på metoden visflyvning(), så deklarerer du samtidig denne dummy-metoden i klassen FlySelskap : void visflyvning() { void visflyvning() { System.out.println( Metoden visflyvning utført );
Skrive ut en flyvning Programmer metodene som kalles fra ordreløkken Eksempel (i klassen FlySelskap): void visflyvning() { System.out.println( Flyvning: ); String flightkode = tast.inline(); Flyvning flight = <finn flyvingen ved oppslag i flyvninger>; flight.skrivut(); Oppdraget delegeres videre til en metode i Flyvning-objektet som er aktuelt. Flyvning Skriver ut litt informasjon om flyvningen og delegerer så ansvaret for utskrift av oppsettet i flyet til klasen fly. class Flyvning { String flightkode; String avreisested; String destinasjon; Fly fly; void skrivut() { System.out.println( println( Flight: + flightkode); System.out.println( Fra: + avreisested); System.out.println( Til: + destinasjon); fly.skrivut(); Oppdraget delegeres videre til en metode i Fly- objektet som er aktuelt. Fly Skriver ut informsjon on flyet og delegerer videre til seteradene, som igjen delegerer videre til setene. class Fly { String flykode; Seterad[] seterader; int skrivut() { System.out.println( Flykode: + flykode); for(int i=0; i<seterader.length; i++){ seterader[i].skrivut(); skrivut(); Og Fly delergerer videre class Flyvning { skrivut() { fly.skrivut(); class Fly{ skrivut() { class FlySelskap { void ordreløkke() { visflyvning(); void visflyvning() { flight.skrivut(); Vi har ett objekt av denne. Vi har flere objekter av disse.
Eksamenstips. IT og samfunn: Eksamensoppgave Inf 000 er et kurs i objektorientert programmering, ikke primært i Java: Små syntaktiske feil, småfeil i metodenavn, osv spiller mindre rolle Ville programmet ditt vært et nyttig første forsøk å utsette kompilatoren for? Java-konstruksjoner som ikke er forelest eller som ikke har vært tatt opp i oppgaver vil dere ikke få behov for på eksamen. En viss personlig frihet i hvordan man tegner UML-diagrammer (klasse/objekt-diagrammer) kt er tillatt. tt Men meningen må komme klart fram! Ikke slurv når du tegner dem, det straffer seg siden når du skal bruke dem. Er det det edb-baserte baserte (person-) register du har blitt bedt om å lage lovlig? - er dette sensitiv informasjon ( 2) - har vedkommende som er registrert gitt samtykke ( 8-9) - er registreringen saklig begrunnet ( 8-9) - nyttes innsamlete data til et annet formål uten samtykke( ) - kreves det konsesjon( 33) - er det bare meldeplikt ( 3-32) - er det f.eks tillatt å lage egne registre ut fra offentlig tilgjengelig informasjon? INF000 38