Løsningsforslag ukeoppg. 6:  26. sep - 2. okt (INF1000 - Høst 2012)

For løsningsforslag til oppgaver i læreboken "Rett på Java", se bokens nettside.

Løsningsforslag til repetisjonsoppgavene mangler.


NB! Legg merke til at disse er løsningsforslag.  Løsningene dine trenger ikke å være like med disse forslag for å være riktige.  Det er vanlig i programmering at samme oppgave kan løses på mange vidt forskjellige måter, og alle fremgangsmåter er ok i INF1000 så lenge de leder fram til riktig resultat og oppfyller kravene som står i oppgaveteksten.

Oppgaver

  1. KursRegister.java: 
    (a) Studér følgende program. Finn ut hva som er klassene, objektene, og pekerne i programmet, og hvordan disse er brukt.  Undersøk gangen i programmet når det kjøres.  Hvorfor skriver det ut forskjellig informasjon om to kurs når det bare er én System.out.println i programmet?  Begge klassene lagres i én fil, kalt KursRegister.java.
    class Kurs {
        // Objektvariabler:
        String kode;
        int studiepoeng;
    
        // Objekt-metode (dvs. uten "static"):
        void skrivUt() {
    	System.out.println("Kurs med kode: " + kode
    			   + ", og studiepoeng: " + studiepoeng);
        }
    }
    
    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 = "MAT1001";
    	mat.skrivUt();
        }
    }
    
    KJØREEKSEMPEL:
    > java KursRegister
    Kurs med kode: INF1000, og studiepoeng: 10
    Kurs med kode: MAT1001, og studiepoeng: 0
    
    Programmet skriver ut informasjon om to forskjellige kurs fordi metoden skrivUt() blir kalt to ganger fra klassen KursRegister, og den kalles via forskjellig Kurs-objekt hver gang, ved hjelp av disse setningene i koden ovenfor:
            inf.skrivUt();
            ...
            mat.skrivUt();

    (b) Mange kurs: Endre programmet slik at kursene lagres i en array av Kurs-pekere, i stedet for enkelt-pekerne inf og mat.  F.eks. skal første element i arrayen være kurs[0], og koden til denne (kurs[0].kode) skal være "INF1000".  Lag en løkke som oppretter tre kurs-objekter, setter verdien 10 som studiepoeng i alle, og setter kode til kursene ved å ta ett og ett navn fra følgende tilleggsarray:
    String[] koder = { "INF1000", "MAT1001", "INF1080" };
    Løkken skal til slutt kalle metoden skrivUt() for å skrive ut info om kursene som opprettes. 
    class Kurs {
        // Objektvariabler:
        String kode;
        int studiepoeng;
    
        // Objekt-metode (dvs. uten "static"):
        void skrivUt() {
    	System.out.println("Kurs med kode: " + kode
    			   + ", og studiepoeng: " + studiepoeng);
        }
    }
    
    class KursRegister {
    
        // Klasse-metode (dvs. med "static"):
        public static void main(String[] args) {
    
    	Kurs[] kurs = new Kurs[3]; // Array av Kurs-pekere
    	String[] koder = { "INF1000", "MAT1001", "INF1080" };
    
    	for (int i = 0; i < kurs.length; i++) {
    	    kurs[i] = new Kurs(); // Lager et objekt av klassen Kurs
    	    kurs[i].studiepoeng = 10;  // Setter verdier i objektene...
    	    kurs[i].kode = koder[i];
    	    kurs[i].skrivUt();
    	}
        }
    }
    
    KJØREEKSEMPEL:
    > java KursRegister
    Kurs med kode: INF1000, og studiepoeng: 10
    Kurs med kode: MAT1001, og studiepoeng: 10
    Kurs med kode: INF1080, og studiepoeng: 10
    

    (c) Legg til foreleser: Anta at hvert kurs har én foreleser og at vi bare ønsker å lagre navnet på foreleseren i hvert kurs.  Utvid programmet med objektvariabelen String foreleser i klassen Kurs, og slik at verdien i denne initialiseres med følgende foreleser-navn for de tre kurs, henholdsvis "Ragnhild K.", "Erik L.", og "Roger  A." (bruk gjerne en tilleggsarray slik som i del (b) ovenfor). Utvid også metoden skrivUt() slik at det får tak i og skriver ut navnet på foreleseren i hvert kurs.
    class Kurs {
        // Objektvariabler:
        String kode;
        int studiepoeng;
        String foreleser;
    
        // Objekt-metode (dvs. uten "static"):
        void skrivUt() {
    	System.out.println("Kurs med kode: " + kode
    			   + ", og studiepoeng: " + studiepoeng
    			   + ". Foreleser: " + foreleser);
        }
    }
    
    class KursRegister {
    
        // Klasse-metode (dvs. med "static"):
        public static void main(String[] args) {
    
    	Kurs[] kurs = new Kurs[3]; // Array av Kurs-pekere
    	String[] koder = { "INF1000", "MAT1001", "INF1080" };
    	String[] forelesere = { "Ragnhild K.", "Erik L.", "Roger A." };
    
    	for (int i = 0; i < kurs.length; i++) {
    	    kurs[i] = new Kurs(); // Lager et objekt av klassen Kurs
    	    kurs[i].studiepoeng = 10;  // Setter verdier i objektene...
    	    kurs[i].kode = koder[i];
    	    kurs[i].foreleser = forelesere[i];
    	    kurs[i].skrivUt();
    	}
        }
    }
    
    KJØREEKSEMPEL:
    > java KursRegister
    Kurs med kode: INF1000, og studiepoeng: 10. Foreleser: Ragnhild K.
    Kurs med kode: MAT1001, og studiepoeng: 10. Foreleser: Erik L.
    Kurs med kode: INF1080, og studiepoeng: 10. Foreleser: Roger A.
    

    (d) Legge til studenter: Anta at hvert kurs har maks. 200 studenter.  Hvordan kan vi legge til informasjon om studentene i kursene? Undersøk følgende to muligheter: Legge til en array String[] studenter; vs. å lage en ny klasse Student med en objektvariabel navn.  Hvilken av de to variantene vil være mest hensiktsmessig hvis vi vil lagre enda mer informasjon om hver student i systemet (i tillegg til navn)?
    Det er bedre å lage en klasse Student, og så lagre informasjon om studentene i objekter av denne klassen, f.eks. ved hjelp av en array Studenter[] studenter = new Studenter[200]; deklarert i klassen Kurs. Fordelen er at man da kan samle forskjellig type informasjon om en student i ett og samme student-objekt.