Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 ? h?sten 2009
Leveringsfrist
Oppgaven m? l?ses individuelt og leveres senest fredag 25. september 2009
kl 16.00 via Joly. Viktig: Les slutten av oppgaven for
detaljerte leveringskrav.
Form?l
Form?let med denne oppgaven er ? gi trening i bruk av forgreninger, l?kker,
arrayer og metoder, samt trening i ? programmere kommunikasjon med bruker via terminal.
Oppgave
Utenfor kysten av Utopia er det et omr?de med store oljeforekomster under
havbunnen, og myndighetene i Utopia 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 11 x 17 ruter (se figuren under), hvor radene
er nummerert fra 0 til 10 og kolonnene er nummerert fra 0 til 16. 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
10, og kolnr er et heltall mellom 0 og 16. For eksempel angir 0-0,
0-1, 0-2, ... 0-16 feltene i ?verste rad (fra venstre mot h?yre) i figuren under.
kolonnenummer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
radnr. |
|
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 Utopia 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 Utopia. N?r et oljeselskap ?nsker ? kj?pe et gitt felt, ringer de funksjon?ren som s? bruker ditt program for ? registrere kj?pet av feltet. Funksjon?ren skal ogs? kunne f? ut fra programmet en oversikt over feltene med eiere og en del andre ting (se under).
Programmet skal v?re kommandostyrt: 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:
Programmet skal gjenta de tre trinnene ovenfor helt til brukeren gir kommando om ? avslutte. Brukeren skal kunne gi f?lgende kommandoer:
(a) Hvis feltet er ledig skal programmet registrere at det inntastede oljeselskapet n? eier
det aktuelle feltet. Programmet skal ogs? skrive ut p? skjermen at kj?pet gikk
i orden, f.eks. med en utskrift som dette:
(b) Hvis feltet ikke var ledig skal programmet f?rst sjekke om
selskapet som eier feltet n? er det samme selskapet som bruker tastet inn.
I s? fall skal programmet skrive en melding om det, f.eks.
(c) Hvis verken (a) eller (b) var tilfelle, s? betyr det at feltet som bruker tastet inn har en annen eier. Da skal programmet skrive ut n?v?rende eier av feltet og sp?rre bruker om kj?pet virkelig skal gjennomf?res, dvs. om feltet skal overtas av det nye selskapet. Hvis bruker svarer ja skal kj?pet registreres som i del (a). Hvis bruker ikke svarte ja skal det gis en melding til bruker om at ingen endring ble registrert.
Felt 3-4 eies av Shell. Total utvinning i dette feltet er 0 fat. Felt 5-6 eies av Esso. Total utvinning i dette feltet er 100 fat. Felt 10-0 eies av Shell. Total utvinning i dette feltet er 500 fat.Du avgj?r selv i hvilken rekkef?lge programmet skal g? gjennom alle feltene og skrive ut informasjon om eide felter (f.eks rad for rad fra toppen og ned).
Antall fat utvunnet i felt 3-4 (Shell) siste 6 mnd.: 10 Antall fat utvunnet i felt 5-6 (Esso) siste 6 mnd.: 20 Antall fat utvunnet i felt 10-0 (Shell) siste 6 mnd.: 30Programmet skal registrere disse opplysningene (dvs. legge til de nye antall oljefat i arrayen som holder dataene om utvinning, f.eks. hvis utvinningen i felt 3-4 var 100 oljefat fra f?r, skal verdien n? bli 110).
> java Oblig2 *** VELKOMMEN TIL UTOPIAS OLJEFELTOVERSIKT *** Du har f?lgende valgmuligheter: 1) Kj?p felt 2) Lag feltliste 3) Lag oversiktskart 4) Halv?rsoppdatering 5) Lag statistikk 6) Avslutt Velg kommando: 1 ** Kj?p felt ** Oppgi feltet som ?nskes kj?pt: 3-6 Oppgi oljeselskapets navn: BP Felt 3-6 er n? kj?pt av BP Du har f?lgende valgmuligheter: 1) Kj?p felt 2) Lag feltliste 3) Lag oversiktskart 4) Halv?rsoppdatering 5) Lag statistikk 6) Avslutt Velg kommando: 2 ** Lag feltliste ** Felt 3-6 eies av BP, utvinning: 0 fat .... osv ....
Tips og forutsetninger som kan gj?res
For hvert felt er det to opplysninger som skal tas vare p?: (1) navnet p?
oljeselskapet som eier det; og (2) hvor mye olje som er utvunnet i feltet. Du
kan bruke to to-dimensjonale arrayer til ? lagre disse opplysningene:
String[][] eier = new String[11][17]; double[][] utvunnet = new double[11][17];
Dermed vil f.eks. eier[0][3] v?re navnet p? oljeselskapet som eier feltet 0-3; og utvunnet[0][3] vil v?re antall fat olje som er utvunnet p? dette feltet (sistnevnte array kunne ogs? v?rt deklarert som en int-array - her st?r du fritt til ? velge). Det finnes andre m?ter ? l?se oppgaven p? (vi kunne klart oss med en enkelt to-dimensjonal array med pekere til objekter av en klasse som vi selv lager - men denne teknikken gjennomg?s ikke f?r senere i kurset og skal ikke anvendes i denne oppgaven).
Programstruktur:
Nedenfor er det en programskisse du kan bruke som utgangspunkt (du beh?ver
ikke ? f?lge det, men det er i alle fall et forslag til en ryddig start p?
programmet ditt). Hvis du f?lger denne skissen s? trenger du ikke endre
noe i den f?rste klassen (class Oblig2), det er nok at du
gj?r alle endringene dine i klassen Olje.
import easyIO.*; class Oblig2 { public static void main(String[] args) { Olje ol = new Olje(); ol.ordrel?kke(); System.out.println("Takk for n?"); } } class Olje { In tast = new In(); Out skjerm = new Out(); < Her kan du deklarere arrayene eier[][] og utvunnet[][] > void ordrel?kke() { int ordre = 0; while (ordre != 6) { < Her skriver du ut ordremenyen med nummer foran hver ordre slik at brukeren kan velge ordre ved ? angi et nummer > < Be om og les inn ny ordre fra brukeren; legg ordrenummeret som brukeren oppgir i variabelen ordre > switch (ordre) { case 1: kj?pFelt(); break; case 2: lagFeltliste(); break; case 3: lagOversiktskart(); break; < Fyll inn de resterende casene her > default: break; } } } // De andre metodene (en for hver ordre): void kj?pFelt() { < Be om og les inn rad-kol og oljeselskap > < Test om arrayen eier[][] allerede har et oljeselskap i den angitte rad-kol. Hvis ikke, registreres kj?pet, osv. > } void lagFeltliste() { } void lagOversiktskart() { } < Her legger du de ?vrige metodene du trenger > }
Her er noen tips og kommentarer til noen av kommandoene. Hver av disse punktene l?ses lettest hvis du for hvert punkt lager en metode og det er derfor et krav at din l?sning har en metode for hver kommando (unntatt Avslutt-kommandoen):
int radnr = tast.inInt("-\n\r "); int kolnr = tast.inInt("-\n\r ");Her er det en variant av inInt() som brukes. Det som st?r i anf?rselstegn er de tegnene som skal betraktes som skilletegn - alts? de tegnene som inInt() skal se p? som "blanke tegn" f?r og etter tallene. De spesielle skilletegnene linjeskift ("\n") og vognretur ("\r") er ikke n?dvendige ? ta med blant skilletegnene, men kan godt v?re med som vist ovenfor. Mellomroms-tegnet derimot m? tas med inne i anf?rselstegnene hvis man vil at det skal betraktes som skilletegn (f.eks. hvis du vil godta at bruker taster inn "3 - 6" som feltnavn).
I del (a) m? programmet ha en m?te ? finne ut om et felt er solgt eller ikke. En enkel m?te ? finne ut om f.eks. felt 3-6 er solgt er ? se om eier[3][6] er satt til et navn eller ikke. Rett etter at 2D-arrayen eier er deklarert er alle verdiene i arrayen lik den spesielle verdien null, og du kan derfor sjekke om 3-6 er ledig ved ? teste om eier[3][6] == null.
I del (b) skal du sammenligne tekst-verdier med hverandre og finne ut om de er like. Vanligvis bruker man "==" i Java for ? teste om to verdier er like, men dette kan i noen tilfeller gi et annen resultat enn ventet n?r det som sammenlignes er to tekster (?rsaken til dette kommer vi tilbake til senere i kurset). For ? teste om to tekster er like skal man i stedet bruke metoden .equals(), slik: "if (tekst1.equals(tekst2))". Mer om dette kan du lese i avsnitt 6.4.1 p? side 105 i l?reboka. Ved sammenligning av en tekst mot den spesielle verdien null derimot, s? skal man bruke "==" (eller "!=" for ulikhet), se (a) ovenfor.
I del (c) trenger du et ja/nei-sp?rsm?l. Det kan programmeres p? mange m?ter, f.eks. vha. inChar("\n\r") og betrakte 'j' som ja-svaret, og alt annet som nei. Det som st?r i parentesene til inChar("\n\r") angir at evt. linjeskift (\n) eller vognretur (\r) som brukeren har tastet ikke skal betraktes som svar, og kan v?re n?dvendige fordi inChar ogs? leser inn blanke tegn (se side 348 i l?reboka).
Du kan gj?re egne forutsetninger etter behov s? lenge disse ikke er i strid med oppgaven, men s?rg for ? kommentere disse i programmet. Et tips: S?rg f?rst for ? f? kommandol?kken til ? fungere, dvs s?rg for at programmet klarer ? skrive ut lovlige kommandoer og lese inn en kommando p? korrekt m?te. Deretter kan du g? videre og programmere de enkelte kommandoene (i vilk?rlig rekkef?lge). Det er et krav at det lages minst en metode for hver ordre.
Husk ? kompilere og teste programmet ditt ofte mens du lager det! (hvis ikke s? kan det samle seg mange feil som blir vanskeligere ? rette etterp?).
Leveringskrav
Du skal levere en egenprogrammert l?sning (det er f.eks. ikke lov ? "l?ne"
programbiter av andre studenter eller ? hente programbiter fra internett),
og du plikter ? ha lest og forst?tt f?lgende krav til innleverte oppgaver
ved institutt for informatikk:
http://www.ifi.uio.no/studinf/skjemaer/erklaring.pdfOppgaven (.java-filen) skal leveres elektronisk i Joly-systemet:
http://obelix.ifi.uio.no:8080/wizard.htmlTilbakemelding blir normalt gitt innen to uker etter innleveringsfristen (og vanligvis litt raskere).
Dersom besvarelsen vurderes til ikke godkjent kan du f? en begrunnelse for dette av gruppel?reren din, og hun/han kan is?fall gi deg en ny frist (som vil v?re kort og normalt ikke overstige 3-5 virkedager) for ny levering.
For mer informasjon se Reglementet for obligatoriske oppgaver:
www.ifi.uio.no/studier/studentinfo.html#oblig
Lykke til!