Oblig2 - obligatorisk oppgave nr. 2



(av 4) i INF1000 ? h?st 2011

Leveringsfrist

Oppgaven m? l?ses individuelt og leveres senest fredag 30. september kl 16.00 via Joly. Viktig: les slutten av oppgaven for detaljerte leveringskrav.

Form?l

? gi studenten erfaring i ? designe og skrive programmer med objektorientert struktur, samt trening i bruk av metoder og andre Java-elementer fra pensum.

Oppgave

Utenfor kysten av Ruritania er det et omr?de med store oljeforekomster under havbunnen, og

myndighetene i Ruritania har bestemt seg for ? selge rettighetene til ? utvinne olje til oljeselskaper. Det aktuelle havomr?det er rektangul?rt og er delt opp i et rutenett med 8 x 20 ruter (se figur under), hvor radene er nummerert fra 0 til 7 og kolonnene er nummerert fra 0 til 19.

 

Hver rute kalles et utvinningsfelt (eller bare felt). Hvert felt har et entydig navn p? formen radnr-kolnr hvor radnr er et heltall mellom 0 og 7 og kolnr er et heltall mellom 0 og 19. For eksempel angir 0-0, 0-1, 0-2, ..., 0-19 feltene i ?verste rad (fra venstre mot h?yre) i figuren under.

?????????????

 

0

1

2

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Feltene (eller mer presist: utvinningsrettighetene til dem) legges ut for salg enkeltvis. Det er ingen grenser for hvor mange felter et oljeselskap kan eie, men et felt kan ikke ha mer enn ett oljeselskap som eier (dvs hvert felt er enten: Ikke solgt, eller det eies av ett oljeselskap).

 

Myndighetene i Ruritania trenger n? et datasystem som kan holde rede p? hvilke felter som er solgt og hvilke eiere disse har. Systemet skal ogs? holde rede p? hvor mye olje (m?lt i antall fat) som er utvunnet i hvert felt. Brukeren av systemet skal v?re en funksjon?r som jobber for myndighetene i Ruritania. N?r et oljeselskap ?nsker ? kj?pe et felt, ringer de funksjon?ren som s? bruker ditt program for ? finne et ledig felt (hvis det er noen) og registrere salget av feltet. Funksjon?ren trenger ogs? andre funksjoner i programmet (se under).

 

Programmet skal v?re kommandostyrt, dvs. det skal kunne ta imot en kommando fra brukeren, utf?re kommandoen, ta imot ny kommando, osv, helt til brukeren ?nsker ? avslutte. Mer konkret skal programmet oppf?re seg slik sett fra brukerens side:

?        Det skriver ut p? skjerm hvilke kommandoer brukeren kan gi.

?        Deretter ber programmet om og leser inn en kommando fra brukeren.

?        Programmet utf?rer den valgte kommandoen.

Programmet skal gjenta de tre trinnene ovenfor helt til brukeren gir kommando om ? avslutte (se nedenfor).

 

Brukeren skal kunne gi f?lgende kommandoer:

?        Kj?p et felt. Denne kommandoen vil funksjon?ren gi hvis et oljeselskap ringer og sier at de ?nsker ? kj?pe et felt. Programmet skal da f?rst sjekke om det er noen ledige felter (dvs. felter som ikke allerede er solgt). Hvis det ikke er noen ledige felter, m? programmet gi brukeren beskjed om dette. Hvis det finnes ledige felter, skal programmet sp?rre om navnet p? feltet som ?nskes kj?pt og navnet p? det oljeselskapet som ?nsker ? kj?pe feltet (vi gj?r den rimelige antagelsen at de ulike oljeselskapene har forskjellig navn, slik at navnet entydig identifiserer et oljeselskap) og registrere at dette oljeselskapet n? eier det aktuelle feltet. Programmet skal ogs? skrive ut p? skjermen at salget gikk i orden, f.eks. med en utskrift som dette:

 

"Feltet 3-15 selges til Petrol A/S".

 

Hvis feltet allerede var solgt, m? programmet i stedet gi en feilmelding.

 

?        Annuller kj?p av et felt. Denne kommandoen vil funksjon?ren gi hvis et oljeselskap ringer og sier at de ?nsker ? annullere kj?pet av et felt. Programmet m? da sp?rre brukeren om navnet p? oljeselskapet og navnet p? feltet som oljeselskapet ikke lenger ?nsker ? eie. Deretter skal programmet sjekke at dette feltet faktisk er solgt til dette oljeselskapet, og i s? fall registrere at feltet ikke lenger har noen eier (og f?lgelig er ledig for salg). Mengden olje som er utvunnet i feltet skal ikke settes til null igjen. Brukeren skal f? bekreftelse p? at salget er annullert. Hvis feltet derimot ikke var solgt til dette oljeselskapet, m? brukeren f? beskjed om dette.

 

?        Lag oversiktskart. Programmet skal da skrive ut p? skjermen et kart (se eksempel nedenfor) hvor hvert felt er markert med en "." hvis det er ledig og "x" hvis det er solgt. NB: Det er ikke et krav at markeringene i samme kolonne kommer rett under hverandre, s? lenge alle kolonnene er med i hver rad som skrives ut.


 

 

0

1

2

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

0

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

1

.

.

x

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

.

.

.

.

.

x

x

x

.

.

.

.

.

.

.

.

.

x

.

3

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

.

.

.

.

.

.

.

.

x

.

.

.

.

.

.

.

.

.

.

6

x

.

.

.

.

.

.

.

.

.

.

.

x

.

.

.

.

.

.

7

.

.

.

.

.

.

.

.

.

.

.

.

x

.

.

.

.

.

.

 

.

?        Oppdater oljeutvinning. Hvert ?r m? oljeselskapene ringe til funksjon?ren og fortelle hvor mye olje de har utvunnet p? hvert av feltene i l?pet av det siste ?ret. Da bruker funksjon?ren denne kommandoen for ? registrere informasjonen. Programmet ber da om navnet p? feltet og hvor mye olje (m?lt i fat) selskapet har utvunnet der siste ?r, og oppdaterer registeret.

 

?        Finn sum oljeutvinning. Programmet skal da regne ut hvor mye olje som er utvunnet i sum i alle de feltene som er solgt, og skrive ut resultatet p? skjermen. Husk ? f? med alle feltene, ogs? de som er levert tilbake, men hvor det har v?rt utvinning.

 

?        Avslutt. Programmet skal da avslutte. Det er ikke meningen at programmet skal ta vare p? (skrive til fil) de dataene som er registrert av funksjon?ren.

 

Nedenfor ser du et eksempel p? starten av en kj?ring av programmet (bruker-input er markert med understreking). Utskriften er bare ment ? illustrere hvordan kommunikasjonen kan foreg?; dersom du ?nsker ? presentere menyen annerledes osv, s? kan du gj?re det.

 

>java Oblig2

*** VELKOMMEN TIL RURITANIAS OLJEFELTOVERSIKT ***

 

Du har f?lgende valgmuligheter:

1) Kj?p et felt

2) Annuller kj?p av et felt

3) Lag oversiktskart

4) Oppdater oljeutvinning

5) Finn sum oljeutvinning

6) Avslutt

 

Velg kommando: 1

** Kj?p et felt **

Oppgi feltet som ?nskes kj?pt: 3-6

Oppgi oljeselskapets navn: Oljes?l A/S

Feltet 3-6 selges til Oljes?l A/S.

 

Du har f?lgende valgmuligheter:

1) Kj?p et felt

2) Annuller kj?p av et felt

3) Lag oversiktskart

4) Oppdater oljeutvinning

5) Finn sum oljeutvinning

6) Avslutt

 

Velg kommando: 5

.... osv ....

Krav til l?sning

  • L?sningen skal inneholde en metode for hver av de tillatte kommandoene, samt en for innlesing av kommando, og benytte to klasser (en med main-metoden og en med kommandol?kken , data for foljefeltene og alle metodene som gj?r de ulike kommandoene).
  • Datastrukturen som representerer oljefeltet, og alle metoder som bearbeider denne, skal ligge i en egen klasse

Relevant pensumstoff

F?lgende anbefales sterkt ? repetere f?r du starter planlegging/ design av programmet ditt:

  • Design av program med metoder, kap 7.3

Andre deler av pensum du antakelig vil benytte er (ikke komplett!):

  • Metoder, kap 7.1-7.7
  • Todimensjonale arrayer, kap. 5.7
  • Terminal I/O, kap 3.3-3.5
  • String, kap. 6.4.1

Krav til innlevering

?Oblig2 skal leveres (java-filen) ?innen fredag 30. sept. kl. 1600 til Joly.

Tips om programstrukturen

Nedenfor f?lger en skisse av hvordan du kan starte p? Oblig2 , med to klasser (Oblig2 og Olje). Dette er bare et tips, du kan gjerne gj?re det p? ?din? m?te, men denne obligen skal l?ses med to klasser og ??n metode for hver mulige ordre.

import easyIO.*;

class Oblig2 {

??? public static void main(String[] args) {??

???? ???Olje ol = new Olje();

??????? ol.ordrel?kke(); // Kj?rer metoden ordrel?kke i klassen Olje

??????? System.out.println("-- Programmet avslutter --");

??? }

}

 

class Olje {

??? // Klargj?ring for innlesing/utskrift, gjelder for hele klassen:

???? In tast = new In();

???? Out skjerm = new Out();

??? // Her kan du deklarere arrayene eier[][] og utvunnet[][]:

??? // Metoden "ordrel?kke()":

??? // Denne er den f?rste metoden i klassen Olje som blir utf?rt.

??? void ordrel?kke() {

??????? int ordre = 0;

 

????? ??// 6 betyr avslutt

??????? while (ordre != 6) {

??????????? // Legg her setninger som skriver ut menyen, f.eks. linjer med

??????????? // println eller skjerm.outln(), eller kall p? en egen metode.

??????????? System.out.println(" 1) Liste over felt med eier");

 

??????????? // Her kan du skrive ut en ledetekst, f.eks. "Velg ordre: ",

??????????? // og s? leser du input som bruker taster inn.

??????????? ordre = ?.;? // (Erstatt ? med kode som leser fra tastatur.)

 

??????????? switch (ordre) {

?????????? ?????case 1: kj?pEtFelt(); break;

??????????????? case 2: annulerKj?p(); break;

??????????????? case 3: lagOversiktskart(); break;

??????????????? // ... fyll inn case-er for de to andre ordrene her.

??????????????? default: break;

??????????? }

??????? }

??? }

??? // De andre metodene: (en for hver ordre)

??? void kj?pEtFelt() {

??????? // Programm?r kj?p av felt her:

??????? // - Be bruker taste inn rad-kol., og oljeselskap.

??????? // - Test om arrayen eier[][] allerede har et oljeselskap i den

??????? //?? angitte rad-kol.:? (a) Hvis ikke => registr?r kj?pet, osv...

??? }

??? void annulerKj?p() {

??? }

??? void lagOversiktskart() {

??? }

??? // ...Osv.(resten av? metodene ? ?n for hver av de gjenst?ende ordrene)