Avatar billede sykofanten Nybegynder
19. september 2005 - 18:59 Der er 11 kommentarer og
1 løsning

Hjælp til Java opgave

http://www.daimi.au.dk/dIntProg/opgaver.html#W2.2.10
opg W2.2.10 spm 7 er jeg kommet til.

I min TestDriver har jeg lavet 2 DiceCups med helholdsvis 2 og 6 terninger via koden:

{
      DiceCup c1 = new DiceCup(2);
      DiceCup c2 = new DiceCup(6);

     
}

Jeg kan dog ikke finde ud af at komme videre med opgaven.
Jeg har selv forsøgt at sige noget i stil med

while(c1 <= c2)
gør sån og sån...

MEN det må man åbenbart ikke.

Er der nogen der kan fortælle mig hvad jeg skal skrive? Har kun programmeret i 3 uger, men denne opgave skal laves inden onsdag og jeg har ingen anelse om hvordan :)

(bruger bluej)
Avatar billede schwarz84 Nybegynder
19. september 2005 - 19:21 #1
Du er på det rigtige spor i hvert fald. Det giver ikke mening i Java at tale om at et objekt (c1) er mindre end et andet (c2). Det der derimod giver meninge er at tale om at det samlede antal øjne på terningerne er mindre. Jeg kan se at du i opgave 3 har skullet finde summen af antal øjne i bærerne, og dem skal du altså have fat i igen nu og sammenligne dem i stedet for at lægge dem sammen.
Avatar billede sykofanten Nybegynder
19. september 2005 - 19:40 #2
problemet er så bare at i spm 4 sku jeg smide feltvariablene over i en container, og der måtte jeg så opgive at få min

    public int eyes()
    {
        return Dice1.eyes() + Dice2.eyes();
      }
"konverteret" :)

Jeg kan prøve at smide det kode jeg har i de forskellige klasser i de følgende kommentarer.
Avatar billede sykofanten Nybegynder
19. september 2005 - 19:58 #3
public class Dice
{

    private int dice;

    /**
    * Konstruktøren af objekter af klassen Dice.
    * Startværdi sættes til 0.
    */
    public Dice()
    {
        dice = 0;
    }

    /**
    * Metoden kaldes og terningens udfald er 6 øjne.
    * Det returneres derefter.
    * @return dice Returnerer en 6'er
    */
    public int throwSix()
    {
        dice = 6;
        return dice;
    }
   
    /**
    * Metoden kaldes og terninges udfald bliver tilfældigt.
    * Dernæst returneres resultatet.
    * @return dice Returnerer x antal øjne
    */
    public int throwDice()
    {
        dice = (int) (Math.random()*6+1);
        return dice;
      }
   
    /**
      * Metoden kaldes og returnerer terningens nuværende antal øjne.
      * @return eyes Returnerer terningens øjne.
      */
    public int eyes()
    {
        return dice;
      }
}
Avatar billede sykofanten Nybegynder
19. september 2005 - 19:58 #4
public class DiceCup
{
 
    private ArrayList dices;
    private int eyes;
   
    /**
    * Konstuktøren opretter en arraylist ved navn dices.
    */
   
    /*
    public DiceCup()
    {
    dices = new ArrayList();
    }
    */
   
   
    /**
    * Konstuktøren opretter en arraylist ved navn dices,
    * og antal terninger sættes til 2.
    * @param dicesInCup Terninger i raflebægeret
    */
   
    public DiceCup(int dicesInCup)
    {
        dices = new ArrayList();
   
    /**
      * i sættes til 0 så løkken kan blive kørt igennem 2
      * gange og 2 objekter bliver lavet.
      */ 
        int i = 0;
                       
        while(i <= dicesInCup)
        {
            Dice dice = new Dice();
            this.dices.add(dice);
            i++;
        }
    }

    /**
      * Metoden udfører et kast med terningerne i raflebægeret.
      */
    public void throwDice()
    {
        /**
        * ArrayListens iterator metode kaldes og laver et iterator
        * objekt.
        */
   
        Iterator ite = dices.iterator();
       
        /**
        * Iterator metoden undersøger om der er flere iterator
        * objekter. Er der det, vælges det næste.
        */
       
        while(ite.hasNext())
        {
            Dice dice = (Dice)ite.next(); // casting
            dice.throwDice();
        }
       
    }
   
}
Avatar billede schwarz84 Nybegynder
19. september 2005 - 19:59 #5
Det forstår jeg ikke helt. Ja, det ville være nyttigt at se hele din kode!
Avatar billede sykofanten Nybegynder
19. september 2005 - 19:59 #6
public class TestDriver
{
   
    public static void run()
    /*{

        Dice c1 = new Dice();
        Dice c2 = new Dice();
       
        c1.throwDice();
        System.out.println(c1.eyes());
        c2.throwDice();
        System.out.println(c2.eyes());
        int sum = c1.eyes() + c2.eyes();
        System.out.println(sum);
       
       
    }
    */
 
  {
      DiceCup c1 = new DiceCup(2);
      DiceCup c2 = new DiceCup(6);
     
      c1.throwDice();
      c2.throwDice();
     
     
     
    }

}
Avatar billede schwarz84 Nybegynder
19. september 2005 - 20:09 #7
Det er mere Java'sk at kalde metoden getEyes() i stedet for eyes() men lad det ligge...

Du mangler din eyes() på DiceCup. Du kan når du kaster terninger se hvor mange øjne der er og så lægge dem til det samlede antal. Eksempelvis kan metoden:
  /**
      * Metoden udfører et kast med terningerne i raflebægeret.
      */
    public void throwDice()
    {
        /**
        * ArrayListens iterator metode kaldes og laver et iterator
        * objekt.
        */
 
        Iterator ite = dices.iterator();
     
        /**
        * Iterator metoden undersøger om der er flere iterator
        * objekter. Er der det, vælges det næste.
        */
     
        while(ite.hasNext())
        {
            Dice dice = (Dice)ite.next(); // casting
            dice.throwDice();
        }
     
    }

Se således ud i stedet:
  /**
      * Metoden udfører et kast med terningerne i raflebægeret.
      */
    public void throwDice()
    {
        /* Sætter antallet af øjne til 0 */
        eyes = 0;
        /*
        * ArrayListens iterator metode kaldes og laver et iterator
        * objekt.
        */
 
        Iterator ite = dices.iterator();
     
        /*
        * Iterator metoden undersøger om der er flere iterator
        * objekter. Er der det, vælges det næste.
        */
     
        while(ite.hasNext())
        {
            Dice dice = (Dice)ite.next(); // casting
            dice.throwDice();
            eyes = eyes + dice.eyes();
        }
     
    }

Og så kunne du lave en metode på DiceCup der returnerer eyes. Så kan du bruge de tal du får fra denne metode til at løse opgaven...

Det er kun Java-doc kommentarer der starter med /**. Almindelig flerlinjers kommentarer starter bare med /*
Avatar billede sykofanten Nybegynder
19. september 2005 - 20:37 #8
Tak for hjælpen indtil nu, men der er dog lige et problem mere inden du får pointsne :D. Jeg har nu lavet en metode på DiceCup der returnerer eyes, men desværre returnerer den flere end den skulle kunne.

Med 1 terning kan den returnere mere end 6 øjne, og det kan den lige gyldigt hvor mange terninger jeg indsætter i konstruktørens parameter.

Jeg skrev bare det ind du foreslog og lavede så
    public int getEyes()
    {
     
        return eyes;
       
    }

i klassen DiceCup.
Avatar billede schwarz84 Nybegynder
19. september 2005 - 21:08 #9
Du laver en terning for meget:

    public DiceCup(int dicesInCup)
    {
        dices = new ArrayList();
 
    /**
      * i sættes til 0 så løkken kan blive kørt igennem 2
      * gange og 2 objekter bliver lavet.
      */
        int i = 0;
                     
        while(i <= dicesInCup)
        {
            Dice dice = new Dice();
            this.dices.add(dice);
            i++;
        }
    }

Hvis dicesInCup er 2 her, laver du faktisk 3 terninger, først er i=0 og while-løkken køres. Herefter køres den med i=1 og til sidst med i=2. Enten skal i starte på 1, og ellers skal der stå while(i < dicesInCup) altså 'skarpt mindre end' i stedet for 'mindre end eller lig med'
Under alle omstændigheder er det pænere at bruge en forløkke som er beregnet til denne slags gennemløb. Altså:

    public DiceCup(int dicesInCup)
    {
        dices = new ArrayList();
 
    /**
      * i sættes til 0 så løkken kan blive kørt igennem 2
      * gange og 2 objekter bliver lavet.
      */
 
        for(int i=0;i < dicesInCup; i++)
        {
            Dice dice = new Dice();
            this.dices.add(dice);
        }
    }

Hvorfor står der i øvrigt i kommentaren at løkken køres 2 gange? Man angiver jo selv antallet af gange...
Avatar billede schwarz84 Nybegynder
19. september 2005 - 21:10 #10
Contructoren kan endda skrives en smule kortere, nemlig:
    public DiceCup(int dicesInCup)
    {
        dices = new ArrayList();

    /**
      * Der tilføjes det antal terninger som er dicesInCup angiver
      */

        for(int i=0;i < dicesInCup; i++)
        {
            this.dices.add(new Dice());
        }
    }

Der er jo ingen grund til at give navn til et objekt når du ikke bruger dette navn igen...
Avatar billede sykofanten Nybegynder
19. september 2005 - 21:28 #11
Tak for hjælpen. For lige at besvare dine spørgsmål er det fordi jeg kun har programmeret i 3 uger, og mildt sagt er elendig til det :) Du har dog hjulpet mig meget, så her er dine 200 points :D
Avatar billede schwarz84 Nybegynder
20. september 2005 - 17:36 #12
Det er udelukkende et spørgsmål om at øve sig, så det kan du sagtens blive god til.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester