Du er her: UiO > Studier > Emner > Matematikk og naturvitenskap > Informatikk > INF1000 > h08 > ukeoppgaver >

Ukeoppgaver 7:  6. - 9. okt (INF1000 - Høst 2008)

Mer om klasser og objekter (kap. 8.17 - 8.18), UML (kap. 12.1 - 12.9)

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.


  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.

    (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.


  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.

    (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).

    (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.


  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.

    (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!

    (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.


  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.

Oppgaver til terminaltimen


Løsningsforslag
Løsningsforslagene viser én av mange mulige måter å løse disse oppgavene på.