Programutvikling V2015 Obligatorisk innleveringsoppgave
Innleveringsfrist: mandag 9. mars kl. 15:00
.
NB! Uke 8 er studieuke uten forelesninger, men datalaben går som normalt.
Oppgaven kan løses i grupper på 2 eller 3 studenter.
Innlevering av oppgaven:
Oppgaven sendes til programmeringhioa@gmail.com
Mailen skal inneholde følgende:
Emne på e-posten: Innlevering obligatorisk oppgave
Innhold i e-posten: Gruppemedlemmene med fullt navn, studentnummer og studieretning.
Vedlegg: Alle java-filene, samt en kjørbar jar-fil for hver oppgave/program.
Hvordan dette kan gjøres, er forklart i notatet
Distribuering av javaprogrammer.
For å få godkjent innleveringen, må alle programmene fungere i henhold oppgavebeskrivelsene under.
Oppgaven må bestås (godkjennes) for at man skal få anledning til å delta på
prosjektarbeidet som starter i uke 13.
Dersom det oppdages at en gruppe har kopiert løsningen til en annen gruppe,
vil ingen av de to gruppene få godkjent
innleveringen. (Dessverre oppdages dette hvert år, med lite hyggelige konsekvenser for
de berørte studentene.)
Oppgavene baserer seg på alt vi har gjennomgått til og med uke 7.
Det er viktig å kunne dette godt før dere går i gang.
Dere må selv bestemme hvilke metoder og klasser programmene skal inneholde.
Det er imidlertid store likheter mellom oppgavene her og de eksempler og ukeoppgaver
vi har gjennomgått på forelesningene.
Se forøvrig:
Kompendium for kurset Programutvikling
Oppgavetekstene vil bli oppdatert med flere opplysninger hvis det viser seg å være behov for det.
Oppgave 1
Ukeoppgavene for uke 6 gikk ut på å lage et bokregister der
man kunne lagre forskjellige bøker i en liste.
Denne oppgaven går ut på å utvide dette programmet slik at alle data leses inn i datastrukturen fra fil
(ved hjelp av DataInputStream
) ved oppstart av programmet, og innholdet i datastrukturen
skrives til fil (ved hjelp av DataOutputStream
) når programmet avsluttes.
Du kan ta utgangspunkt i løsningsforslaget som du finner linker til nederst på ukeoppgavesiden.
Hint: Utvid den abstrakte superklassen Bok
med metodene:
public boolean lesObjektFraFil( DataInputStream input )
{
< Leser verdier fra fil og lagrer dem i de tilhørende datafeltene. >
}
public void skrivObjektTilFil( DataOutputStream output )
{
< Skriver datafeltenes verdier til fil. >
}
Redefiner deretter disse metodene i alle subklassene i klassehierarkiet.
( NB! I de konkrete klassene må metodene redefineres slik at
det første som skrives til fil er noe som kan identifisere hva slags
type objekt det er , f.eks. teksten "SkoleBok". Denne informasjonen skal brukes
til å opprette riktig type objekt ved lesing fra fil. )
De øvrige klassene i programmet må tilpasses, ved at du legger
til nødvendige instruksjonen og metoder, samt gjør enkelte nødvendige forandringer.
Blant annet trenger klassene som inngår i klassehierarkiet parameterløse konstruktører
for å få lest inn fra fil. Det kan være lærerikt å se på
ukeoppgave 2 uke 7, der det gjøres noe tilsvarende.
NB! Programmet skal ha tilstrekkelig data lagret på fil som blir lest inn
i datastrukturen ved oppstart av programmet, slik at den som skal rette
oppgaven slipper å skrive dem inn på nytt.
NB! I denne oppgaven SKAL du bruke DataInputStream
og
DataOutputStream
!
Oppgave 2
Småbåtregisteret er et båtregister
der norske fritids- og småbåter er registrert.
Redningsselskapet
(Norsk Selskab til Skibbrudnes Redning) drifter Småbåtregisteret, og
de har gitt deg i oppgave å programmere en nytt småbåtregister i java.
a)
Det skal lages et hendelsesbasert program for registrering av båter og båteiere.
For enkelhets skyld er det i denne minimumsversjonen av programmet bare
mulig å registrere én båt for hver båteier.
Programmet skal kunne registrere båteiere med følgende data
- navn og adresse
- medlemsnummer (alle skal ha gis unikt medlemsnummer)
- eventuell båt som eies, eller at vedkommende for øyeblikket ikke
eier noen båt
For hver båt skal følgende data registreres:
- registreringsnummer
- merke/type
- årsmodell
- lengde i fot
- motorytelse i HK ("hester")
- skrogfarge
Operasjoner som skal kunne utføres av programmet:
- registrere ny båteier
- registrere ny båt og eier for denne
- skrive ut hele båtregisteret (båteiere og eventuelle båter de eier)
- fjerne en båt fra registeret (båteieren skal da bli stående i registeret
inntil denne eventuelt blir fjernet)
- fjerne en båteier, men bare tillatt å utføre når vedkommende ikke eier noen båt
- hente ut data for eieren til en båt med gitt registreringsnummer
- registrere eierskifte for en båt
For hver av registreringsoperasjonene må relevante data leses inn fra bruker.
Medlemsnummeret skal identifisere båteiere. Ved registrering av
en ny båteier skal derfor programmet hindre at den nye eieren
får samme medlemsnummer som en båteier som allerede er registrert av programmet.
På tilsvarende måte skal registreringsnummeret for båter identifisere båter,
slik at programmet må hindre dobbeltregistrering.
I tilfelle eierskifte, må det leses inn registreringsnummer for båten som
skal skifte eier, samt medlemsnummer for ny eier. Dersom ny eier ikke
er registrert tidligere, må denne registreres før eierskifte kan gjennomføres.
All innlesing av data skal foretas på "sikker" måte, dvs. ved bruk av
try-catch
og/eller test på at tekstfelt for
nødvendige data er fylt ut.
Hver gang programmet blir avsluttet, skal alle data som er lagret i
programmets datastruktur skrives ut til en fil for lagring. Ved oppstart skal
eventuell fil med lagrede data leses inn og plasseres i programmets datastruktur.
(Bruk objektserialisering,
samt henholdsvis
ObjectOutputStream
og
ObjectInputStream
ved utskrift til fil og
innlesing fra fil.)
Det er et krav i denne oppgaven at det skal det lages en egen listeklasse
som inneholder listen av båteiere og metoder som gjør de nødvendige operasjoner
på denne listen.
b)
Dere skal nå lage en utvidet versjonen av programmet under punkt a).
(NB! Behold en kjørbar kopi av programmet fra oppgave a!)
I denne versjonen skal det være mulig for hver
båteier å eie flere båter, uten begrensning på hvor mange dette er. For
øvrig er det de samme data som skal registreres. Ved utskrift av båtregisteret
skal det for hver båteier skrives ut data om alle båter som denne eier.
Løsningen er å lage en ny klasse Båtliste
der nodene i lista er Båt
-objekter.
Hvis dere i Båteier
-klassen har et datafelt typen Båt
skal dette nå erstattes
av et datafelt av typen Båtliste
. Hvert Båteier
-objekt skal altså ha
sin egen båliste, dvs. sitt eget
Båtliste
-objekt. Dette inneholder båtene som eies av vedkommende båteier.
(Listen vil være tom dersom vedkommende ikke eier noen båt for øyeblikket.)
Både Båteierliste
- og Båtliste
-klassene må etter behov
suppleres med nye metoder.
For de som trenger ytterligere utfordringer kan man lage et klassehierarki av båter, der
man lar klassen Båt
, være en abstrakt superklasse, og lager subklasser som
Seilbåt
, Motorbåt
, osv, til denne. Objekter av de konkrete klassene i dette
hierarkiet settes så inn i båtlistene til båteierene. For flere ideer, se
Småbåtregisteret
NB! Programmet skal ha tilstrekkelig data lagret på fil som blir lest inn
i datastrukturen ved oppstart av programmet, slik at den som skal rette
oppgaven slipper å skrive dem inn på nytt.
Til slutt
Mange vil nok finne oppgaventeksten både mangelfull og mindre konkret enn dere er vant til.
Det er imidlertid noe av utfordringen! Dere skal derfor gjøre deres egne forutsetninger
der dere mener oppgaven ikke gir konkrete føringer på hvordan oppgaven skal løses.
Lykke til!