Opgaver Lektion 5

Aflevering af opgaver

Send en mail til neinalways@gmail.com med:

  • Ordet grprog i emnelinjen.
  • EN vedlagt arkivfil i rar, jar, 7z, zip, eller tgz.format indeholdende jeres kildekode.
  • Alle relevante filer skal være i arkivfilen. Relevante filer er .java-filer.
  • Arkivfilen skal have lektionsnummer og initialer i filnavnet. Fx NMLlektion3.jar. INGEN MELLEMRUM i directory- eller filnavne, tak!

Øvelse 5.0

I begyndelsen var de hele tal! Senere er talbegrebet blevet udvidet med brøker. De rationale tal er således alle hele og brøker. De rationale tal ℚ er et tal, der repræsenteres som forholdet mellem to heltal. For eksempel er 3/7 et rationalt tal. Man kan også opfatte heltal som rationale med tallet som tæller og et, 1, som nævner. I denne opgave skal du skrive en klasse der rummer rationale tal. (Opgaven er [Dow11] exercise 11.3).

Du skal således skabe en klasse Rational, der kan en række ting, som brøker kan ;-) Læs det følgende grundigt igennem, tegn derefter klassen i UML, og slut af med kodning.

  1. Skriv klassen Rational. Klassen skal have to egenskaber, heltal, til at indeholde tæller og nævner.
  2. Lav en konstruktør, der ikke tager parametre, men sætter instansvariablerne til henholdsvis 0 og 1.
  3. Skriv en toString(), der leverer det rationale tal til print på en ordentlig måde.
  4. Dit testprograms main skal oprette et objekt af typen Rational og printe brøken.
  5. Du skulle nu kunne teste dit program, gør det og noter erfaringerne. Hvilke problemer erfarede du, og hvorfor? Ret eventuelle fejl, compilerfejl selvfølgelig, men også evt. logiske fejl.
  6. Skriv en anden konstruktør, der tager argumenter for både tæller og nævner.
  7. Skriv en metode negate, der vender brøkens fortegn. Udvid main, så metoden testes.
  8. Skriv en metode invert, bytter om på tæller og nævner. Dette kaldes også at tage den reciprokke værdi. Der skrives også her kode i main, der tester metoden.
  9. Skriv en metode toDouble, der beregner og returnerer brøken som decimalbrøk.
  10. Skriv en metode reduce (forkort), der forkorter brøken mest muligt. Det gøres ved at dividere tæller og nævner med deres største fællesnævner. Metoden skal være en ren funktion, dvs en statisk metode, der ikke ændrer instansvariablerne i det objekt, hvorpå den kaldes. Det kan være praktisk at have en statisk metode, der beregner denne største fællesnævner, kald den gcd(int a, int b). Se herunder.
  11. Skriv en metode add, der adderer to brøker. Lad metoden returnere et nyt objekt af typen Rational. Summen skal være forkortet mest muligt.
  12. Hvis du bliver grebet af opgaven, kan du jo lave metoder til henholdsvis sub, mul og div i tillæg til den forrige.
  13. Alle metoder skal testes.

Euclids algoritme

    /**
     * Verdens ældste ikke trivielle algoritme. Stammer fra: 
     * Euclid's Elementer, Bog 7, ca. 300 fvt.
     * Bygger på at hvis r = resten ved divisionen a/b,
     * så er a og b's fælles divisorer de samme som b og r's.
     * Det betyder at gcd(a,b) = gcd(b,r)
     *
     * Ved fortsat udføre dette får vi fx:
     * gcd(36,20) = gcd(20,16) = gcd(16,4) = gcd(4,0)
     * Det kan bevises at uanset startværdier ender vi med
     * et talpar, hvor det andet er 0. Når vi er nået dertil er det 
     * første tal i parret lig med tallenes gcd.
     *
     * Dette er skoleeksemplet på rekursion!
     */
    
     /**
      * Euclids algoritme
      */
     public static int gcd(int a, int b) {
        if (b == 0)
            return a;
        else
            return gcd(b, a % b);
    }

Øvelse 5.1

I brætspillet Scrabble har hver brik et bogstav, der bruges til at forme ord, samt et tal der bruges i kalkulation af ordenes værdi.

  1. Tegn og kod en klasse, Tile, der repræsenterer en Scrabble-brik. Instansvariablerne skal være en char kaldet letter og en heltalsvariabel value.
  2. Skriv en konstruktør, der tager parametrene letter og value, hvormed instansvariablerne initialiseres.
  3. Skriv en metode toString(), der leverer instansvariablerne på en læsevenlig måde.
  4. Skriv et testprogram TestTile, der skaber en brik 'Z' med værdien 10. Udskriv brikkens status.

Pointen med denne opgave er at træne jer i at skrive Java klasser efter en specifikation, her verbal, samt kode til test af klassen. Pointen er ikke at skrive et spil ;-) [Dow11] Exercise 11.1.

Øvelse 5.2

Tegn og kod en klasse Dato, der indeholder integers til år, måned og dag. Kald dem henholdsvis year, month, og day. Klassen skal have to konstruktører, den første tager ingen parametre. Den anden tager parametre til initialisering af alle tre instansvariabler. Der ønskes endvidere en metode equals til sammenligning af to Datoer.

Skriv nu et testprogram, der laver et Dato-objekt og kalder det birthday. Test med din egen fødselsdag. Hvilken konstruktør du bruger, bestemmer du selv. [Dow11] Exercise 11.2.

Tegn og kod en Person-klasse med navn og fødselsdag som egenskaber. I dettes testprogram skal oprettes og opbevares et antal personer. Programmet skal undersøge om flere har fødselsdag på samme dato, og meddele hvor mange, og hvem, der har fødselsdage på den hyppigste dato.