INF100 INNLEVERING 3 HØSTEN 2004 Krav til innlevering For at innleveringen skal godkjennes må følgende leveres: Oversikt Et dokument som inneholder en oversikt over innleveringen. Den skal inneholde en kort beskrivelse av alle filene som blir levert inn og skal også oppgi navn, gruppenummer og epost-adresse. Hvis du ikke går på noen gruppe, skal du skrive ingen gruppe. Kildekode All kildekode skal selvsagt legges ved. Kildekoden skal være godt kommentert slik at det er lett å sette seg inn i programmenes virkemåte. Koden skal også være godt indentert (dvs. ha innrykk der programmet tilsier det) og lett å lese (f.eks. fornuftig bruk av variabelnavn). Kjøreeksempel For hvert program, skal det være med en fil som inneholder en logg av en typisk kjøring av programmet. Et slikt kjøreeksempel viser hvordan programmet brukes og hva programmet skriver ut. Under Linux kan filer med kjørelogg lages slik: 1. Kjør kommandoen: script logg.txt 2. Kjør programmet ditt fra kommandolinjen ved hjelp av kommandoen: java Mittprogram 3. Avslutt med kommandoen exit All skjermutskrift som ble produsert mens skriptet ble kjørt ligger nå på filen logg.txt. Alle filene som skal leveres pakkes i en egen zip-fil. Se nærmere beskrivelse i innleveringssystemet. Du skal ikke levere inn filene som inneholder bytekode (filene med navn *.class). Besvarelsen skal leveres elektronisk ved hjelp av innleveringssystemet, som det finnes en lenke til på kursets hjemmeside. Innleveringsfristen er mandag 15. november 2004 kl 16.00. Besvarelsen skal bedømmes av gruppeleder, som setter en poengsum på en skala fra 0 (dårligste karakter) til 100 (beste karakter). Innlevering etter fristen eller ingen innlevering vil resultere i poengsummen 0. Gjennomsnittet av poengsummene på de tre innleveringene i INF100 høsten 2004 teller 20% av sluttkarakteren. Det er tillatt at to studenter (ikke flere) samarbeider om innleveringen og leverer identiske besvarelser. Begge må levere hver for seg og oppgi navn, brukernavn og gruppe for samarbeidspartneren i oversiktsdokumentet. 1
Denne innleveringen inneholder flere klasser som arbeider sammen. Hver klasse skal ligge i en fil for seg. Alle klasser og klassemedlemmer (metoder, feltvariabler, etc.) skal ha kommentarer på Javadoc-format. Oppgaven spesifiserer en rekke metoder som skal lages, men lag gjerne flere hvis det er hensiktsmessig. Bruk innkapsling for å skille ekstern oppførsel (kontrakt) fra intern implementasjon av hver klasse. Oppgave 1 (30%): Mer tid Vi skal først utvide klassen Tid fra forrige innlevering med noen nye metoder. Ta utgangspunkt i klassen du selv leverte inn, eventuelt i løsningsforslaget som er utlagt. Vi trenger følgende nye metoder i klassen Tid: int avstand(tid tiltid) returnerer antall minutter mellom tidspunktet i det aktuelle objektet og tidspunktet i tiltid. Returverdien er negativ hvis tiltid er tidligere enn det aktuelle objektet (anta samme døgn). int compareto(tid annentid) returnerer en positiv verdi hvis det aktuelle objektet er senere enn annentid (anta samme døgn), en negativ verdi hvis det aktuelle objektet er tidligere, og 0 hvis tidspunktene er like. static Tid parsetid(string s) lager et tidsobjekt av en streng på formen tt:mm, f.eks. "10:15", og returnerer en referanse til dette objektet. Hvis strengen har feil format (f.eks. "10h15" eller "33:33") returneres null. Dernest skal vi lage en ny klasse Tidsrom som gjør bruk av klassen Tid. Et objekt av klassen Tidsrom representerer et gitt tidsintervall innenfor ett og samme døgn. Klassen skal ha en konstruktør som tar to tidsobjekter som parametre, som angir henholdsvis start- og slutt-tidspunktet for intervallet. Følgende instansmetoder skal implementeres: Tid hentstart() returnerer starttidspunktet. Tid hentslutt() returnerer sluttidspunktet. int hentvarighet() returnerer varigheten av intervallet i minutter. boolean equals(tidsrom annettidsrom) returnerer true hvis og bare hvis det aktuelle objektet og annettidsrom er like (dvs. både start- og slutttidene er like). int compareto(tidsrom annettidsrom) returnerer en positiv verdi hvis starttiden for det aktuelle objektet er senere enn for annettidsrom og en negativ verdi hvis starttiden for det aktuelle objektet er tidligere. Hvis starttidene er like, sammenlignes sluttidene på samme måte. Hvis både start- og sluttidene er like, returneres 0. 2
boolean overlapper(tidsrom annettidsrom) returnerer true hvis og bare hvis tidsrommene i det aktuelle objektet og annettidsrom overlapper. (Det regnes ikke som overlapp hvis det andre tidsrommet starter i samme minutt som det første slutter.) String tostring() returnerer en strengrepresentasjon av et tidsrom, f.eks. "12:15-14:00". Oppgave 2 (40%): Dagsplan Hovedsaken i denne oppgaven er å lage en klasse Dagsplan, der hvert objekt representerer en liste av aktiveteter en bestemt dag (se eksempel i siste oppgave). Listen skal implementeres som en tabell av referanser. Hver aktivitet består at et tidsrom og en beskrivende tekst (en streng). Et Dagsplan-objekt opprettes ved hjelp av et konstruktørkall men en eller to parametre. Den første parameteren er tabellstørrelsen (dvs. maksimalt antall parametre). Den andre, frivillige parameteren er en streng som navngir dagsplanen (kan f.eks. være "mandag"). En nyopprettet dagsplan har ingen aktiviteter. Klassen tilbyr følgende metoder: String hentnavn() returnerer navnet på dagsplanen, eller null hvis navn ikke ble angitt. int hentantallaktiviteter() returnerer antall aktiviteter som er lagt inn. boolean erfull() returnerer true hvis aktivitetstabellen er full, slik at det ikke er plass til flere aktiviteter. boolean erledig(tidsrom når) returnerer true hvis tidsrommet når ikke overlapper med aktiviteter som allerede er lagt inn. boolean leggtil(tidsrom når, String beskrivelse) legger inn en ny aktivitet i planen hvis mulig. To betingelser må være oppfylt: Det må være plass i tabellen, og tidsrommet må ikke overlappe med andre aktiviteter i tabellen. Metoden returnerer true hvis innleggingen var vellykket. void skrivliste() skriver ut en liste over alle aktiviteter til terminalen, helst sortert etter tidspunkt. void skrivtilfil(printwriter tekstskriver) skriver ut en liste over alle aktiviteter til en fil via tekststrømmen tekstskriver. void lesfrafil(bufferedreader tekstleser) leser inn og legger til aktiviteter fra en fil som ble skrevet av metoden skrivtilfil(), via tekststrømmen tekstleser. Tips: I tillegg til klassen Dagsplan er det lurt å lage en enkel klasse for aktiviteter. 3
Oppgave 3 (30%): Timeplan-program Basert på klassen Dagsplan skal vi lage et program for å holde rede på en timeplan for en uke (mandag til fredag). Programmet skal være menystyrt og ha følgende funksjoner: 1. Legge inn en aktivitet en gitt dag. Programmet sjekker at det er ledig plass. 2. Liste ut alle aktiviteter en gitt dag. 3. Lagre timeplanen (alle dager) i en fil... Som vanlig bør programmet sjekke brukerens inntastinger på en fornuftig måte. Legg ved et kjøreeksempel som inkluderer lagring på fil, og legg også ved filen som ble lagret. Tips: Kanskje en ukeplan-klasse også er en god ide, nå som vi er så godt i gang... Eksempel på programdialog (brukerens inntastinger er understreket): Velkommen til Planlegging! Starttid: (tt:mm) 12:15 Sluttid: (tt:mm) 14:00 Beskrivelse: Forelesning INF100 Starttid: (tt:mm) 13:00 4
Sluttid: (tt:mm) 15:00 Ikke ledig tid. Starttid: (tt:mm) 10:15 Sluttid: (tt:mm) 12:00 Beskrivelse: Forelesning MAT111 Ditt valg: (1-5) 2 tirsdag 10:15-12:00 Forelesning MAT111 12:15-14:00 Forelesning INF100 Ditt valg: (1-5) 3 Filnavn: min_plan.txt Planen er skrevet til filen min_plan.txt Ditt valg: (1-5) 5 Avslutter programmet. 5