Ukeoppgaver 6: 29. sep - 2. okt (INF1000 - H?st 2008)
Klasser, objekter, og pekere (kap. 8.1 - 8.14)
M?l
F? et f?rste innblikk i hvordan man programmerer med klasser, objekter, og pekere.
Oppgaver til teoritimen
- 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
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.
(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.
- Oppgave 1 i kapittel 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.
- Oppgave 2 i kapittel 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 resultat som i Oppgave 1.
- Oppgave 3 i kapittel 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.
- Oppgave 4 i kapittel 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
- Oppgave 5 i kapittel 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.
- Oppgave 6 i kapittel 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.
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; 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"); int i = 0; { // Lag en l?kke som leser fra fil frem til endOfFile() dvder[i] = new Dvd(); dvder[i].type = innfil.inWord("| "); dvder[i].tittel = innfil.inWord("|(").trim(); // trim fjerner blanke foran og bak // . . . (les de andre dataene) // Kontrollutskrift for ? se at data ble lagret riktig i arrayen: System.out.println(i + ": " + dvder[i].type + dvder[i].tittel); } } void ordrel?kke() { } void skrivTilFil() { } } class Dvd { String type; // Hva slags dvd?: "f"=film, "t"=tv-program, "a"=andre String tittel; int ?r; // ... (lag 3 objektvariabler til) }
- 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.
- Ukens n?tt: Kr?llparentes-sjekk
L?sningsforslag
L?sningsforslagene viser én av
mange mulige m?ter ? l?se disse oppgavene p?.