You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »

Oppgaven handler om en Rectangle-klasse, som håndterer et firkantet område i et koordinatsystem, med sider parallelle med koordinataksene.

Tilstanden i Rectangle-objekter er ikke spesifisert eksplisitt, men må velges slik at metodene nedenfor kan implementerers. Merk at alle metodene jobber med heltallsstørrelser og at x-aksen øker mot høyre og y-aksen øker nedover.

Rectangle-klassen har metoder for å spørre om tilstanden og endre tilstanden. Spørremetodene dekker høyde og bredde og koordinatene til øverste venstre og nederste høyre hjørne og om rektanglet inneholder spesifikke punkt(er). Endringsmetodene dekker forskyving (translasjon) og utviding.

Logikken til metodene må tilfredsstille følgende krav:

  • et Rectangle-objekt er tomt i starten
  • et tomt Rectangle-objekt skal returnere 0 for alle get-metodene (minX, minY, maxX, maxY), true for isEmpty og false for contains-metodene.
  • et punkt har bredde og høyde lik 1, så dersom en legger punktet x,y til et tomt Rectangle-objekt, så skal getMinX og getMaxX returnere x, getMaxX og getMaxY skal returnere y og getWidth og getHeight skal returnere 1.
  • når en utvider et Rectangle-objekt med en av add-metodene, så skal ikke rektanglet bli større enn nødvendig.

Spørremetoder:

  • int getMinX() og int getMinY() - returnerer henholdsvis x- og y-koordinatene til det øverste venstre hjørnet som er inneholdt i dette rektanglet. Dersom dette rektanglet er tomt, så skal 0 returneres.
  • int getMaxX() og int getMaxY() - returnerer henholdsvis x- og y-koordinatene til det nederste høyre hjørnet som er inneholdt i dette rektanglet. Dersom dette rektanglet er tomt, så skal 0 returneres.
  • int getWidth() og int getHeight() - returnerer henholdsvis bredden og høyden til rektanglet. Begge skal returnere 0, dersom dette rektanglet er tomt.
  • boolean isEmpty() - returnerer true om rektanglet er tomt, dvs. om bredden og/eller høyden er 0.
  • boolean contains(int x, int y) - returnerer true om punktet x,y er inneholdt i dette rektanglet, og false ellers.
  • boolean contains(Rectangle rect) - returnerer true om hele rect, dvs. alle punktene i rect er inneholdt i dette rektanglet, og false ellers. Dersom rect er tomt, så skal false returneres.

Endringsmetoder:

  • void translate(int dx, int dy) - forskyver rektanglet dx enheter langs x-aksen og dy enheter langs y-aksen. Bredden og høyden forblir uendret.
  • boolean add(int x, int y) - utvider (om nødvendig) dette rektanglet slik at det (akkurat) inneholder punktet x,y. Etter kallet skal altså contains(x, y) altså returnere true. Returnerer true om dette rektanglet faktisk ble endret, ellers false.
  • boolean add(Rectangle rect) - utvider (om nødvendig) dette rektanglet slik at det (akkurat) inneholder hele rect-argumentet. Returnerer true om dette rektanglet faktisk ble endret, ellers false. Dersom rect er tomt, så skal dette rektanglet ikke endres.

Del 1 - tilstandsdiagram

Tegn et objekttilstandsdiagram for en tenkt bruk av Rectangle-klassen. Velg en sekvens av kall som bruker alle fire endringsmetoder.

Del 2 - Java-kode

Skriv Java-kode for Rectangle-klassen med oppførsel som er beskrevet over.

Lag en passende toString()-metode og et hovedprogram, slik at du kan sjekke at oppførselen stemmer med tilstandsdiagrammet (bruk samme sekvens av kall).

JExercise-testkode for denne oppgaven finner du her: stateandbehavior/RectangleTest.java.

Ekstraoppgave

Implementer følgende metoder:

  • Rectangle union(Rectangle rect) - returnerer et nytt Rectangle-objekt som tilsvarer kombisjonen av dette rektanglet og rect-argumentet. Alle punktene som finnes i ett av rektanglene skal altså være inneholdt i rektanglet som returneres.
  • Rectangle intersection(Rectangle rect) - returnerer et nytt Rectangle-objekt som tilsvarer overlappet mellom dette rektanglet og rect-argumentet. Alle punktene som finnes i begge rektanglene skal altså være inneholdt i rektanglet som returneres.
  • boolean intersects(Rectangle rect) - returnerer true om dette rektanglet og rect-argumentet overlapper, dvs. om det finnes ett eller flere punkter som er inneholdt i begge disse rektanglene.

 


JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

 

 

 

  • No labels