INNHOLDSFORTEGNELSE 1. HOVEDEMNER... 1-i 1. INNHOLDSFORTEGNELSE... 1-i 1. Datamaskiner og programmeringsspråk...1-1 Emneoversikt... 1-2 Mål med kurset: problemløsing på datamaskin... 1-3 Hva er et program?... 1-4 Syntaks, semantikk, pragmatikk... 1-5 Programmeringsmetodikk: Objektorientert programmering (OOP)... 1-6 Læremåte... 1-7 Datamaskinens virkemåte: analogi... 1-8 Datamaskin og programvare: løk-modellen... 1-10 To utsnitt (views) av et program (som også er et objekt)... 1-11 Programoversettelse... 1-12 Dataspråk... 1-13 Programoversettelse for Java... 1-14 Java modell... 1-15 Java plattformuavhengighet... 1-16 Makinvarekonfigurasjon... 1-17 Nettverk... 1-18 Verktøy: Java Development Kit (JDK 5.0)... 1-19 State-of-the-art kurs i programmering... 1-20 Programmering er tidskrevende!... 1-21 i/xvii
Programmeringsspråk: Java...1-22 Java programstruktur og -miljø...1-23 Et enkelt selvstendig program...1-24 Fremgangsmåten for å skrive og kompilere et program...1-28 2. Grunnleggende programelementer...2-1 Emneoversikt...2-2 Et språk = syntaks + semantikk...2-3 Datamaskinens språk : binært tallsystem...2-4 Konvertering mellom tallsystemer...2-5 Identifikatorer og litteraler...2-8 Grunnleggende enheter...2-9 Programdokumentering v.h.a. kommentarer...2-10 Data...2-11 Verdier og objekter i Java...2-12 Primitive datatyper og variabler...2-13 Oppsummering: Primitive datatyper...2-14 Deklarasjon av variabler...2-15 Lager og verdier...2-16 Uttrykk...2-17 Entydighetsregler: presedens og assosiativitet til operatorer...2-19 Aritmetiske uttrykk...2-20 Tilordningsoperator...2-24 Innlesing av tall fra terminalen...2-25 Enkelt valg: Endring av kontrollflyt...2-27 Sannhetsuttrykk...2-28 (Verdi-) Sammenligningsoperatorer...2-29 ii/xvii
Kontrollflyt: if-setning...2-30 Setninger...2-32 "Lokal" blokk... 2-32 Avslutningstegn: ;... 2-32 Kontrollflyt: if-else-setning...2-34 Eksempel: if-else-setning...2-35 Logiske operatorer...2-36 Kortsluttende logiske operatorer...2-37 De Morgans lover...2-41 Programfeil i Java...2-45 Programlesbarhet...2-47 Utdrag: Presedensrangering (i avtagende rekkefølge)...2-48 Programutviklingsprosess...2-49 Programutviklingsprosess...2-50 Oversikt: løkker...2-53 while-løkke...2-54 Inkrement- og dekrementoperatorer...2-55 Problemløsing: topp-ned stegvis forfining...2-56 Algoritmeutforming...2-57 Eksempel: vakt-kontrollert repetisjon...2-58 Fremgangsmåten ved skriving av et program...2-59 Algoritmeutforming (strykprosent)...2-61 Eksempel: teller-kontrollert repetisjon...2-62 do-while-løkke...2-65 Sammenligning: while og do-while... 2-67 Påstander...2-69 Påstander: assert-setning...2-70 iii/xvii
Kjøring med påstander...2-71 Eksempel på påstand den enkle formen...2-72 Eksempel på påstand med tilleggsinformasjon...2-75 Merknader om påstander...2-77 3. Bruk av objekter...3-1 Emneoversikt...3-2 Innføring i objektmodellen...3-3 Hva menes med en abstraksjon?...3-4 Modellering av abstraksjoner v.h.a. klasser...3-6 Klassedeklarasjoner...3-7 Kildekode for klassen Lys...3-9 Objekter som instanser av klasser...3-10 Opprettelse av objekter...3-11 Referanser og referanseverdier...3-13 Kommunikasjon mellom objekter v.h.a. meldinger...3-15 Sekvensdiagram... 3-15 Manipulering av referanser...3-18 Klassen java.lang.string... 3-20 Tegnsett...3-21 Tegn og strenger...3-22 Strenger...3-23 To viktige String-metoder...3-25 Strengsammenslåing: +... 3-26 Strengsammenligning...3-27 String-objekter...3-28 Andre String-metoder (Program 3.3, s. 63)...3-29 iv/xvii
for-løkke...3-31 Definisjonsområde til løkkevariabelen i for-løkke...3-33 Fremgangsmåten ved skriving av et program...3-34 Mer om for-løkke...3-37 Nøstede løkker...3-39 "Baklengs" for-løkke... 3-39 Valg av løkker... 3-42 break-setning i løkker...3-43 continue-setning i løkker...3-44 Mer om vaglsetning: switch-setning...3-45 Tabeller...3-50 Tabeller: grafisk notasjon...3-55 Fler-dimensjonale tabeller: tabeller av tabeller...3-56 Lagring av tabell-elementer...3-57 Programmønstre noen enkle algoritmer...3-58 Mer om initialisering av tabeller...3-59 Histogram...3-60 4. Utforming av egne klasser...4-1 Emneoversikt...4-2 Klassedeklarasjon...4-3 Utforming av klassen Lys...4-4 Deklarasjon av egenskaper: feltvariabler...4-5 Objekter...4-6 Referansedeklarasjon...4-7 Objektopprettelse...4-8 Konstruktørkall...4-9 v/xvii
Den implisitte standardkonstruktøren...4-10 Standardverdier (default values) for feltvariabler...4-11 Deklarasjon av atferd: metoder...4-12 Klassen Lys: metoder...4-13 Adgangsmodifikatorer...4-15 Returverdi... 4-15 Signatur: Metodenavn og formelle parametere...4-16 Metodekropp og return-setning...4-17 Lokale variabler og feltvariabler...4-18 Forskjeller mellom feltvariabler og lokale variabler...4-19 Lokal blokk...4-20 Metodeklassifisering...4-21 Meldinger: Metodekall...4-22 Metoder uten parametere...4-24 Parameterangivelse i metodekall: Aktuelle parametere...4-25 Parameterdeklarasjon: Formelle parametere...4-26 Parameteroverføring: referanserverdi for objekter...4-27 Parameteroverføring: verdier av primitive datatyper (I)...4-28 Parameteroverføring: verdier av primitive datatyper (II)...4-29 Parameteroverføring: referanseverdien til tabeller...4-30 Parameteroverføring: tabellelement av primitiv type...4-31 Parameteroverføring: tabell av tabeller...4-32 Samsvar mellom formelle og aktuelle parametere...4-33 Eksempler med parameteroverføring...4-34 Implisitt konvertering under parameteroverføring...4-35 Oppsummering...4-38 Det aktuelle objektet: this...4-39 vi/xvii
Eksempel: Bruk av this...4-40 Statiske medlemmer i klasser...4-41 Merknader om statiske medlemmer...4-43 Eksempel: statiske medlemmer...4-44 Å referere til medlemmer innad i klassen...4-46 Klassemedlemmer...4-47 Typer...4-48 Definisjonsområde...4-49 Levetid...4-50 Kommandolinjeargumenter...4-52 Konstruktører...4-53 Konstruktørdeklarasjon...4-54 Den eksplisitte standardkonstruktøren...4-56 Ikke-standardkonstruktører...4-57 Konstruktøroverlasting...4-58 En del merknader om konstruktører...4-59 5. Objektkommunikasjon...5-1 Emneoversikt...5-2 Ansvar og roller...5-3 Lage gode abstraksjoner...5-4 Programmeringsmetodologi: strukturert programmering...5-5 Gjentakelse i programkode...5-6 Kode med mindre gjentakelser og bedre abstraksjoner...5-9 Kommunikasjon og samarbeid...5-11 Forbindelser: UML-notasjon...5-12 Eksempel på forbindelser...5-13 vii/xvii
Objekteierskap...5-14 Innkapsling...5-15 Skjuling av informasjon...5-16 Data-abstraksjon vha. skjuling av informasjon...5-17 Klasseutforming...5-18 Metodeoverlasting...5-19 Dokumentering av kildekode...5-20 Hvilken av disse funksjonene er enklest å forstå?...5-21 Javadoc kommentarer...5-22 Eksempel: CD-samling...5-23 Javadoc...5-30 Generert dokumentasjon (javadoc)...5-31 Erfaring...5-32 6. Arv...6-1 Emneoversikt...6-2 Arv: motivasjon og sentrale begreper...6-3 Arv: viktige begreper...6-4 Et første eksempel på bruk av arv...6-5 Utvidelse av egenskaper og atferd...6-6 Superklassen: Lys... 6-7 Superklasse-konstruktører...6-9 Bruk av this() og super() i konstruktører...6-10 Klienters bruk av subklasse-objekter...6-11 Bruk av arvede medlemmer...6-13 Superklassereferanser og subklasseobjekter...6-17 Overkjøring av instansmetoder...6-18 viii/xvii
Overskygging av feltvariabler...6-19 Endelige klasser og medlemmer (final)...6-20 Konvertering av referanser...6-22 Sub er-en Sup...6-23 Eksempel: Brus-automater...6-24 OOP (Objektorientert programmering)...6-45 Metoder + data = objekter... 6-45 7. Mer om arv...7-1 Emneoversikt...7-2 Programmering med arv...7-3 Polymorfe referanser...7-4 Dynamisk metodeoppslag...7-5 Bruk av polymorfe referanser...7-6 Konsekvenser av polymorfisme...7-8 Kontrakter i Java...7-9 Arvhierarki...7-13 Bruk av kontrakter for å håndtere objekter av flere typer...7-14 Oppsummering av kontrakter i Java...7-17 Abstrakte klasser...7-18 Arv kontra aggregering...7-24 Innkapsling av primitive datatyper...7-25 Nyttige metoder i klasseinnpakninger...7-28 Synlighet: Pakker...7-30 Synlighet: Pakkehierarki i Java...7-31 Pakkehierarki tilsvarer filhierarki...7-40 Metodebinding...7-49 ix/xvii
Overkjøring kontra Overlasting...7-50 Substitusjonsprinsippet - Liskov...7-53 8. Sortering og søking...8-1 Emneoversikt...8-2 Pseudokode...8-3 Ordnede datamengder...8-4 Boblesortering...8-5 Sortering ved utvalg...8-6 Sortering ved innsetting...8-7 Kontrakten Comparable...8-8 Sortering av objekter...8-9 Linært søk...8-10 Binært søk...8-11 Binært søk for objekter...8-13 Eksempel: sortering og søking med objekter...8-14 Eksempel: sortering og søking med objekter (forts.)...8-16 Eksempel: sortering og søking med objekter (forts.)...8-17 9. Dynamiske datastrukturer - del I...9-1 Emneoversikt...9-2 Dynamiske datastrukturer...9-3 Abstrakte datatyper: ADT = datastruktur + kontrakt... 9-3 Dynamiske strenger: StringBuffer-klassen...9-4 Operasjoner på strengbuffere...9-6 StringBuffer-objekt...9-7 Operasjoner på strengbuffere (forts.)...9-8 x/xvii
Operasjoner på strengbuffere (forts.)...9-9 Samlinger...9-10 Kontrakten Collection<E>...9-11 Mengdelæren...9-13 Traversering av en samling...9-14 Dynamiske tabeller: ArrayList<E>...9-15 Dynamiske tabeller (DynamiskTabKlient.java)...9-16 Mengder: HashSet<E>...9-17 Eksempel: Mengder (MengdeKlient.java)...9-18 Eksempel: Lage en dynamisk tabell uten duplikater (Duplikater.java)...9-19 Nøkkeltabeller: HashMap<K,V>...9-20 Kontrakten Map<K,V>...9-21 Basisoperasjoner i kontrakten Map<K,V>...9-22 Eksempel: Basisoperasjoner i kontrakten Map<K,V>...9-23 Nøkkeltabellutsnitt...9-25 Bruk av nøkkeltabeller (NoekkelTabKlient.java)...9-27 9. Dynamiske datastrukturer - del II...9-1 Emneoversikt...9-2 Kjedete lister...9-3 Klassen Node...9-4 Klassediagram for enkel kjedet liste (Figur 9.4)...9-5 En konkret kjedet liste med strenger... 9-5 Kontrakten IKjedetListe<E>...9-7 Klassen KjedetListe<E>...9-8 Innsetting foran i en kjedet liste (Program 9.7)...9-9 Innsett en node foran i en kjedet liste (Figur 9.6)...9-10 xi/xvii
Innsetting bak i en kjedet liste...9-11 Innsett en node bak i en kjedet liste (Figur 9.7b og c)...9-12 Sletting foran i en kjedet liste...9-13 Slett node foran i en kjedet liste (Figur 9.8b og c)...9-14 Sletting bak i en kjedet liste (Program 9.7)...9-15 Slett en node bak i en kjedet liste (Figur 9.10, stegene 3 og 4)...9-17 Sletting inne i en kjedet liste (Program 9.7)...9-19 Sletting av en node inne i listen (Figur 9.11, steg 1)...9-20 Sletting av en node inne i listen (Figur 9.11, steg 2)...9-22 Data kan deles mellom kjedete lister...9-26 Datastrukturen stabel...9-27 Stabeloperasjoner...9-28 Stabelimplementering ved aggregering...9-29 Klient som bruker en stabel (StabelKlient.java)...9-31 Bruk av stabler...9-33 Rutenett som graf...9-34 Problemstilling...9-35 Steg for å finne byer som kan nås fra bynummer 3...9-36 Eksempel: Graf...9-37 Datastrukturen kø...9-40 Køoperasjoner... 9-40 Køimplementering ved arv...9-41 Klient som bruker en kø (KoeKlient.java)...9-42 10. Rekursjon...10-1 Emneoversikt...10-2 Rekursjon...10-3 xii/xvii
To iterate is human; to recurse, divine... 10-3 Rekursive definisjoner...10-4 Rekursjon som problemløsningsteknikk... 10-5 Utforming av rekursjon...10-6 Fakultet funksjon...10-7 Eksempel: Iterativ utregning av fakultet...10-8 Eksempel: Rekursiv utregning av fakultet...10-9 Nøsting av metodekall...10-10 Rekursive algoritmer...10-11 Metodeaktivisering og rekursjonsdybde...10-12 Huskeregeler for bruk av rekursjon...10-13 Forskjellige typer rekursjon...10-14 Sammenligning av rekursjon og iterasjon...10-15 Binært søk...10-16 Java implementasjon av binærsøkalgoritme...10-19 Søke eksempel...10-20 Tårn i Hanoi...10-21 Tårn i Hanoi (en ring)...10-22 Tårn i Hanoi (to ringer)...10-23 Tårn i Hanoi: rekursiv algoritme...10-24 Programstabel som vokser og krymper...10-27 Rekursiv sorteringsalgoritme: Quicksort...10-28 Eksponentiell økning i antall metodekall...10-35 Fibonacci-serien...10-36 11. Unntakshåndtering...11-1 Emneoversikt...11-2 xiii/xvii
Hva er et unntak?...11-3 Litt om programutføring...11-4 Metodeutføring (Program 11.1)...11-6 Normal utføring (Figur 11.1)"kast og fang"-prinsippet...11-7 Unntakspropagering (ved heltallsdivisjon med 0) (Figur 11.2)...11-9 Unntakspropagering...11-10 Typiske scenarier ved bruk av try-catch-setning...11-12 try-catch-scenarier (Figur 11.4)... 11-13 try-catch-scenario 1...11-14 Unntakshåndtering (Program 11.2)...11-15 Unntakshåndtering (Figur 11.5) (scenario 1)...11-16 try-catch-scenario 2...11-17 Unntakshåndtering (Figur 11.6) (scenario 2)...11-18 try-catch-scenario 3...11-19 Unntakshåndtering (Program 11.3) (scenario 3)...11-20 Unntakshåndtering (Figur 11.7) (scenario 3)...11-22 Utdrag av unntaksklasser (Figur 11.8)...11-23 Utdrag av metoder fra Throwable-klassen (Tabell 11.1)...11-24 Unntaksklassen Exception og kontrollerte unntak...11-25 Unntaksklassen RuntimeException og ikke-kontrollerte unntak... 11-25 Unntaksklassen Error... 11-25 Eksplisitt kast av unntak (Program 11.4)...11-27 Definere egne unntakstyper...11-29 try-blokk med flere catch-blokker (Progam 11.5)...11-31 Typiske programmeringsfeil ved unntakshåndtering...11-34 Håndtering av kontrollerte unntak (Program 11.6)...11-38 Utføring av finally-blokk...11-41 xiv/xvii
Unntakskasting og arv...11-44 Oppsummering av unntakshåndtering...11-45 12. Filer og strømmer...12-1 Emneoversikt...12-2 Inn- og ut-data...12-3 Strømmer...12-4 Bytestrømmer og tegnstrømmer...12-5 Bytestrømmer (Figur 12.1)...12-6 Tegnstrømmer (Figur 12.2)...12-7 Filbehandling...12-8 Standard lengde for predefinerte datatyper (Tabell 12.1)...12-9 Filsti...12-10 Dataposter (Figur 12.3)...12-11 Binære filer...12-12 Utskriving av binære verdier (Figur 12.4)...12-13 Saksgangen for å skrive binære verdier på en fil (Figur 12.4, Program 12.2)...12-14 Eksempel: Skriving av binære verdier (Program 12.2)...12-15 Innlesing av binære verdier (Figur 12.5)...12-16 Innlesing av binære verdier...12-17 Eksempel: Lesing av binære verdier (Program 12.2)...12-18 Håndtering av slutt på inndata for binær innlesing (Program 12.3)...12-20 Tekstfiler...12-23 Utskrift til en tekstfil (Figur 12.6)...12-24 Utskrift til tekstfiler (Figur 12.6 og Program 12.4)...12-25 Innlesing fra en tekstfil (Figur 12.7)...12-26 Innlesing fra tekstfiler (Figur 12.7, Figur 12.8 og Program 12.4):...12-27 xv/xvii
Innlesing og konvertering av tekst til primitive verdier (Figur 12.8)...12-28 Terminal I/O...12-29 Utskrift til terminalen...12-30 Innlesing fra terminalen...12-32 Eksempel: Innlesing fra terminalen...12-33 Klassen Terminal...12-36 Objektserialisering...12-37 Utskriving av objekter og binære verdier (Figur 12.11)...12-38 Utskriving av objekter...12-39 Saksgangen for å serialisere objekter til en fil (Figur 12.11 og Program 12.6):...12-40 Innlesing av objekter og binære verdier (Figur 12.12)...12-41 Innlesing av objekter...12-42 Saksgangen for å deserialisere objekter fra en fil (Figur 12.12 og Program 12.6)...12-43 Mer om serialisering...12-44 Direkte filtilgang (Figur 12.13)...12-45 Direkte filtilgang (Tabell 12.2)...12-46 Bruk av klassen RandomAccessFile...12-48 Eksempel: Bruk av direkte filtilgang (Program 12.8)...12-50 13. Grafiske brukergrensesnitt...13-1 Emneoversikt...13-2 GUI-baserte applikasjoner...13-4 Komponenter...13-7 Etiketter: JLabel...13-8 Farge: Color...13-9 Containere...13-10 Vinduer og rammer...13-12 xvi/xvii
Innholdruten til en rot-comtainer...13-13 Merknader om GUI-utvikling (Program 13.1)...13-19 Paneler: JPanel...13-22 GUI-kontrollkomponenter...13-23 FlowLayout...13-30 BorderLayout...13-32 GridLayout...13-38 Teknikk for å unngå at komponentene blir strukket (Program 13.5)...13-41 Hendelsesdelegeringsmodell...13-45 Ekstern lytter: Implementering (Program 13.6)...13-53 Bruk av dialogvinduer (Program 13.11 og 13.12)...13-74 Oppførsel til Progam 13.11 og 13.12...13-75 Implementering av klassen EkkoMedDialogvindu (Program 13.11)...13-79 Implementering av klassen HeltallsDialogvindu (Program 13.12)...13-82 Eksempel på anonymklasser (Program 13.13)...13-89 Merknader om anonymklasser...13-93 Presentasjon av utdata til brukeren...13-100 Lesing av inndata fra brukeren...13-102 Bekreftelse av opplysninger fra brukeren...13-105 Programmeringsmodellen for GUI-applikasjoner...13-110 xvii/xvii