Du er her: UiO > 中国竞猜网_中国足彩网-足球推荐 > Emner > Matematikk og naturvitenskap > Informatikk > INF1000 > h08 > ukeoppgaver >

L?sningsforslag ukeoppg. 6:  29. sep - 2. okt (INF1000 - H?st 2008)

Klasser, objekter, og pekere (kap. 8.1 - 8.14)
NB! Disse er bare forslag til l?sninger, dine svar kan v?re like gode eller bedre selv om de ikke ligner p? dem.
Du f?r sannsynligvis mer utbytte av l?sningsforslagene etter at du har fors?kt ? l?se oppgaven selv.  Du kan ogs? finne l?sning p? noen av disse oppgavene i l?rebokens hjemmeside: www.universitetsforlaget.no/java.

M?l
F? et f?rste innblikk i hvordan man programmerer med klasser, objekter, og pekere.

Oppgaver til teoritimen

  1. KursRegister.java:  (eksempel fra forelesning uke 6)
    Studér f?lgende program, fra forelesningen uke 6 (side 16 i lysarkene), og utvid det som forklart i deloppgave (a) og (b) under.  Begge klassene lagres i én fil, kalt "KursRegister.java".
    class KursRegister {
    
        // Klasse-metode (dvs. med "static"):
        public static void main(String[] args) {
    
    	Kurs inf, mat; // pekere (variabler som kan peke p? Kurs-objekter)
    
    	inf = new Kurs(); // Lager et objekt av klassen Kurs
    	inf.kode = "INF1000"; // Setter verdier i objektet...
    	inf.studiepoeng = 10;
    	inf.skrivUt();
    
    	mat = new Kurs(); // Lager et objekt til av klassen Kurs
    	mat.kode = "MAT1010";
    	mat.skrivUt();
        }
    }
    
    class Kurs {
        // Objektvariabler:
        String kode;
        int studiepoeng;
    
        // Objekt-metode (dvs. uten "static"):
        void skrivUt() {
    	System.out.println("Kurs med kode: " + kode
    			   + ", og studiepoeng: " + studiepoeng);
        }
    }
    
    KJ?REEKSEMPEL:
    > java KursRegister
    Kurs med kode: INF1000, og studiepoeng: 10
    Kurs med kode: MAT1010, og studiepoeng: 0
    
    (a) Endre programmet slik at kursene lagres i en array av Kurs-pekere, i stedet for enkelt-pekerne inf og mat.  F.eks. skal et av setningene i programmet v?re: kurs[0].kode = "INF1000"; Arrayen skal ha plass til 3 kurs: INF1000, MAT1010, og INF1010.  Flytt registreringen av studiepoeng og utskrift om kursene til en l?kke, som setter inn 10 studiepoeng i hvert kurs f?r den kaller metoden skrivUt() Mer info: Se eksemplet p? side 21-23 i lysarkene for uke 6.
    class KursRegister {
    
        // Klasse-metode (dvs. med "static"):
        public static void main(String[] args) {
    
    	Kurs[] kurs = new Kurs[3]; // Array av Kurs-pekere
    
    	kurs[0] = new Kurs(); // Lager et objekt av klassen Kurs
    	kurs[1] = new Kurs(); // Lager et objekt til av klassen Kurs
    	kurs[2] = new Kurs(); // Lager et objekt til av klassen Kurs
    
    	kurs[0].kode = "INF1000"; // Setter verdier i objektene...
    	kurs[1].kode = "MAT1010";
    	kurs[2].kode = "INF1010";
    
    	for (int i = 0; i < kurs.length; i++) {
    	    kurs[i].studiepoeng = 10;
    	    kurs[i].skrivUt();
    	}
        }
    }
    
    class Kurs {
        // Objektvariabler:
        String kode;
        int studiepoeng;
    
        // Objekt-metode (dvs. uten "static"):
        void skrivUt() {
    	System.out.println("Kurs med kode: " + kode
    			   + ", og studiepoeng: " + studiepoeng);
        }
    }
    
    KJ?REEKSEMPEL:
    > java KursRegister
    Kurs med kode: INF1000, og studiepoeng: 10
    Kurs med kode: MAT1010, og studiepoeng: 10
    Kurs med kode: INF1010, og studiepoeng: 10
    

    (b) Legg til en klasse Foreleser, med én objektvariabel, navn, og utvid klassen Kurs slik at hvert kurs har peker til en foreleser.  Endre programmet fra del (a) slik at foreleserne i de 3 kurs blir hhv. "Arne M.", "Erik L.", og "Stein  G.".  Utvid ogs? metoden skrivUt() slik at det f?r tak i og skriver ut navnet p? foreleseren i hvert kurs.
    class KursRegister {
    
        // Klasse-metode (dvs. med "static"):
        public static void main(String[] args) {
    
    	Kurs[] kurs = new Kurs[3]; // Array av Kurs-pekere
    
    	kurs[0] = new Kurs(); // Lager et objekt av klassen Kurs
    	kurs[1] = new Kurs(); // Lager et objekt til av klassen Kurs
    	kurs[2] = new Kurs(); // Lager et objekt til av klassen Kurs
    
    	kurs[0].kode = "INF1000"; // Setter verdier i objektene...
    	kurs[1].kode = "MAT1010";
    	kurs[2].kode = "INF1010";
    
    	String[] forelesere = { "Arne M.", "Erik L.", "Stein  G." };
    
    	for (int i = 0; i < kurs.length; i++) {
    	    kurs[i].studiepoeng = 10;
    	    kurs[i].foreleser = new Foreleser();
    	    kurs[i].foreleser.navn = forelesere[i];
    	    kurs[i].skrivUt();
    	}
        }
    }
    
    class Kurs {
        // Objektvariabler:
        String kode;
        int studiepoeng;
        Foreleser foreleser;
    
        // Objekt-metode (dvs. uten "static"):
        void skrivUt() {
    	System.out.println("Kurs med kode: " + kode
    			   + ", og studiepoeng: " + studiepoeng
    			   + ". Foreleser: " + foreleser.navn);
        }
    }
    
    class Foreleser {
        String navn;
    }
    
    KJ?REEKSEMPEL:
    > java KursRegister
    Kurs med kode: INF1000, og studiepoeng: 10. Foreleser: Arne M.
    Kurs med kode: MAT1010, og studiepoeng: 10. Foreleser: Erik L.
    Kurs med kode: INF1010, og studiepoeng: 10. Foreleser: Stein  G.
    


  2. Oppgave 1, kap. 8 (side 174).
    Lag et program hvor main ligger i en klasse Prog1, og skriv en annen klasse ABC med et heltall int i.  Begge klassene skal v?re i samme fil (Prog1.java).

    (a) Deklarer en peker pek til ABC-klassen i main.
    (b) Lag et objekt av klassen ABC, og la pek peke p? det objektet.
    (c) Sett verdien av i til 14 i dette objektet.
    (d) Skriv ut p? skjermen verdien av i vha. en setning i main.
    (e) Deklarer en metode dobbelt() i ABC som dobler verdien av i.
    (f) Kall denne metoden fra main to ganger, og skriv s? ut fra main verdien av i i objektet.
    // L?sningsforslag:
    // F?lgende legges i fila Prog1.java (b?de klasse Prog1 og klasse ABC).
    class Prog1 {
    
        public static void main(String[] args) {
    	ABC pek; // (a) Deklarerer en peker til ABC
    
    	pek = new ABC(); // (b) Oppretter et objekt av ABC
    
    	pek.i = 14; // (c) Setter en verdi i objektet
    
    	System.out.println("Verdien av i = " + pek.i); // (d)
    
    	// (f):
    	pek.dobbelt();
    	pek.dobbelt();
    	System.out.println("Verdien av i = " + pek.i);
        }
    }
    
    class ABC {
        // Variabler:
        int i;
    
        // Metoder: (e)
        void dobbelt() {
    	i = i * 2;
        }
    }
    
    KJ?REEKSEMPEL:
    > javac Prog1.java
    > java Prog1
    Verdien av i = 14
    Verdien av i = 56
    


  3. Oppgave 2, kap. 8 (side 174).
    Fjern klassen ABC fra fila Prog1.java og legg den p? en egen fil, kalt ABC.java, i samme mappe.

    (a) Kompilér s? ABC.java og Prog1.java hver for seg.
    (b) Kj?r n? Prog1.java og se at du f?r det samme resultatet som i Oppgave 1.
    Klassen Prog1 fra forrige oppgave legges alene i filen med navn Prog1.java, og klassen ABC legges i en egen fil med navn ABC.java
    (a) S? kompilerer man (med javac) hver av disse to filene for seg, og
    (b) s? kj?rer man bare Prog1.java (med java) til slutt.
    Legg merke til at resultatet av dette, med klassene fordelt p? to filer, blir akkurat det samme som da man hadde begge klassene samlet i én fil:
    KJ?REEKSEMPEL:
    > javac Prog1.java
    > javac ABC.java
    > java Prog1
    Verdien av i = 14
    Verdien av i = 56
    


  4. Oppgave 3, kap. 8 (side 174).

    (a) Deklarer en objektvariabel double x i klassen Prog1.
    (b) Lag en objektmetode double settX(double y) i klassen Prog1 som setter verdien av x til parameterens verdi, og som returnerer den gamle verdien av x f?r den fikk den nye verdien.
    (c) Lag en ny metode som tester settX() med 10 000 kall i en l?kke.
    class Prog1 {
    
        double x; // (a)
    
        public static void main(String[] args) {
    	Prog1 peker = new Prog1();
    
    	// (b):
    	peker.x = 123;
    	System.out.println("Verdi av x f?r kall p? settX() = " + peker.x);
    	double gammelVerdi = peker.settX(456);
    	System.out.println("Verdi av x etter kall p? settX() = " + peker.x);
    	System.out.println("Gammel verdi av x, returnert av settX() = "
    			   + gammelVerdi);
    	// (c):
    	peker.testSettX();	    
        }
    
        double settX(double y) { // (b)
    	double tmp = x;
    	x = y;
            return tmp;
        }
    
        void testSettX() { // (c)
    	double gammelVerdi = 0;
    	System.out.println("\nTester settX() 10000 ganger, ved ? sette inn "
    			   + "verdiene 1 - 10000...");
    	for (int i = 1; i <= 10000; i++) {
    	    gammelVerdi = settX(i);
    	}
    	System.out.println("Verdi av x etter 10000 kall p? settX(): " + x);
    	System.out.println("Gammel verdi av x, returnert av siste kall"
    			   + "p? settX() = " + gammelVerdi);
        }
    }
    
    KJ?REEKSEMPEL:
    > java Prog1
    Verdi av x f?r kall p? settX() = 123.0
    Verdi av x etter kall p? settX() = 456.0
    Gammel verdi av x, returnert av settX() = 123.0
    
    Tester settX() 10000 ganger, ved ? sette inn verdiene 1 - 10000...
    Verdi av x etter 10000 kall p? settX(): 10000.0
    Gammel verdi av x, returnert av siste kallp? settX() = 9999.0
    


  5. Oppgave 4, kap. 8 (side 175).
    Utvid klassen Konto med get- og set-metoder for tekstene eier og adresse (dvs. metoder som kan returnere verdien, og sette nye verdier i disse objektvariabler).
    class KontoEksempel {
    
        public static void main(String[] args) {
    
            Konto k1 = new Konto();
    	k1.bestemKontonr();
    
            k1.settInn(500);
            System.out.println("Saldo er: " + k1.saldo);
    
            k1.taUt(300);
            System.out.println("Saldo er: " + k1.saldo);
        }
    }
    
    class Konto {
        int kontonr;
        int saldo;
        String eier, adresse;
        double rente = 2.5; // 2.5% per ?r
        static int nummer = 0; // Klassevariabel
    
        void bestemKontonr() {
    	nummer++;
    	kontonr = nummer;
        }
    
        void settInn(int innskudd) {
    	saldo = saldo + innskudd;
        }
    
        boolean taUt(int uttak) {
    	if (uttak > saldo) {
    	    return false;
    	}
    	saldo = saldo - uttak;
    	return true;
        }
    
        int getSaldo() {
    	return saldo;
        }
    }
    
    KJ?REEKSEMPEL:
    > java KontoEksempel
    Saldo er: 500
    Saldo er: 200
    
    class KontoEksempel {
    
        public static void main(String[] args) {
    
            Konto k1 = new Konto();
    	k1.bestemKontonr();
    
            k1.settInn(500);
            System.out.println("Saldo er: " + k1.saldo);
    
            k1.taUt(300);
            System.out.println("Saldo er: " + k1.saldo);
    
    	k1.settEier("Martin");
    	k1.sett中国竞猜网_中国足彩网-足球推荐("Oslo");
    	System.out.println("Eier: " + k1.getEier());
    	System.out.println("中国竞猜网_中国足彩网-足球推荐: " + k1.get中国竞猜网_中国足彩网-足球推荐());
        }
    }
    
    class Konto {
        int kontonr;
        int saldo;
        String eier, adresse;
        double rente = 2.5; // 2.5% per ?r
        static int nummer = 0; // Klassevariabel
    
        void bestemKontonr() {
    	nummer++;
    	kontonr = nummer;
        }
    
        void settInn(int innskudd) {
    	saldo = saldo + innskudd;
        }
    
        boolean taUt(int uttak) {
    	if (uttak > saldo) {
    	    return false;
    	}
    	saldo = saldo - uttak;
    	return true;
        }
    
        int getSaldo() {
    	return saldo;
        }
    
        String getEier() {
    	return eier;
        }
        String get中国竞猜网_中国足彩网-足球推荐() {
    	return adresse;
        }
        void settEier(String eier) {
    	this.eier = eier;
        }
        void sett中国竞猜网_中国足彩网-足球推荐(String adresse) {
    	this.adresse = adresse;
        }
    }
    
    KJ?REEKSEMPEL:
    > java KontoEksempel
    Saldo er: 500
    Saldo er: 200
    Eier: Martin
    中国竞猜网_中国足彩网-足球推荐: Oslo
    


  6. Oppgave 5, kap. 8 (side 175).
    Lag en metode ?rsoppgj?r() som legger renten til saldo for et ?r.  Ikke gj?r endringer p? saldo direkte, men vha. kall p? settInn-metoden du skrev i Oppgave 4.
    P? slutten av main-metoden:
    	k1.?rsoppgj?r();
    	System.out.println("Saldo etter ?rsoppgj?r: " + k1.getSaldo());
    
    I klassen Konto:
        void ?rsoppgj?r() {
    	settInn((int) (saldo * rente/100.0));
        }
    
    KJ?REEKSEMPEL:
    > java KontoEksempel
    Saldo er: 500
    Saldo er: 200
    Eier: Martin
    中国竞猜网_中国足彩网-足球推荐: Oslo
    Saldo etter ?rsoppgj?r: 205
    


  7. Oppgave 6, kap. 8 (side 175).
    Lag to klasser A og B som har pekere til hverandre, og bruk disse pekerne til ? kalle en metode i A fra B, og tilsvarende bruk pekeren i A til ? kalle en metode i B.  Begge disse metodene skal skrive ut en tekst p? skjermen.  Kj?r programmet og se at du f?r riktig utskrift.
    // Alle 3 klassene legges i en fil med navn: Oppg6.java
    class Oppg6 {
    
        public static void main(String [] args) {
    	A a1 = new A();
    	B b1 = new B();
    	a1.pekerTilB = b1;
    	b1.pekerTilA = a1;
    
    	a1.kallB();
    
    	b1.kallA();
        }
    }
    
    class A {
        B pekerTilB;
    
        void kallB() {
    	System.out.println("A: kallB()");
    	pekerTilB.skrivUt();
        }
    
        void skrivUt() {
    	System.out.println(" A: skrivUt()");
        }
    }
    
    class B {
        A pekerTilA;
    
        void kallA() {
    	System.out.println("B: kallA()");
    	pekerTilA.skrivUt();
        }
    
        void skrivUt() {
        	System.out.println(" B: skrivUt()");
        }
    }
    
    
    KJ?REEKSEMPEL:
    > java Oppg6
    A: kallB()
     B: skrivUt()
    B: kallA()
     A: skrivUt()
    

Oppgaver til terminaltimen

  • (De samme oppgavene som for teoritimen), eller f?lgende oppgave:


  • DvdSamling.java:  (Oblig3-relevant!)
    (a) Les fra fil: Lag et program som kan holde orden p? din dvd-samling.  Programmet skal best? av to klasser: DvdSamling og Dvd, og skal benytte en datafil med info om hver dvd.  N?r programmet starter oppretter det f?rst et objekt av selve klassen DvdSamling (se main-metoden i programskissen under).  Denne klassen har to objektvariabler: en array dvder[] av pekere til hver dvd, og et heltall antDvder som sier hvor mange av plassene i arrayen er benyttet, dvs. hvor mange dvd-er det er info om i arrayen, f.eks. n?r denne variabelen har verdien 10 s? betyr det at dvder[0] til dvder[9] har data.

    Programmet skal lese data om dvd-ene fra datafilen vha. en l?kke i metoden lesFraFil() (se skissen).  Her kan du laste ned et eksempel p? datafilen: dvddata.txt.  Hver dvd representeres i programmet som et objekt av klassen Dvd, som skal ha 6 objektvariabler: type, tittel, ?r, regiss?r, imdbRating (fra IMDb), og merInfo.  Skriv ferdig denne metoden som leser fra fil, og klassen Dvd.  Dataene er adskilt med "|" i datafilen, og ?ret med "()", s? bruk inWord("|"), inWord("|("), inInt("|)"), inDouble("|"), osv. til ? lese de, og readLine() til ? lese siste post (merInfo) hvis den ikke har "|" p? slutten.

    (b) Ordrel?kke: Etter ? ha lest datafilen g?r programmet i en ordrel?kke().  Programmér ordrene etter eget ?nske, f.eks. en ordre som lar bruker taste inn data om en ny dvd og legger den til i samlingen, ordrer for ? skrive ut lister over dvd-samlingen f.eks. sortert p? tittel, ?r, og rating; kanskje en ordre for ? endre merInfo-feltet, osv.  Lag helst en egen metode for hver ordre, da blir ting mer ryddig.

    (c) Skriv til fil: Lag ogs? en avslutt-kommando.  Da skal programmet g? ut av ordrel?kka og kj?ringen slutter i kallet p? metoden skrivTilFil() som st?r i main.  Programmér skrivTilFil() slik at den skriver ut dataene om dvd-ene til samme datafil.
    import easyIO.*;
    
    class DvdSamling {
        Dvd[] dvder;
        int antDvder;
    
        Out skjerm = new Out();
        In tast = new In();
    
        public static void main(String[] args) {
            DvdSamling d = new DvdSamling();
    	d.lesFrafil();
    	d.ordrel?kke();
    	d.skrivTilFil();
        }
    
        void lesFrafil() {
    	dvder = new Dvd[1000];
    
    	// Leser dvddata.txt:
    	In innfil = new In("dvddata.txt");
    
    	// L?kke som leser alt data fra fil (frem til endOfFile()):
    	int i = 0;
    	for ( i = 0; ! innfil.endOfFile(); i++) {
    	
    	    /* Koden for ? lese datafilen ble litt innviklet fordi det var
    	     * forskjellige skilletegn etter hverandre i datafila.  Hvis du vil
    	     * unng? ? m?tte bruke de innviklede ekstra-hoppe-setningene under
    	     * kan du endre datafila slik at skilletegnet mellom alle felt er
    	     * bare "|", uten mellomrom foran og bak.  ...Eller du kan
    	     * lese eksempel-datafila som var gitt vha. f?lgende kode:
    	     * [NB! .trim() fjerner alle blanke tegn foran og bak i en tekst.]
    	     */
    	    dvder[i] = new Dvd();
    	    dvder[i].type = innfil.inWord("| ");
    	    innfil.skipWhite(); // Hopper over mellomrommet etter type
    	    dvder[i].tittel = innfil.inWord("|(").trim();
    	    dvder[i].?r = innfil.inInt(")|");
    	    innfil.inChar(") "); // Hopper over ")" og flytter lesehodet til neste "|"
    	    dvder[i].regiss?r = innfil.inWord("|").trim();
    	    dvder[i].imdbRating = innfil.inDouble("|");
    	    innfil.inChar(); // Leser bort siste "|", som st?r rett f?r merInfo
    	    dvder[i].merInfo = innfil.readLine();
    
    	    // Kontrollutskrift for ? se at data ble lagret riktig i arrayen:
    	    /* skjerm.outln
    		(i + ": type=" + dvder[i].type + " tittel=" + dvder[i].tittel
    		 + " ?r=" + dvder[i].?r + " regiss?r=" + dvder[i].regiss?r +
    		 " imdb=" + dvder[i].imdbRating + " mer=" +dvder[i].merInfo);
    	     */
    	}
    	antDvder = i;
    	innfil.close();
        }
    
        void ordrel?kke() {
            int ordre = -1;
    
    	skjerm.outln("** Velkommen til DvdSamling.java **\n");
    
            while (ordre != 0) {
    
                // Legg her setninger som skriver ut menyen, f.eks. println-linjer,
                // eller skjerm.out()-linjer, eller kall p? en egen metode.
                skjerm.out("0 - Avslutt\n" +
    		       "1 - Skriv liste sortert p? tittel\n" +
    		       "2 - Legg til ny dvd\n" +
    		       "3 - Legg til info om dvd\n" +
    		       "Ordre: ");
    	    ordre = tast.inInt();
    
                switch (ordre) {
    	    case 0: /* Avslutt. Trenger ikke gj?re noe her. */; break;
    	    case 1: skrivListeSortertP?Tittel(); break;
    	    case 2: leggTilNyDvd(); break;
    	    case 3: leggTilInfoOmDvd(); break;
                }
    	    skjerm.outln();
            }
        }
    
        void skrivListeSortertP?Tittel() {
    	skjerm.outln("\n** Liste sortert p? tittel **");
    
    	// Lager en midlertidig array med dvd-navnene og ?r ( = sorteringsn?kkel):
    	String[] dvdNavn?r = new String[antDvder];
    	for (int i = 0; i < antDvder; i++) {
    	    dvdNavn?r[i] = dvder[i].tittel + "|" + dvder[i].?r;
    	}
    	// Sorterer den midlertidige arrayen:
    	java.util.Arrays.sort(dvdNavn?r);
    
    	// Skriver ut den sorterte lista:
    	for (int i = 0; i < antDvder; i++) {
    	    for (int j = 0; j < antDvder; j++) {
    		if (dvdNavn?r[i].equals(dvder[j].tittel + "|" + dvder[j].?r)) {
    		    System.out.printf
    			("%s%4.1f  %-32s (%4d) %s - %s\n",
    			 dvder[j].type, dvder[j].imdbRating, dvder[j].tittel,
    			 dvder[j].?r, dvder[j].regiss?r, dvder[j].merInfo);
    		}
    	    }
    	}
        }
    
        void leggTilNyDvd() {
    	skjerm.outln("\n** Legg til ny dvd **");
    	Dvd dvd = new Dvd();
    
    	skjerm.out("Tittel: ");
    	dvd.tittel = tast.inLine();
    	skjerm.out("?r: ");
    	dvd.?r = tast.inInt();
    
    	skjerm.out("Type (f=film, t=tv, a=andre): ");
    	dvd.type = tast.inWord();
    
    	tast.readLine(); // Hopper over linjeskift som bruker tastet etter type,
                             // det er n?dvendig for ? kunne lese 'Enter' alene n?:
    	skjerm.out("Regiss?r (trykk Enter = ingen): ");
    	dvd.regiss?r = tast.readLine();
    
    	skjerm.out("IMDb rating (trykk Enter = ingen): ");
    	String input = tast.readLine().trim();
    	if (input.length() > 0 && Character.isDigit(input.charAt(0))) {
    	    dvd.imdbRating = Double.parseDouble(input);
    	} else {
    	    dvd.imdbRating = -1;
    	}
    
    	skjerm.out("Mer info (trykk Enter = ingen): ");
    	dvd.merInfo = tast.readLine();
    
    	// Legger til den nye dvd-en i arrayen dvder[]:
    	dvder[antDvder++] = dvd;
        }
    
        void leggTilInfoOmDvd() {
    	skjerm.outln("\n** Legg til info om en dvd **");
    	for (int i = 0; i < antDvder; i++) {
    	    System.out.printf("%3d: %-2s %-32s (%4d) %s\n", i, dvder[i].type,
    			      dvder[i].tittel, dvder[i].?r, dvder[i].merInfo);
    	}
    	skjerm.out("Angi nr. p? dvd-en du vil skrive info om: ");
    	int nr = tast.inInt();
    	skjerm.out(">> N?v?rende info om \"" + dvder[nr].tittel + "\" = \""
    		   + dvder[nr].merInfo + "\"\nNy info-felt: ");
    	dvder[nr].merInfo = tast.inLine();
        }
    
        void skrivTilFil() {
    	skjerm.outln("Skriver data til fil...");
    	Out utfil = new Out("dvddata.txt");
    
    	// Skriver dvd-dataene til fil i et format som lesFraFil() kan lese:
    	for (int i = 0; i < antDvder; i++) {
    
    	    utfil.outln(dvder[i].type + " |" + dvder[i].tittel
    			+ " (" + dvder[i].?r + ")|"
    			+ dvder[i].regiss?r + " |" + dvder[i].imdbRating
    			+ "|" + dvder[i].merInfo);
    	}
    	utfil.close();
        }
    }
    
    class Dvd {
        String type; // Hva slags dvd?: "f"=film, "t"=tv-program, "a"=andre
        String tittel;
        int ?r;
        String regiss?r;
        double imdbRating;
        String merInfo;
    }
    
    KJ?REEKSEMPEL:
    ** Velkommen til DvdSamling.java **
    
    0 - Avslutt
    1 - Skriv liste sortert p? tittel
    2 - Legg til ny dvd
    3 - Legg til info om dvd
    Ordre: 2
    
    ** Legg til ny dvd **
    Tittel: The Incredibles
    ?r: 2004
    Type (f=film, t=tv, a=andre): f
    Regiss?r (trykk Enter = ingen):  
    IMDb rating (trykk Enter = ingen): 8.1
    Mer info (trykk Enter = ingen):  
    
    0 - Avslutt
    1 - Skriv liste sortert p? tittel
    2 - Legg til ny dvd
    3 - Legg til info om dvd
    Ordre: 3
    
    ** Legg til info om en dvd **
      0: f  The Shawshank Redemption         (1994) IMDb top 250
      1: f  The Godfather                    (1972) 
      2: f  The Dark Knight                  (2008) 
      3: f  The Godfather: Part II           (1974) 
      4: f  Il Buono, il brutto, il cattivo  (1966) 
      5: f  Pulp Fiction                     (1994) 
      6: f  Schindler's List                 (1993) 
      7: f  One Flew Over the Cuckoo's Nest  (1975) 
      8: f  Star Wars: Episode V - The Empire Strikes Back (1980) 
      9: f  12 Angry Men                     (1957) 
     10: a  Ifi-dvd                          (2008) 
     11: t  Seinfeld: Season 1               (1990) 
     12: t  The Prisoner - Complete Series   (1967) 
     13: f  The Incredibles                  (2004) 
    Angi nr. p? dvd-en du vil skrive info om: 2
    >> N?v?rende info om "The Dark Knight" = ""
    Ny info-felt: Batman Begins 2
    
    0 - Avslutt
    1 - Skriv liste sortert p? tittel
    2 - Legg til ny dvd
    3 - Legg til info om dvd
    Ordre: 1
    
    ** Liste sortert p? tittel **
    f 8.8  12 Angry Men                     (1957) Sidney Lumet - 
    a-1.0  Ifi-dvd                          (2008)  - 
    f 8.9  Il Buono, il brutto, il cattivo  (1966) Sergio Leone - 
    f 8.8  One Flew Over the Cuckoo's Nest  (1975) Milos Forman - 
    f 8.9  Pulp Fiction                     (1994) Quentin Tarantino - 
    f 8.8  Schindler's List                 (1993) Steven Spielberg - 
    t 9.4  Seinfeld: Season 1               (1990)  - 
    f 8.8  Star Wars: Episode V - The Empire Strikes Back (1980) Irvin Kershner - 
    f 9.0  The Dark Knight                  (2008) Christopher Nolan - Batman Begins 2
    f 9.1  The Godfather                    (1972) Francis F. Coppola - 
    f 9.0  The Godfather: Part II           (1974) Francis F. Coppola - 
    f 8.1  The Incredibles                  (2004)  - 
    t 9.2  The Prisoner - Complete Series   (1967)  - 
    f 9.1  The Shawshank Redemption         (1994) Frank Darabont - IMDb top 250
    


  • Ukens n?tt: Kr?llparentes-sjekk
    Lag et program som leser inn et annet Java-program som om det var en datafil, og sier om kr?llparentesene er balansert.  Hvis de ikke er det skal programmet gi en liten beskjed om den f?rste parentesfeilen det fant, som kan v?re en av to typer:
    Feil oppdaget p? linje 20: "}" uten foreg?ende "{".
    Feil: N?dde slutten av filen uten at alle "{" var lukket.
    
    Datafilen kan leses med inChar(); linjenummeret ?kes hver gang man leser et linjeskift '\n'.  Husk at kr?llparenteser som forekommer inne i kommentarer (/*...*/, //...\n) ikke skal telles med, og heller ikke de som er inne i tekst- og tegn-literaler ("...", '.').  Husk ogs? at tekst- og tegn-literaler kan inneholde \" og \'.  Du kan bruke boolske variabler for ? holde rede p? om man er inne i slike underveis i innlesingen.  Filnavnet p? .java-filen som skal sjekkes tas fra kommandolinjeargumentet (args[0]). 
  • L?sningsforslag: KrollTest.java  (Laget av Stian Valle i gr. 2)

    Hvis du finner en annen severdig l?sning send den gjerne til josek@ifi.uio.no s? legger jeg den ut her.