L?sningsforslag ukeoppg. 7:  6. - 9. okt (INF1000 - H?st 2008)

Mer om klasser og objekter (kap. 8.17 - 8.18), UML (kap. 12.1 - 12.9)
NB! Disse er bare forslag til l?sninger, dine svar kan v?re like gode eller bedre selv om de ser annerledes ut.
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? mer ?velse i bruk av klasser og objekter; en innf?ring i UML-diagrammer (klassediagrammer og objektdiagrammer); og tips til ? komme i gang med oblig 3.

Oppgaver til teoritimen

  1. Hint til Oblig3-HybelHus:  (side 5 - 9 i oppgaveteksten)
    Les og forklar hintene bak i oppgaveteksten, f.eks. om konstrukt?rer (hint 2), null-pekere (hint 3), konvertering mellom char og int (hint 4), osv...


  2. UML-klassediagram:  Oppgave 1 i kap. 12 (side 239)
    En student har null eller flere eksamener. Lag et klassediagram om dette forholdet mellom klassene Student og Eksamen.

    Figuren viser ogs? eksempler p? objektvariabler (ikke spurt om i oppgaven).


  3. UML-klassediagram og -objektdiagram:  Oppgave 3 i kap. 12 (side 239)
    Banken "B-bank" har flere bankkonti, og en kunde kan ha flere bankkonti i B-bank.
    (a) Lag et klassediagram i UML over B-bank, kunder, og konti, og f? med antall p? forholdene mellom klassene.

    Figuren viser ogs? eksempler p? objektvariabler og objektmetoder (ikke spurt om i oppgaven).

    (b) Finn ut hvordan du vil lage en programstruktur som kan svare p? sp?rsm?l om hvilke bankkonti en kunde har i B-bank, og som kan skrive ut samlet saldo p? alle konti for en kunde og samlet for B-bank. Tegn et objektdiagram for systemet.

    Figuren viser ogs? eksempler p? objektvariabler (ikke spurt om i oppgaven).


  4. Kursoppmeldingssystemet:
    I de f?lgende oppgavene tar vi utgangspunkt i programmet Studentregister.java fra kapittel 8.17 (side 160-172):
    Oversikt over klassene i programmet:
    class Studentregister {
       public static void main(String[] args) {
          Institutt institutt = new Institutt();
          institutt.meny();
       }
    }
    
    class Institutt {
       Kurs[] kurs = new Kurs[10];
       int antKurs = 0;
       Student[] studenter = new Student[300];
       int antStudenter = 0;
    
       // Metoden meny()
    
       // Metoder som utf?rer kommandoene i menyen.
    }
    class Kurs {
       String kurskode;
       Ukedag dag;
       int tid;
    
       Student[] studenter = new Student[300];
       int antStudenter;
    }
    
    class Student {
       String navn;
    
       Kurs[] kurs = new Kurs[4];
       int antKurs;
    }
    Se ogs? klassediagrammet p? side 161 i l?reboka.
    Programmet Studentregister.java:  (klikk for ? laste ned programmet)
    import easyIO.*;
    
    class Studentregister {
    
        public static void main(String[] args) {
            Institutt institutt = new Institutt();
            institutt.meny();
        }
    }
    
    class Kurs {
        String kurskode;
        Ukedag dag;
        int tid;
    
        Student[] studenter = new Student[300];
        int antStudenter;
    
        Kurs(String kode, Ukedag dag, int tid) {
            kurskode = kode;
            this.dag = dag;
            this.tid = tid;
        }
    
        boolean erFullt() {
            return antStudenter == studenter.length;
        }
    
        void meldP?Student(Student s) {
            studenter[antStudenter++] = s;
        }
    }
    
    class Student {
        String navn;
    
        Kurs[] kurs = new Kurs[4];
        int antKurs;
    
        Student(String navn) {
            this.navn = navn;
        }
    
        boolean maksKurs() {
            return antKurs == kurs.length;
        }
    
        void meldP?Kurs(Kurs k) {
            kurs[antKurs++] = k;
        }
    
        void skrivTimeplan() {
            Out skjerm = new Out();
            skjerm.outln("Timeplan for " + navn);
            skjerm.outln();
            skjerm.out("tid/dag\t");
    
            for (String dagnavn : Ukedag.alleNavn) {
                skjerm.out(dagnavn + "\t");
            }
    
            skjerm.out("\n-----------------------------------");
            skjerm.outln("-----------------------------------");
    
            for (int tid = 8; tid < 18; tid++) {
                skjerm.out(tid, 5);
                skjerm.out(" |");
    
                for (int i = 0; i < antKurs; i++) {
                    if (kurs[i].tid == tid) {
    		    for (int j = 0; j < kurs[i].dag.nr; j++) {
    			skjerm.out("\t");
    		    }
    		    skjerm.out(kurs[i].kurskode);
                    }
                }
    	    skjerm.outln();
            }
        }
    }
    
    class Institutt {
        Kurs[] kurs = new Kurs[10];
        int antKurs = 0;
    
        Student[] studenter = new Student[300];
        int antStudenter = 0;
    
        In tast = new In();
        Out skjerm = new Out();
    
        Institutt() {
            In fil = new In("register.txt");
            while (!fil.endOfFile()) {
                String kurskode = fil.inWord();
                int dagnr = fil.inInt();
                int tid = fil.inInt();
                Ukedag ukedag = new Ukedag(dagnr);
                kurs[antKurs++] = new Kurs(kurskode, ukedag, tid);
            }
        }
    
        void meny() {
            String meny =
    	    "\n" +
    	    "1 - meld student p? kurs\n" +
    	    "2 - lag timeplan for student\n" +
    	    "3 - avslutt program\n" +
    	    "\n" +
    	    "valg: ";
            int valg = 0;
    
            do {
                skjerm.out(meny);
                valg = tast.inInt();
                switch (valg) {
    	    case 1: registrerStudent();
                    break;
    	    case 2: finnStudent().skrivTimeplan();
                    break;
    	    case 3: // avslutter
                    break;
    	    default: skjerm.outln("Ukjent menyvalg");
    	    }
            } while (valg != 3);  // do-while
        }
    
        Student finnStudent() {
            skjerm.out("Gi navn p? studenten: ");
            String navn = tast.inLine();
            Student stud = null;
    
            for (int i = 0; i < antStudenter; i++) {
                if (navn.equals(studenter[i].navn)) {
                    stud = studenter[i];
                }
            }
    
            if (stud == null) {
                if (antStudenter == studenter.length) {
                    skjerm.outln("Kan ikke registrere flere studenter.");
                } else {
                    stud = new Student(navn);
                    studenter[antStudenter++] = stud;
                }
            }
            return stud;
        }
    
        void registrerStudent() {
            Student stud = finnStudent();
    
            if (stud == null) { // maks antall studenter er n?dd.
                return;
            }
    
            skjerm.out("Oppgi kurskode (blank linje avslutter): ");
            String kurskode = tast.readLine();
            while (!kurskode.equals("")) {
                Kurs k = finnKurs(kurskode);
    
                if (stud.maksKurs()) {
                    skjerm.outln("Studenten kan ikke f?lge fler kurs.");
                } else if (k == null) {
                    skjerm.outln("Ukjent kurskode");
                } else if (k.erFullt()) {
                    skjerm.outln("Beklager - kurset er fult!");
                } else {
                    k.meldP?Student(stud);
                    stud.meldP?Kurs(k);
                    skjerm.outln(stud.navn + " er p?meldt " + kurskode);
                }
                skjerm.out("Oppgi kurskode (blank linje avslutter): ");
                kurskode = tast.readLine();
            }
        }
    
        Kurs finnKurs(String kurskode) {
            Kurs kurset = null;
    
            for (int i = 0; i < antKurs; i++) {
                if (kurs[i].kurskode.equals(kurskode)) {
                    kurset = kurs[i];
                }
            }
            return kurset;
        }
    } // end Institutt
    
    class Ukedag {
        static String[] alleNavn = { "mandag", "tirsdag", "onsdag", "torsdag",
    				 "fredag", "l?rdag", "s?ndag" };
        String navn;
        int nr;
    
        Ukedag(int nr) {
    	this.nr = nr;
    	navn = alleNavn[nr - 1];
        }
    
    } // end Ukedag

    KJ?REEKSEMPEL:

    Format p? innfil:
    Kurs    Ukedag Klokka

    > more register.txt
    INF1000    2     10
    INF1010    3     10
    INF1050    4     12
    MAT1000    1     8
    BIO1000    1     8
    
    > java Studentregister
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    
    valg: 1
    Gi navn p? studenten: Ola
    Oppgi kurskode (blank linje avslutter): INF1000
    Ola er p?meldt INF1000
    Oppgi kurskode (blank linje avslutter): INF1050
    Ola er p?meldt INF1050
    Oppgi kurskode (blank linje avslutter): MAT1000
    Ola er p?meldt MAT1000
    Oppgi kurskode (blank linje avslutter):
    
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    
    valg: 2
    Gi navn p? studenten: Ola
    Timeplan for Ola
    
    tid/dag mandag  tirsdag onsdag  torsdag fredag  l?rdag  s?ndag
    ----------------------------------------------------------------------
        8 | MAT1000
        9 |
       10 |         INF1000
       11 |
       12 |                         INF1050
       13 |
       14 |
       15 |
       16 |
       17 |



    Oppgave 9 i kap. 8  (side 176)
    Det var lagt en begrensning p? tidspunkter for kurs, for ? gj?re utskriften av timeplan enklere.
    (a) Modifiser utskriftmetoden i Student-klassen slik at flere kurs kan starte p? samme klokkeslett.
    Endrer l?kken "for (int tid = 8;..." i metoden skrivTimeplan() i klassen Student:
    	/* Den ytre l?kken g?r gjennom klokkeslett (08-14, nedover i timeplanen).
    	 * Neste l?kke g?r gjennom ukedagene for hvert mulig klokkeslett (man-s?n,
    	 * bortover i timeplanen).  S? er det enda en nestet l?kke, innerst, som
    	 * ser gjennom alle kurs og finner om et kurs foreleses i n?v?rende
    	 * kl./dag-kombinasjon.  I s? fall skrives ut kursnavnet; ellers bare
    	 * et tabulator-tegn.  Programmet klarer n? fint ? skrive ut flere kurs
    	 * som har samme klokkeslett hvis de undervises p? forskjellig ukedag. */
            for (int tid = 8; tid < 15; tid++) {
                skjerm.out(tid, 5);
                skjerm.out(" |");
    
    	    for (int dagnr = 0; dagnr < 7; dagnr++){
    
    		for (int i = 0; i < antKurs; i++) {
    
    		    if (kurs[i].tid == tid // Hvis kurstid == tid, og
    			&& kurs[i].dag.nr == dagnr) { // kursdag == dagnr
    
    			skjerm.out(kurs[i].kurskode, 7);  // ==> Skriv kursnavn
    		    }
    		}
    		skjerm.out("\t");
                }
    	    skjerm.outln();
            }
    
    KJ?REEKSEMPEL:
    valg: 1
    Gi navn p? studenten: Per
    Oppgi kurskode (blank linje avslutter): INF1000
    o er p?meldt INF1000
    Oppgi kurskode (blank linje avslutter): INF1010
    o er p?meldt INF1010
    Oppgi kurskode (blank linje avslutter):
    
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    
    valg: 2
    Gi navn p? studenten: Per
    Timeplan for Per
    
    tid/dag mandag  tirsdag onsdag  torsdag fredag  l?rdag  s?ndag
    ----------------------------------------------------------------------
        8 |
        9 |
       10 |         INF1000 INF1010
       11 |
       12 |
       13 |
       14 |
    

    (b) Modifiser metoden for ? melde en student p? et kurs, slik at det gis en advarsel hvis to av kursene en student har meldt seg p? g?r p? samme tidspunkt (dag og tid).
    To endringer, den f?rste i metoden meldP?Kurs() i klassen Student:
        void meldP?Kurs(Kurs k) {
    	/* Legger til en for-l?kke som g?r gjennom kursene studenten
    	 * allerede er p?meldt i, og sjekker om noen av dem har samme
    	 * tidspunkt som kurs k. */
    	boolean funnet = false;
    	for (int i = 0; i < antKurs && !funnet; i++) {
    	    if (kurs[i].tid == k.tid && kurs[i].dag.nr == k.dag.nr) {
    		System.out.println("Studenten har allerede et kurs p?" +
    				   " det tidspunktet!");
    		funnet = true;
    	    }
    	}
    	if (! funnet) {
    	    kurs[antKurs++] = k;
    	    k.meldP?Student(this);
    	    System.out.println(navn + " p?meldt i " + k.kurskode);
    	}
        }
    

    I tillegg, kommenterer bort to linjer i siste else i Institutt.registrerStudent():
                } else {
                    // k.meldP?Student(stud);
                    stud.meldP?Kurs(k);
                    // skjerm.outln(stud.navn + " er p?meldt " + kurskode);
                }
    
    KJ?REEKSEMPEL:
    valg: 1
    Gi navn p? studenten: Kari
    Oppgi kurskode (blank linje avslutter): MAT1000
    Kari p?meldt i MAT1000
    Oppgi kurskode (blank linje avslutter): BIO1000
    Studenten har allerede et kurs p? det tidspunktet!
    

    (c) Legg til en metode for ? melde en student av et kurs.  Pass p? at du justerer tellerne antStudenter i kursobjektet og antKurs i studentobjektet.
    Fire endringer:
    1. Ny metode i klassen Kurs:
        void meldAvStudent(Student s) { // Oppg. 9 c), del 1:4
    	boolean funnet = false;
    	for (int i = 0; i < antStudenter && !funnet; i++) {
    	    if (studenter[i] == s) {
    		funnet = true;
    		for (int j = i; j < antStudenter - 1; j++) {
    		    studenter[j] = studenter[j + 1];
    		}
    		antStudenter--;
    	    }
    	}
        }
    

    2. Ny metode i klassen Student:
        void meldAvKurs(Kurs k) { // Oppg. 9 c), del 2:4
    	/* Fjerner kurs k fra arrayen kurs[] ved ? g? gjennom arrayen, og
    	 * n?r k er funnet i arrayen, fjerner det ved ? g? gjennom
    	 * resten av arrayen og flytte elementene et hakk ned.  F?rste
    	 * slik flytting overskriver plassen der k var, og slik blir den
    	 * fjernet. */
    	boolean funnet = false;
    	for (int i = 0; i < antKurs && !funnet; i++) {
    	    if (kurs[i] == k) {
    		funnet = true;
    		for (int j = i; j < antKurs - 1; j++) {
    		    kurs[j] = kurs[j + 1];
    		}
    		antKurs--;
    		System.out.println(navn + " meldt av " + k.kurskode);
    	    }
    	}
        }
    

    3. I metoden meny() lages ny case:
    	    "4 - meld student av kurs\n" +  // Oppg. 9 c), del 3:4
    
    	    case 4:
    		meldStudentAvKurs();
                    break;
    

    4. Og det m? lages en ny kommando-metode i klassen Institutt:
        void meldStudentAvKurs() { // Oppg. 9 c), del 4:4
    	Student stud = finnStudent();
    	skjerm.out("Oppgi kurskode: ");
    	Kurs k = finnKurs(tast.inWord());
    	stud.meldAvKurs(k);
    	k.meldAvStudent(stud);
        }
    
    KJ?REEKSEMPEL:
    Timeplan for Arne
    
    tid/dag mandag  tirsdag onsdag  torsdag fredag  l?rdag  s?ndag
    ----------------------------------------------------------------------
        8 |
        9 |
       10 |         INF1000
       11 |
       12 |
       13 |
       14 |
    
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    4 - meld student av kurs
    
    valg: 4
    Gi navn p? studenten: Arne
    Oppgi kurskode: INF1000
    Arne meldt av INF1000
    
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    4 - meld student av kurs
    
    valg: 2
    Gi navn p? studenten: Arne
    Timeplan for Arne
    
    tid/dag mandag  tirsdag onsdag  torsdag fredag  l?rdag  s?ndag
    ----------------------------------------------------------------------
        8 |
        9 |
       10 |
       11 |
       12 |
       13 |
       14 |
    


  5. Oppgave 10 i kap. 8  (side 176)
    Ofte har et kurs ?vingsgrupper.  Vi antar at et kurs maksimalt har 20 ?vingsgrupper (og maks. 15 studenter pr. gruppe), og at en ?vingsgruppe har én dobbeltime med undervisning i uka.  Du skal n? utvide programmet slik at det ogs? kan administrere opplysninger om grupper.
    (a) Tegn et nytt klassediagram hvor du f?r med klassen Gruppe.  Et moment du m? vurdere er hvorvidt Student-objektene skal ha pekere til gruppene de f?lger, og om gruppene skal ha pekere til studentene som f?lger gruppen
    Velger ? ha pekere begge veier, fra Gruppe til Student og fra Student til Gruppe, i tillegg til pekere fra Kurs til Gruppe og omvendt.  Lagrer alle disse pekerne i arrayer, med f?lgende antall elementer:
    
    +--------+ 1   har   0..20 +----------+ 0..4    har     0..15 +---------+
    |  Kurs  |-----------------|  Gruppe  |-----------------------| Student |
    +--------+ kurs    grupper +----------+ grupper     studenter +---------+
    

    (b) Fila som inneholder opplysninger om kurs m? n? endres slik at den ogs? inneholder opplysninger om hvor mange grupper kurset har, og tidspunktet for gruppeundervisningen.  Definér et nytt filformat!
    Ny datafil-format:
    //Kurs Ukedag Kl. AntGrupper  DagGr1 KlGr1  DagGr2 KlGr2  DagGr3 KlGr3
    
    > more register.txt
    INF1000  2    10       3         1    11       2    11       3    11
    INF1010  3    10       2         1    12       2    12
    INF1050  4    12       3         3    14       4    14       5    14
    MAT1000  1     8       2         2    16       4    16
    BIO1000  0    12       2         2    16       4    18
    

    (c) Skriv koden for den nye Gruppe-klassen.  Du m? endre konstrukt?ren i Institutt-klassen slik at du ogs? leser inn og registrerer grupper for hvert kurs.  I tillegg m? du endre metoden for ? melde en student p? et kurs slik at studenten ogs? blir meldt p? en undervisningsgruppe.  Pass p? at du f?r satt alle objektpekerne riktig!  Til sist m? ogs? metoden for ? skrive ut timeplan endres slik at ogs? grupper skrives ut.
    Seks endringer:
    1. Ny klasse:
    class Gruppe { // Oppg. 10 c)
        int gruppenr;
        Kurs kurs;
        Ukedag dag;
        int tid;
        Student[] studenter = new Student[15];
        int antStudenter = 0;
    
        Gruppe(int gruppenr, Kurs kurs, int dagnr, int tid) {
    	this.gruppenr = gruppenr;
    	this.kurs = kurs;
    	this.dag = new Ukedag(dagnr);
    	this.tid = tid;
        }
    
        void meldP?Student(Student s) {
    	studenter[antStudenter++] = s;
        }
    
        void meldAvStudent(Student s) {
    	boolean funnet = false;
    	for (int i = 0; i < antStudenter && !funnet; i++) {
    	    if (studenter[i] == s) {
    		funnet = true;
    		for (int j = i; j < antStudenter - 1; j++) {
    		    studenter[j] = studenter[j + 1];
    		}
    		antStudenter--;
    	    }
    	}
        }
    }
    

    2. Ny slutt i while-l?kka til konstrukt?ren i Institutt:
                kurs[antKurs] = new Kurs(kurskode, ukedag, tid);
    
                int antGrupper = fil.inInt();  //// Oppg. 10 c)
                kurs[antKurs].antGrupper = antGrupper;
                for (int i = 0; i < antGrupper; i++) {
                    kurs[antKurs].grupper[i] =
                        new Gruppe(i + 1, kurs[antKurs], fil.inInt(), fil.inInt());
                }
                antKurs++;
            }
        }
    

    3. Ny deklarasjon ?verst i klassen Kurs:
        Gruppe[] grupper = new Gruppe[20];  // Oppg. 10 c)
        int antGrupper = 0;
    

    4. Ny deklarasjon ?verst i klassen Student, og endrer siste if-setning i metoden Student.meldP?Kurs() slik at studenten ogs? blir meldt p? en gruppe:
        // ?verst i klassen Student:
        Gruppe[] grupper = new Gruppe[4];
    
            // Siste if-setning i Student.meldP?Kurs():
            if (! funnet) { // Hvis tidspunktet ikke kolliderte.
                kurs[antKurs] = k;
                k.meldP?Student(this);
    
                // Oppg. 10 c):
                System.out.print("Gruppe nr: (1-" +
                                 kurs[antKurs].antGrupper + "): ");
                int gruppenr = new In().inInt();
                grupper[antKurs] = kurs[antKurs].grupper[gruppenr - 1];
                if (grupper[antKurs] == null) {
                    System.err.println("Feil 001");
                }
                grupper[antKurs].meldP?Student(this);
    
                System.out.println(navn + " p?meldt i " + k.kurskode // Oppg. 9 b)
                                   + ", gruppe nr. " + grupper[antKurs].gruppenr);
                antKurs++;
            }
    

    5. Endrer l?kken "for (int dagnr =..." i Student.skrivTimeplan() slik at gruppenr. ogs? vises:
        void skrivTimeplan() {
            Out skjerm = new Out();
            skjerm.outln("Timeplan for " + navn);
            skjerm.outln();
            skjerm.out("kl\\dag\t");
    
            for (String dagnavn : Ukedag.alleNavn) {
                if (!dagnavn.equals("s?ndag")) { // Tar bort s?ndag fra timeplanen
    		skjerm.out(dagnavn, 11);
    	    }
            }
    
            skjerm.out("\n-----------------------------------");
            skjerm.outln("-----------------------------------");
    
    	/* Den ytre l?kken g?r gjennom klokkeslett (08-14, nedover i timeplanen).
    	 * Neste l?kke g?r gjennom ukedagene for hvert mulig klokkeslett (man-s?n,
    	 * bortover i timeplanen).  S? er det enda en nestet l?kke, innerst, som
    	 * ser gjennom alle kurs og finner om et kurs foreleses i n?v?rende
    	 * kl./dag-kombinasjon.  I s? fall skrives ut kursnavnet; ellers bare
    	 * et tabulator-tegn.  Programmet klarer n? fint ? skrive ut flere kurs
    	 * som har samme klokkeslett hvis de undervises p? forskjellig ukedag. */
            for (int tid = 8; tid < 17; tid++) {
                skjerm.out(tid, 5);
                skjerm.out(" |");
    
                for (int dagnr = 0; dagnr < 6; dagnr++){
    
    		String tekst = "";
    
    		// Forelesninger:
                    for (int i = 0; i < antKurs; i++) {
                        if (kurs[i].tid == tid // Hvis kurstid == tid, og
                            && kurs[i].dag.nr == dagnr) { // kursdag == dagnr
    
                            tekst += kurs[i].kurskode; // ==> Skriv kursnavn
                        }
                    }
    		// Gruppetimer:
                    for (int i = 0; i < antKurs; i++) {
                        if (grupper[i].tid == tid
                            && grupper[i].dag.nr == dagnr) {
    
    			tekst += grupper[i].kurs.kurskode
    			    + ":g" + grupper[i].gruppenr;  // Oppg. 10 c)
                        }
                    }
    		skjerm.out(tekst, 11); // Skriver ut evt. kurskode og gruppenr.
                }
    	    skjerm.outln();
            }
        }
    

    6. Endrer Student.meldAvKurs() slik at studenten ogs? blir av- og p?-meldt i en gruppe:
          void meldAvKurs(Kurs k) {
              boolean funnet = false;
              for (int i = 0; i < antKurs && !funnet; i++) {
                  if (kurs[i] == k) {
                      funnet = true;
                      for (int j = i; j < antKurs - 1; j++) {
                          kurs[j] = kurs[j + 1];
                          grupper[j] = grupper[j + 1];  // Oppg. 10
                      }
                      antKurs--;
                      System.out.println(navn + " meldt av " + k.kurskode);
                  }
              }
          }
    
    KJ?REEKSEMPEL:
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    4 - meld student av kurs
    
    valg: 1
    Gi navn p? studenten: Ole
    Oppgi kurskode (blank linje avslutter): INF1000
    Gruppe nr: (1-3): 3
    Ole p?meldt i INF1000, gruppe nr. 3
    Oppgi kurskode (blank linje avslutter): MAT1000
    Gruppe nr: (1-2): 2
    Ole p?meldt i MAT1000, gruppe nr. 2
    Oppgi kurskode (blank linje avslutter):
    
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    4 - meld student av kurs
    
    valg: 2
    Gi navn p? studenten: Ole
    Timeplan for Ole
    
    kl\dag  mandag     tirsdag    onsdag     torsdag    fredag     l?rdag
    ----------------------------------------------------------------------
        8 |            MAT1000
        9 |
       10 |                       INF1000
       11 |                                  INF1000:g3
       12 |
       13 |
       14 |
       15 |
       16 |                                             MAT1000:g2
    


  6. Oppgave 12 i kap. 8  (side 177)
    Utvid Insitutt-klassen med en metode som lagrer alle opplysninger om registrerte studenter p? en fil (navn, kurs, og grupper).  Disse opplysningene skal lagres p? fila ?oppmeldinger.txt?.  Ved oppstart skal programmet lese denne fila (i tillegg til fila med opplysninger om kurs og grupper) hvis den finnes.
        Hint: Metoden erFil(...) i In-klassen i easyIO returnerer true hvis den oppgitte parameteren er navn p? en fil som kan leses.
    Filformat for "oppmeldinger.txt":
    Navn; antKurs kurskode gruppenr kurskode gruppenr ...
    Eksempel:
    Jon;      3   INF1000     0     MAT1000     1   BIO1000 0
    Kari;     2   INF1000     2     INF1050     2
    Martin;   1   INF1000     1

    Ny lesing av en ekstra-innfil nederst i konstrukt?ren til Institutt:
    	// Oppg. 12
    	if (new java.io.File("oppmeldinger.txt").exists()) {
    	    fil = new In("oppmeldinger.txt");
    	    while (! fil.endOfFile()) {
    		studenter[antStudenter] = new Student(fil.inWord("\n\r;"));
    		Student stud = studenter[antStudenter];
    		int antKurs = fil.inInt("; ");
    		stud.antKurs = antKurs;
    		for (int i = 0; i < antKurs; i++) {
    		    stud.kurs[i] = finnKurs(fil.inWord());
    		    stud.grupper[i] =
    			stud.kurs[i].grupper[fil.inInt()];
    		    stud.kurs[i].meldP?Student(stud);
    		    stud.grupper[i].meldP?Student(stud);
    		}
    		System.out.println("Lest fra fil: " + stud.navn
    				   + " med sine " + antKurs + " kurs.");
    		antStudenter++;
    	    }
    	    fil.close();
            }
    

    Skriving av samme datafil:
      (Dette kan du programmere selv, det blir det omvendte av koden ovenfor...)

    KJ?REEKSEMPEL:
    Lest fra fil: Jon med sine 3 kurs.
    Lest fra fil: Kari med sine 2 kurs.
    Lest fra fil: Martin med sine 1 kurs.
    
    1 - meld student p? kurs
    2 - lag timeplan for student
    3 - avslutt program
    4 - meld student av kurs
    
    valg: 2
    Gi navn p? studenten: Jon
    Timeplan for Jon
    
    kl\dag  mandag     tirsdag    onsdag     torsdag    fredag     l?rdag     
    ----------------------------------------------------------------------
        8 |            MAT1000                                                
        9 |                                                                   
       10 |                       INF1000                                     
       11 |            INF1000:g1                                             
       12 | BIO1000                                                           
       13 |                                                                   
       14 |                                                                   
       15 |                                                                   
       16 |                       BIO1000:g1            MAT1000:g2
    

Oppgaver til terminaltimen

  • Kursoppmeldingssystemet:  Oppgave 9, 10, 12 i kap. 8 (side 176)
    (Samme oppgaver som i punkt 4, 5, og 6 for teoritimen).
    (Se l?sningsforslagene ovenfor.)


  • Kom i gang med Oblig 3:
    Ta utgangspunkt i den versjonen av Oblig 3 du har valgt (HybelHus eller Pi), og ut fra oppgaveteksten:

    (a) Finn ut et f?rste forslag til hvilke klasser du vil ha i besvarelsen din, og hvilke variabler du vil ha i hver klasse.  Tegn et UML-klassediagram.

    (b) Bestem forholdene mellom klassene, dvs. hvilke klasser skal ha pekere til hvilke klasser, og hvor mange (dvs. om pekerne skal v?re enkle variabler eller arrayer).  Navngi forholdene og sett p? antall i hver ende.

    (c) Begynn ? skrive koden for Oblig 3, og finn ut hvilke metoder du vil ha i de ulike klassene.  Til ? begynne med skriver du tomme deklarasjoner (metoder uten noe kode inni) slik at du kan kompilere programmet og teste det underveis mens du skriver det.  Revidér og gjenta punkt (a) til (c) inntil programmet fungerer som det skal.

    NB! Det viktigste i oblig 3 er at du skriver din egen l?sning selv.  Det er lov ? diskutere med andre hvordan du tenker ? g? frem for ? l?se deloppgavene, men det er ikke lov ? kopiere programbiter fra obliger skrevet av andre, heller ikke hvis du deretter endrer p? disse programbitene.  Andre typer kilder er ofte ok, men skal nevnes ?verst i programmet hvis det ikke er kurs-websidene eller l?reboka.  Skriv ogs? ?verst hvem du evt. 中国竞猜网_中国足彩网-足球推荐et med.


  • (Ingen n?tt denne uka, oppgavene nevnt over er utfordrende nok!, s?rlig Oblig3-Pi)