Endret litt som ukeoppgave i INF1010 våren 2004!!!" # # $# ##!!%# # &##!'! Kontroller at oppgavesettet er komplett før du begynner å besvare det. Les gjerne gjennom hele oppgavesettet før du begynner med besvarelsen. I det fiktive landet Ruritania fins det en rekke eiendommer. Du skal i denne oppgaven hjelpe myndighetene i landet med å programmere et dataregister for å holde orden på alle eiendommene og hvem som eier dem. All programmering skal skje i Java (evt i Simula for de som har valgt dette). Et første utkast til et program for et slikt register er allerede laget (se vedlegg A). I oppgavene nedenfor skal du ta utgangspunkt i dette uferdige programmet. Hver eiendom har et gårdsnummer (en tekststreng) og et bruksnummer (en tekststreng). Tilsammen bestemmer disse numrene en eiendom entydig: to forskjellige eiendommer vil alltid ha forskjellige gårdsnummer eller forskjellige bruksnummer (eller begge deler). For å angi hvor grensene til en eiendom går, benyttes navngitte punkter i terrenget. Disse punktene kalles hjørner. Hvert hjørne har et entydig navn (f.eks. "h14") og en posisjon som angis med to tall: lengdegrad og breddegrad. For enkelhets skyld antar vi at grensen danner en rett linje fra hjørne til hjørne. Antall hjørner kan variere fra eiendom til eiendom. Hjørnene er nummerert fra 1 og oppover i rekkefølge rundt hver av eiendommene. Med andre ord: Dersom to hjørner i en eiendom har nummer rett etter hverandre (dvs numrene er i og i+1 for en eller annen i), eller dersom hjørnene er de med henholdvis lavest og høyest nummer for denne eiendommen, så går det en grenselinje mellom hjørnene. Hvis flere eiendommer grenser til hverandre, vil et hjørne kunne inngå i flere eiendommer. Hjørnet vil da kunne ha forskjellige nummer i hver av eiendommene. Merk: tallene i hjørnenavnene (f.eks. "h14") har ingenting med hjørnenes nummer i en eiendom å gjøre.
1: h7 4: h5 Eiendom Hjørner 2: h3 3: h14 Eksempel: Vi har en eiendom som vist på figuren. Hjørnene kan da nummereres slik: nr 1: "h7", nr 2: "h3", nr 3: "h14", nr 4: "h5" Dette gir de fire grenselinjene fra "h7" til "h3" fra "h3" til "h14" fra "h14" til "h5" fra "h5" til "h7" Derimot gir dette ingen grenselinje for eksempel mellom hjørnene "h7" og "h14". Oppgave 1 (30 %) A. Lag en metode i klassen Register som leser inn data om hjørner fra filen "Hjorner.dat" og legger dem inn i en passende datastruktur (gjør nødvendige deklarasjoner i klassen Register for å få definert datastrukturen). Ved valg av datastruktur bør du ta hensyn til at vi senere kommer til å få bruk for å finne fram til et hjørne ut fra dets navn. Videre er det naturlig å samle all informasjon om et hjørne i et eget objekt; bruk klassen Hjorne i vedlegg A til dette formål. Filen det skal leses fra har følgende format: hver linje består av et hjørnenavn (en tekststreng uten blanke tegn), etterfulgt av en lengdegrad og en breddegrad (begge er desimaltall). Eksempel: h7 10.35 55.54 h3 10.37 55.54 h14 10.36 55.60 h5 10.63 55.70 h9 11.03 56.01 h33 10.30 54.79 B. Lag en metode i klassen Register som leser inn data om eiendommer fra filen Eiendommer.dat og legger dem inn i en passende datastruktur (gjør nødvendige deklarasjoner i og utenfor klassen Register for å få definert datastrukturen). Denne metoden kommer til å bli kalt etter at metoden i punkt A ( ) er kalt, slik at du kan anta at hjørne-dataene i punkt A er tilgjengelige. Filen det skal leses fra har følgende format: først en linje med eierens navn (kan inneholde blanke), deretter en linje med eierens adresse, deretter en linje med eierens fødselsnummer (11 siffer). Deretter kommer det en linje med gårdsnummer (heltall) og
bruksnummer (heltall) for en eiendom, separert av blanke tegn, deretter en linje med antall hjørner til eiendommen, og så en linje for hvert av hjørnene til eiendommen. Hver av disse linjene inneholder hjørnets nummer (et heltall) og navn (en tekststreng uten blanke tegn), separert med blanke tegn. Etter dette kommer det enten data om flere eiendommer eller (hvis filen er slutt) teksten ZZZ (på en egen linje). Eksempel: Anne Cathrine Arnesen Furuliveien 13, 3432 Omland 15106573456 353 200 4 1 h7 2 h3 3 h14 4 h5 ZZZ C. Foreslå hvor metodene og skal kalles fra for at programmet skal lese inn data fra fil helt til å begynne med, før programmet ber brukeren om en ordre. Oppgave 2 (10 %) Tegn et objekt-diagram for hele programmet slik det nå ser ut (etter utvidelsene du gjorde i oppgave 1). Det er ikke nødvendig å tegne inn metoder. Oppgave 3 (20 %) A. Lag en metode i klassen Register som skriver ut på skjermen alle data om en gitt eiendom (dvs de dataene om en eiendom som ble lest inn i oppgave 1B), samt lengdegrad og breddegrad for hvert av hjørnene til eiendommen. Metoden skal ha som parameter gårdsnummer og bruksnummer for eiendommen. B. Utvid metoden i punkt A slik at den også skriver ut hvor stor omkretsen til eiendommen er (ved å summere grenselinjenes lengder). Du kan anta at det allerede er laget en metode finnlengde i klassen Register som tar som parametre lengde- og breddegrad til to hjørner og som returnerer med lengden (dvs avstanden) mellom de to hjørnene. Oppgave 4 (10 %) Lag en metode som skriver ut på skjermen (i vilkårlig rekkefølge) alle hjørner i registeret (dvs de som ble lest inn i oppgave 1A). For hvert hjørne skrives det ut en linje med hjørnets navn samt hjørnets lengdegrad og breddegrad. Etter at informasjon om alle hjørner er skrevet ut, skal programmet skrive ut hvor mange hjørner det er. Et hjørne skal bare skrives ut og telles en gang selv om det brukes av flere eiendommer. Oppgave 5 (15 %) Lag en metode i klassen Register som sjekker om to eiendommer støter borti hverandre, dvs om de har minst ett felles hjørne. Metoden skal ta som parametere gårdsnummer og bruksnummer for hver av de to eiendommene.
Oppgave 6 (10 %) Programmet skal nå utvides slik at brukeren kan gi ordre om å dele en eksisterende eiendom i to eiendommer. For enkelhets skyld antar vi at eiendommen deles i to med en rett linje som går mellom to av hjørnene i den eksisterende eiendommen (det innføres altså ikke noen nye hjørner). Når brukeren gir denne ordren skal programmet først spørre brukeren om gårdsnummer og bruksnummer for eiendommen som skal deles. Deretter skriver programmet ut en liste over navnene på hjørnene til den eksisterende eiendommen, og ber brukeren velge to av disse hjørnene. Deretter deles eiendommen i to ved å trekke en rett linje mellom de to valgte hjørnene. Figuren nedenfor viser et eksempel på deling av en eiendom. Den opprinnelige eiendommen har fire hjørner med navnene "h7", "h3", "h14" og "h5". Brukeren ber om å få delt eiendommen langs en linje som går gjennom "h3" og "h5", og resultatet er to eiendommer som hver har tre hjørner: den ene har hjørnene "h7", "h3" og "h5", mens den andre har hjørnene "h3", "h14" og "h5". Legg merke til at to eiendommer kan ha flere felles hjørner (her blir "h3" og "h5" felles for de to eiendommene). h7 h5 h3 h14 Det er ikke alle par av hjørner som gir en fornuftig oppdeling av en eiendom i to. For eksempel kan vi ikke dele eiendommen i eksemplet ovenfor langs linjen gjennom "h7" og "h3". Det er ikke nødvendig å teste spesielt for slike ting i denne oppgaven. Du skal anta at brukeren oppgir to hjørner som gir en fornuftig deling av eiendommen i to. Etter deling kan den ene (vilkårlig hvilken) av eiendommene beholde det gårdsnummeret og bruksnummeret som eiendommen hadde før deling. Den andre eiendommen må få tildelt et nytt gårdsnummer og bruksnummer, og programmet skal spørre brukeren om å få disse. Oppgave 7 (5 %) Lag en metode i klassen Register som sjekker om to eiendommer har en felles grenselinje. Kriteriet for at to eiendommer har en felles grense, er at det finnes to hjørner som begge forekommer i begge eiendommer, og at det går en grenselinje mellom hjørnene i begge eiendommer. Metoden skal ha som parametre gårdsnummerne og bruksnummerne til de to eiendommene, og metoden skal returnere true dersom eiendommene har en felles grenselinje og false ellers. Ole Christian Lingjærde Gerhard Skagestein
VEDLEGG A Ta utgangspunkt i følgende programskisse. /* Klasse med main() som starter hele programmet */ class EiendomsregisterMain { public static void main (String [] args) { new Eiendomsregister(); } } // end class EiendomsregisterMain /* Kontroll og utsyn */ class Eiendomsregister { Register reg; Eiendomsregister() { /* Her er det bl.a. en løkke for innlesning og håndtering av ordre fra brukeren. Du trenger ikke lage denne. */ } } // end class Eiendomsregister /* Modell */ class Register { /* Her skal du etterhvert fylle inn ting */ } // end class Register /* Klasse for å representere et hjørne */ class Hjorne { double lengdegrad; double breddegrad; void settlengdegrad(double lgrad) {lengdegrad = lgrad;} void settbreddegrad(double bgrad) {breddegrad = bgrad;} double fålengdegrad() {return lengdegrad;} double fåbreddegrad() {return breddegrad;} /* Her skal du etterhvert fylle inn mer */ } // end class Hjorne