Velkommen til INF1010 - våren 2011 Stein Gjessing & Stein Michael Storleer Institutt for informatikk Universitetet i Oslo 1 0(
I INF1010 skal du lære! Å lage gode programmer! Objektorientert programmering! Ble funnet opp av Ole-Johan Dahl og Kristen Nygaard! Det første objektorienterte språket het Simula! I dag:! Java datastrukturer (Hva er objekter?)! Les: Litt om datastrukturer i Java av Stein Gjessing! Om lenkede lister (obligatorisk oppgave 1) (mer om en uke)! Litt mer om objekter i programmene våre et programmeringsmønster (så langt vi har tid)! Les mer på kursets hjemmeside om! Forelesninger - Viktig: Detaljert undervisningsplan! Fellesøvelser (første gang 26. januar)! Programmeringslaboratorium (fra 24. januar)! Obligatoriske oppgaver (første innlevering innen 11. februar kl 14) 2 1(
Primitive typer og objekter! Primitive typer:! boolean, char, short, int, long, float, double! pekere! til klasseobjekter! til tabeller (arrayer)! Objekter inneholder! Variable og konstanter (av de primitive typene)! Metoder En boks En variabel eller en konstant med en verdi av en primitiv type inni Et objekt 2(
Variable og konstanter En variabel eller en konstant (av en primitiv type) består av 3 ting: I programmet: 1.! Et navn 2.! En (primitiv) type 3.! Ett innhold En boks med navn og type utenpå, og en verdi inni int antall = 3; Når programmet utføres (inne i datamaskinen): type: int 3 navn: antall 3(
Variable, tilordninger og uttrykk!!! Vi gir variabler verdi ved en tilordningssetning, der likhetstegnet betyr settes lik.! 1. Regn ut høyresiden! 2. Sett resultatet inn i variabelen på venstresiden int antall = 3; antall = antall + 4; type: int navn: antall Variabelnavnet vil på venstre side av et likhetstegn bety lagerplassen som skal gis ny verdi. På høyre side av likhetstegnet betyr variabelnavnet den verdien som er lagret i boksen med dette navnet. 37 54(
Java datastrukturer! Hva skjer inne i en datamaskin når et Javaprogram blir utført?! Masse elektroner farer rundt! Umulig å skjønne! Vi skal tegne det som foregår inne i datamaskinen når Javaprogrammet vårt blir utført! Vi kaller det Java datastrukturtegninger! Alle som programmerer må ha fullstendig oversikt over det som foregår inne i maskinen! Når jeg programmerer ser jeg for meg det som skal foregå inne i maskinen og skriver Java-instruksjoner for å få det til.! Noen ganger bare tenker jeg meg hvordan Java datastrukturen ser ut, andre ganger tegner jeg den (mer eller mindre fullstending) på papir 65(
Program for salg av biler. public class BilSalg{ static BilSalg salgsobjekt; public static void main (String [ ] args) { salgsobjekt = new BilSalg ( ); BilSalg ( ) { int antallsteinb; Bil steinst = new Bil ( ); Bil oleso = new Bil ( ) ; steinst.foresporsel ( ); oleso.foresporsel ( ); steinst.foresporsel ( ); antallsteinb = steinst.finnantforesp(); System.out.println("Antall forespørsler på + Steins Toyota er " + antallsteinb; System.out.println("Antall forespørsler totalt + er nå " + Bil.finnTotal( ) ); //slutt konstruktør // slutt BilSalg class Bil { static private int total = 0; private int antforesporsler = 0; static int finntotal ( ) { return total; void foresporsel ( ) { antforesporsler ++; total ++; int finnantforesp ( ) { return antforesporsler; //slutt Bil 7 6(
Vi skiller mellom! Klasse-deklarasjonen i programteksten. Den er et mønster som brukes både når klassedatastrukturen lages (i det programmet starter opp) og senere når nye objekter lages.! Klasse-datastrukturen, dvs. den (statiske) datastrukturen som lages i det programmet starter! Objekt-datastrukturen (også bare kalt objekter eller klasse-objekter) som lages hver gang vi sier new. Utrolig Viktig! 87(
BilSalg klassedatastruktur Navn: salgsobjekt null main Type: BilSalg salgsobjekt = new BilSalg ( ); Bil-objekt navn: antforesporsler 12 type: int 0 void foresporsel( ) Bil klassedatastruktur Navn: total 01 23 finntotal return total; Type: int BilSalg( ) navn: steinst Type: Bil navn: oleso Type: Bil navn: antallsteinb 2 int int antallsteinb; Bil steinst = new Bil ( ); Bil oleso = new Bil ( ) ; steinst.foresporsel ( ); oleso.foresporsel ( ); steinst.foresporsel ( ); antallsteinb = steinst.finnantforesp(); System.out.println("Antall forespørsler på + Steins Toyota er " + antallsteinb); System.out.println("Antall forespørsler totalt + er nå " + Bil.finnTotal( ) ); BilSalg-objekt antforesporsler ++; total ++; int finnantforesp( ) return (antforesporsler); Antall forespørsler på Steins Toyota er 2 Antall forespørsler totalt er nå 3 Bil-objekt navn: antforesporsler 1 type: int void foresporsel( ) 0 antforesporsler ++; total ++; int finnantforesp( ) return (antforesporsler); 9
Mer tegning (for å demonstrere variable og objekter) Java datastrukturtegninger m/parametre Filen heter BrukSum.java class Sum { int tall = 11; static int statt = 12; public void skrivt (int tl) { int sum; sum = tall + statt + BrukSum.tall1 + tl; System.out.println("Summen er " + sum); // slutt Sum Oversettes og kjøres med >javac BrukSum.java >java BrukSum Oversetteren lager to filer: BrukSum.class og Sum.class Java fikling public class BrukSum { static int tall1 = 16; static int tall2 = 10; int ubrukt = 15; public static void main(string [ ] args) { Sum testpeker; tall1 = 13; testpeker = new Sum( ); testpeker.skrivt(tall2+4); // slutt BrukSum 10
Java datastruktur-tegning ved kjøring av BrukSum klassedatastruktur BrukSum main navn: args navn: tall1 13 16 type: int navn: tall2 10 type: int type: String[] navn: testpeker type: Sum tall1 = 13; testpeker = new Sum( ); testpeker.skrivt(tall2+4); navn: statt 12 type: int Objekt av klassen Sum skrivt(int tl) navn: tall 11 type: int navn: sum 50 type: int navn: tl 14 type: int Klassedatastruktur Sum int sum; sum = tall + statt + BrukSum.tall1 + tl; System.out.println( Summen er + sum); Summen er 50 00(
8+%(-(9:/:+/;:<:+( Hva om vi ønsker å putte en kø av biler inn i datamaskinen vår: navn: forste type: Bil navn: siste type: Bil navn: neste type: Bil Objekt av klassen Bil navn: neste type: Bil Objekt av klassen Bil navn: neste null type: Bil Objekt av klassen Bil 01(
tautforste navn: siste type: Bil 8+%(-(9:/:+/;:<:+=()+%#>( settinnsist navn: forste type: Bil Objekt av klassen BilKo navn: neste type: Bil Objekt av klassen Bil navn: neste type: Bil Objekt av klassen Bil navn: neste null type: Bil Objekt av klassen Bil public class BilKo{ private Bil forste, siste; public Bil tautforste( ) {... public void settinnsist(bil denne) {... class Bil{ Bil neste; String regnr; 02(
class BilKo{ // Oppgave: skriv invarianten for datastrukturen her private Bil forste, siste; Tegn og fortell, for deg selv. public Bil tautforste( ) { if (forste == null) return null; Bil resultat; resultat = forste; forste = forste.neste; // les: forste settes til å peke på det // samme som forste.neste peker på return resultat; // Oppgave: her er det noe feil. // Skriv opp (og tegn) invarianten og rett feilen(e) Poeten public void settinnsist(bil denne){ if (siste == null) { siste = denne; forste = denne; else { siste.neste = denne; siste = denne; class Bil{ Bil neste; String regnr; 03(
?,'(-($@A."A($@(:A:"#/.9:+(,(B;:/%:+(! C9+,D.%:E(B:%F+(.%(<:"(,//:(:+(/;:"%(&%:"-(/@.##:"(! C9&B@,GE(B:%F+(.%(<:"(#::#(.D(.@@:(!!"A:"(-<,H/.%+(B:%F+(.%(:A:"#/.9:"(:+(/;:"%(,"":")+((H@:"I/.%.@A:"I9.//:"(!!(<:':(:/#:-9@:%(:+(J,@(:"(#K(,"%:A+:+%(<:@(.D(J,@8(.%( D,($@@.%:+(<,+:/%:($@A."A($@(<:(D.+,.B@:(,(J,@L/@.##:">(( 04(
(M/#:-9:@(N.D.(<.%.#%+&/%&+( O( P+A+.--:+,"A#-Q"#%:+:%( R<:@@(L(S%#F"(L(8"%+@@( TRUV((L((R<:@W(U,:XW(V"%+@Y( 05(
M%(B."/9+A+.-(! U,(#/.@(@.A:(:%(9+A+.-(#-(ZK"<%:+:+(/"%:":(,(:"(B."/>(( M"(/"%(:,:#(.D(:"(/&"<:W(A(Z.+(:"(#.@<>(! P+A+.--:%(#/.@(/--&",#:+:(-:<(:"(B+&/:+(,(S",[I\]^L D,"<&:%(! P+A+.--:%(#/.@(/&"":(.<-,",#%+:+:(/"%:":(,(B."/:"W(A(,()Q+#%:(-A."A(( 0Y(]99+:':(:"("F(/"%( 1Y(_;:+":(:"(/"%( 2Y(^:':(,""(9:"A:+(9K(:"(/"%( 3Y(^/+,D:(&%(B."/:"#()+D.@%","A#/.9,%.@( 06(
Et bankprogram!! Vi skal lage et program som håndterer kontoene i en bank. En konto eies av en kunde, og har en saldo. Vi bruker substantivmetoden til å finne forslag til klasser (som vi kan lage objekter fra) class Bank class Konto class Kunde class Saldo For kunde og saldo satser vi i denne enkle versjonen av programmet på å bare bruke h.h.v. en String og en double 07(
G@.##(J."/(!!(:"(B."/(#/.@(D,(/&"":(@:AA:(,""(:"("F(/&"<:W(a:+":(:"( /&"<:W(#:':(,""(9:"A:+(9K(:"(/&"<:#(/"%(A(H"":( )+D.@%","A#/.9,%.@:"($@(B."/:"(T#&--:"(.D(.@@:(B:@Q9:":(9K(.@@:(/"%:":Y( G@.##(J."/\.%.(! b@@:(/"%:":(b@,+(.<-,"#%+:+%(.d(/@.##:"(j."/\.%.( G@.##(8"%(! \.%.(A(-:%<:+()+(:"(/"%( 0`(
UML klassediagram (mer i INF1050): Bank BankData 1 1 1 Konto 1c(
Java datastruktur Versjon 1 for banksystemet Bank-objekt BankData-objekt Mange Konto-objekter 10(
UML klassediagram for BankData BankData Konto 1 Kan f.eks. gi denne Java datastrukturen: Konto-objekter Bank-objekt navn: type: Bank type: HashMap type: Bank HashMap-objekt En Collection 11(
U:+#;"(0d(G@.##(J."/\.%.( Bank-objekt navn: konti type: HashMap BankData( ) lagbankkunde (...) fjernbankkunde (...) settinn (...) sumallekonti ( ) class BankData { BankData( ) {... private HashMap <String,Konto> konti = new HashMap<String,Konto>( ); public void lagbankkunde(string navn) {... public void fjernbankkunde (String n) {... public void settinn(string n, double b) {... double sumallekonti( ) {... 12(
G@.##(8"%(! ek+(:"(/"%(99+:':#(99a,+(d,(<:"#(:,:+w(a( #.@<:"(#:':#($@("&@@>(! PK(:"(/"%(#/.@(D,(/&"":(#:':(,""(:%(B:@Q9W( H"":(".D":%(9K(:,:+:"(A(H"":(,"":#%K:"<:( B:@Q9( 13(
U:+#;"(0d((G@.##(8"%( Konto-objekt Konto(String nvn) class Konto { Konto (String nvn) {... public void setinn(double belop) {... settinn(double belop) double hentsaldo( ) String henteier( ) public double hentsaldo ( ) {... public String henteier( ) {... // slutt klassen Konto 14(
8;:"%:(-Q"#%+:()+(9+A+.-99<:@,"A(! \:%(:+(-."A:(/;:"%:(A(D:@9+QD<:(-K%:+(K(<:@:(99( 9+A+.-/<:>(^@,/:(/;:"%:(-K%:+(/.@@:#(E<:#,A"(9.':+"#E>(! f.'()+.(cfz:(f,-:@:##(g.f()(j&,@<,"aew(vz+,#%h:+(b@:[."<:+w( ][)+<(S",D:+#,%F(P+:##W(0`6`W(!^Je(c0`4c13c17(! CM.GZ(9.':+"(<:#G+,B:#(.(9+B@:-(XZ,GZ(GG&+#(D:+(."<(D:+(.A.,"(,"(&+(:"D,+"-:"%W(."<(%Z:"(<:#G+,B:#(%Z:(G+:()(%Z:(#@&$"(%( %Z.%(9+B@:-W(,"(#&GZ(.X.F(%Z.%(F&(G."(&#:(%Z,#(#@&$"(.(-,@@,"( $-:#(D:+W(X,%Z&%(<,"A(,%(%Z:(#.-:(X.F(%X,G:E(! M%(#@,/%(!"#$"%&&'"()$&+),'"(Z.+(<:+:(@i+%(,(!e_0ccc( -:<(/--."<@Q//.(#-(@:AA:+(&%(:"(-:"F(A(%.+( /--."<()+.(B+&/:+:">(! M%(.D(<:(-:#%(/;:"%:d(R<:@@(L(S%#F"(L(8"%+@@(( #/.@(<:+:(@i+:(z:+(tf+fad:(j::"#/.&ay( 15(
R<:@@(=(S%#F"(=(8"%+@@(k( RUVd((R<:@(=(U,:X(=(V"%+@(! R<:@@(! M"(+:"(<.%.#%+&/%&+((#-(Z@<:+(.@@:(<.%.(-( 9+B@:-:%>(! (S%#F"((! MA:"(-<&@()+(K(9+:#:"%:+:(-<:@@:"()+( B+&/:+:"(9K(&@,/:(-K%:+(D.@A%(.D(B+&/:+:"(TD,.( /"%+@@:"Y(! 8"%+@@((! MA:"(-<&@I/@.##:()+(K(-'.(+<+:()+.( B+&/:+:"(A(:"%:"(:"<+:(-<:@@:"(T@:AA:(,""( "F:(<.%.W(:"<+:W(a:+":(<.%.Y(:@@:+(/.@@:(:"( )&"/#;"(,(&%#F":%()+(K(A,(:%("F'(B,@<:(.D( -<:@@:">(! ]-@.A(#.--:(99<:@,"A(#-(,(/@,:"%I%;:":+( B.#:+%:(<,#%+,B&:+%:(#F#%:-:+(! R<:@@(=(<.%.B.#:(T#:+D:+Y(! S%#F"(=(/@,:"%:"(9K(<,#%+,B&:+%:(PV:+(! 8"%+@@(=(%;:":+I#:+D:+((-:<( (((((((((((((((((((()++:%","A#@A,//:"( Tjener (med forretningslogikk) Klienter Database server 16(
R<:@@(L(S%#F"(L(8"%+@@(TRUVY(! l:+d(m%(#di+%(:"/:@%(#f#%:-()+(k(d,#:( -:/.",#-:">(RUV(:+()+%+&//:%(D:<(":"( Z&"<+:(@,";:+(/<:(A(99D:+>(! m+&"":"($@(k(#/,@@:(<,##:()&"/#;":":()+.( ZD:+."<+:W(:+(.%(<:%(A;Q+(<:%(@:':+:(d(!n(&%D,/@:(L(8"#:"%+:+:(#:A(-(:"($"A(.<(A."A:"(!n(:"<+:(L((8<:(-(:"($"A(:+(#.-@:%(:'(#%:<( ((((((((((((((((((_>:/#>d(?,";:b.#:+%(d#>(u,"<&#b.#:+%((( ( ( ( ( ( ( (&%#/+,o( 17(
RUV(=(@Q#","A()+(B."/:"(DK+(! \:%(#/.@(<.(Di+:(/@.##:+(#-(ZK"<%:+:+(d(!8@.##:"(-%)./%,%0! -:<(Z;:@9:/@.##:"01#),#0(!S%#F":%()+(Z:@:(#F#%:-:%(T-%).2,3)Y(!8"%+@@:"()+(Z:@:(#F#%:-:%(T-%).Y( 1`(
Java datastruktur oversikt versjon 2 Bank-objekt BankData-objekt konti BankUtsyn-objekt Konto-objekter <Alt som har med presentasjon og interaksjon med brukere> 2c(
Programskisse av hele Banksystemet Kontroll av Banksystemet public class Bank { private BankData b; private BankUtsyn u; public Bank( ) { b = new BankData( ); u = new BankUtsyn( ); public static void main (String [] args) { Bank bnk; bnk = new Bank( ); bnk.ordreløkke( ); void ordreløkke ( ) { // end Bank Prøv å kompilere (oversette) og kjøre denne skissen Utsyn for Bank class BankUtsyn { <Alt som har med presentasjon og interaksjon med brukere> BankData class BankData { <administrerer alle kontoene> Konto class Konto <data om en konto>
Bankklassedatastruktur main navn: bnk type: Bank bnk = new Bank(); bnk.ordreløkke(); navn: b Bank-objekt Bank type: BankData BankData-objekt lagnykunde lagbankkunde fjernbankkunde fjernbankkunde settinn sumallekonti sumallekonti settinn ordrelokke navn: konti BankUtsyn-objekt leskommando beomnavnogbelop hentnavn hentbelop beomoghentnavn skrivsum navn: u type: BankUtsyn HashMap-objekt type: HashMap Konto-objekter 21(
Fullstendig program import java.util.; En konto har en eier identifisert av en tekst (String) @author Stein Gjessing @version 13. januar 2011 class Konto { private String navn; private double saldo; Konstruktør setter kontoens saldo til 0. @param n navn på kontoens eier Konto (String n) { navn = n; saldo =0; Setter inn et beløp. @param b beløp public void setinn(double b) { saldo += b; Henter saldoen. @return saldo på konto public double hentsaldo() { return saldo; Henter eier. @return navn på eier public String henteier() { return navn; 22(
BankData er modellen / dataene i banksystemet. Denne klassen innehold er alle metoder som er nødvendige for å manipulere kontoer. En ny bank innholder ingen kontoer. Alle kontoenes eiere må ha forskjellige navn @author Stein Gjessing @versjon 13. januar 2011 class BankData { private HashMap <String,Konto> konti = new HashMap<String,Konto>(); Oppretter en ny konto i banken. @param kunde navn på kunden public void lagbankkunde(string navn) { konti.put(navn, new Konto (navn)); Fjerne en konto fra banken.! @param navn navn på kunde! public void fjernbankkunde(string navn) { konti.remove(navn); Summerer saldoen for alle kontoene i banken. @return summen av saldo for alle kontoer public double sumallekonti() { double sum = 0; for (Konto s: konti.values()) sum+= s.hentsaldo(); return sum; Setter inn penger på en konto. @param navn navn på kunde @param belop beløpet som settes inn. public void settinn (String navn, double belop) { Konto k = konti.get(navn); k.setinn(belop); 23(
Bank er kontrollklassen for dette banksystemet. Her ligger ordreløkken som styrer det hele. Denne klassen er bindeleddet mellom utsynet og datamodellen. @author Stein Gjessing @version 17. Januar 2011 public class Bank { private BankData b; private BankUtsyn u; Bank() { b = new BankData(); u = new BankUtsyn(); public static void main(string [] args) { Bank bnk = new Bank(); bnk.ordreløkke(); Lager en ny konto. void lagnykunde () { String nvn = u.beomoghentnavn(); b.lagbankkunde(nvn); Fjerner en konto. void fjernbankkunde () { String nvn = u.beomoghentnavn(); b.fjernbankkunde(nvn); Setter inn penger på en konto. Nødvendig informasjon hentes via ustynet. void settinn() { u.beomnavnogbelop(); String navn = u.hentnavn(); double bel = u.hentbelop(); b.settinn(navn,bel); Henter summen av saldo fra alle kontoer og viser resultatet ved hjelp av utsyn void sumallekonti() { double sum = 0; sum = b.sumallekonti(); u.skrivsum(sum); Ordreløkken som styrer kommandoene. void ordreløkke () { int valg; valg = u.leskommando(); while(valg!= 0) { switch (valg) { case 1: lagnykunde(); break; case 2: fjernbankkunde(); break; case 3: settinn(); break; case 4: sumallekonti(); break; default: u.skrivfeil("gi tall mellom 0-4"); valg = u.leskommando(); // end ordreløkke // end class Bank 24(
BankUtsyn brukes til innlesing og vising av kundedata. @author Stein Gjessing @version 13. Januar 2011 class BankUtsyn { private Scanner tast; // tast gir kortvarig oppbevaring av leste data private String navn; private double belop; Konstruktør BankUtsyn( ) { tast = new Scanner(System.in); Skriver ut menyen og leser inn kommandovalget. @return kommandovalget public int leskommando() { System.out.println("\nMeny: "); System.out.println("0 - avslutt"); System.out.println("1 - Opprett ny kunde "); System.out.println("2 - Fjern kunde"); System.out.println("3 - Sett inn penger"); System.out.println("4 - Finn forvaltningskapital"); System.out.print(" Velg funksjon: "); return (tast.nextint()); Ber om navn og beløp og lagrer. public void beomnavnogbelop() { System.out.print("\nGi navn og beløp (på hver sin linje): "); navn = tast.next(); belop = tast.nextdouble(); Henter navnet som er lest inn. @return navnet public String hentnavn() { return navn; Henter bløpet som er lest inn. @return beløpet public double hentbelop() { return belop; Ber om og henter et navn. @return navnet public String beomoghentnavn() { System.out.print("\nGi navn : "); return tast.next(); 25(
Skriver ut bankens forvaltningskapital. @param sum kapitalen som skrives ut public void skrivsum(double sum) { System.out.println("\nBankens forvaltningskapital: + sum); Skriver ut en feilmelding. @param feil feilmeldingen public void skrivfeil(string feil) { System.out.println(feil); // end BankUtsyn Kjør: >javadoc -package Bank.java 26(
f:#$"a((((t-:+(,(!e_0c4cy(! b@@:(/@.##:+(a(-:%<:+(%:#%:#()q+#%(#:9.+.%w(#k( #.-@:%(! j:a+:##%:#$"a(=(/;q+(.@@:(a.-@:(%:#%:+(o(:d%>("f:(zd:+( A."A(":(:"<+:#(T,//:(B.+:(%:#%(<:%("F:(-:<("F:( %:#%:+Y(! f:#$"a(/."(.@<+,(d,#:()+.di+(.d():,@w(b.+:(.%(#f#%:-:%( D,+/:+()+(D,##:(,""<.%.>(! J:D,#(.D(9+A+.--:+(p(! ^i+#(d."#/:@,a(a(<f+%(!?q"":+(#:a(b.+:(,(z:@%(#9:#,:@@:($@):@@:+( 27(
\&-:"%.#;"W(B+&/:+99@i+,"AW(,"")Q+,"A(!!//:(<:@(.D(<:':(/&+#:%W(-:"(-:A:%(D,/$A>(! \://:#(.D(."<+:(/&+#W(B@>.>(!e_0c4c( U!8f!m(q( e:#%:(&/:d((?,#%:+w(-:+(-(b@,a>0( 2`(