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)