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
- 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 arrayStudenter[] 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.