Ukeoppgaver 6: 4. - 8. okt (INF1000 - H?st 2010)
Klasser og objekter (kap. 8.1 - 8.14)
M?l
F? et f?rste innblikk i hvordan man programmerer med klasser og objekter.
Oppgaver til teoritimen
- KursRegister.java: (basert p? eksempel fra forelesning uke 6)
(a) Studér f?lgende program, som er bygd opp p? samme m?te som eksemplet p? side 10 i forelesningsnotatene uke 6. 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
(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.
(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.". Utvid ogs? metoden skrivUt() slik at det f?r tak i og skriver ut navnet p? foreleseren i hvert kurs.
(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? - 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 kall settInn-metoden fra ?rsoppgj?rmetoden for ? l?se problemet. - 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)
- Begynn med Oblig 3 eller
Oblig 3-Pi (PDF).
- Ukens n?tt: Kr?llparentes-sjekk (veldig vanskelig)
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]). - Ukens n?tt: Kr?llparentes-sjekk (veldig vanskelig)
L?sningsforslag
Her kan du finne l?sningsforslag til disse oppgavene. Det anbefales ? l?se oppgavene p? egen h?nd f?r du studerer l?sningsforslagene.Tibakemelding om dette oppgavesettet kan du skrive i bloggen eller sende p? mail til josek [a] ifi.uio.no