Avatar billede Bennysørensen Praktikant
22. december 2003 - 02:33 Der er 5 kommentarer

Statiske varible

I en opgave skal jeg beregne et areal.
Jeg synes at det går ok indtil jeg skal til at udskrive det samlede areal: Hvis jeg kan få fat i mine variable i klasse CompositeFigure så jeg kan bruge dem i main() ville opgaven være løst.

Jeg er blevet nød til at lave dem static for at kunne hente dem ind i main, men er det dér det går galt? Jeg kan bruge dem i den nuværende main hvis jeg giver dem en værdi i CompositeFigure, men de bliver ikke ændret af metoderne addfigure og subtractfigure.

Jeg mener at det kan lade sig gøre at lave programmet sådan her, men kan se at jeg ikke kalder addFigure og subtractFigure...men jeg har ikke mere tid (det er en del af et eksamenssæt, og jeg skal lave meget, meget mere), så er der nogen, der kan lave opgaven færdig udfra mit opkast.

Venligst

import java.util.*;

public class AreaCalculator
{
    public static void main(String[] args)
        {
            double totalArea = 0;
                totalArea = CompositeFigure.adds - CompositeFigure.subtracts;
        System.out.println( "totalArea = " + totalArea );
                System.out.println(CompositeFigure.adds + CompositeFigure.subtracts);
                             
        }
       
}

interface Figure
{
    public double getArea();
}

class CompositeFigure implements Figure
{
    public static double adds = 2;
    public static double subtracts = 2;
    public static double area = 0;
   
    public double addFigure()
    {     
        List addFigures = new ArrayList();
        addFigures.add( new Triangle( 2, 5 ) );
    addFigures.add( new Triangle( 2, 5 ) );
        addFigures.add( new Rectangle( 5, 10 ) );
        double adds;
        for( int i = 0; i < addFigures.size(); i ++)
        {
            Figure f = (Figure) addFigures.get(i);
            adds += f.getArea();
    }
        System.out.println(adds);
        return adds;
       
    }
    public double subtractFigure()
    { 
        List subtractFigures = new ArrayList();
        subtractFigures.add( new Circle ( 2 ) );
        subtractFigures.add( new Circle ( 2 ) );
        subtractFigures.add( new Rectangle ( 4, 3 ) );
        double subTotalArea = 0;
        for( int i = 0; i < subtractFigures.size(); i ++)
        {
            Figure f = (Figure) subtractFigures.get(i);
            subtracts += f.getArea();
    }
        return subtracts;
    }
    public double getArea()
    {
        return area;
    }
}
class Circle implements Figure{
    double radius;
    Circle( double r ){
        this.radius = r;
    }
    public double getArea(){
        return radius * radius * 3.14;
    }
}

class Triangle implements Figure{
    double height;
    double width;
    Triangle( double h, double w ){
        this.height = h;
        this.width = w;
    }
    public double getArea(){
        return 0.5 * height * width;
    }
}

class Rectangle implements Figure
{
        double height;
        double width;
        Rectangle(double h, double w)
        {
            this.height = h;
            this.width = w;
        }
        public double getArea()
        {
            return height * width;
        }
    }
Avatar billede jakoba Nybegynder
22. december 2003 - 03:37 #1
Nu er det nok de færreste der synes det er sjovt at stikke fingrene i andre menneskers opkast :-))

Men jeg holdt mig for næsen og kikkede nok til at se at du aldrig laver een eneste instans i main af nogen af af de andre klasser. Og når du ikke gør det kan du aldrig bruge andet end statiske variable og metoder fra dem.

Og det er forhåbentlig nok hjælp til at du kan lave dit hjemmearbejde færdigt selv.

mvh JakobA
Avatar billede Bennysørensen Praktikant
22. december 2003 - 03:42 #2
Tak for hjælpen. Det skal måske lige siges at det altså ikke er en opgave der skal afleveres, men ét ud af syv eksamenssæt jeg arbejder mig igennem inden min eksamen den 13.1: Det er altså ikke "Gider I ikke lige at lave mine lektier for mig?" :o)

...og den med opkastet VAR med vilje :o)
Avatar billede Bennysørensen Praktikant
22. december 2003 - 03:49 #3
...jeg kan forøvrigt heller ikke regne ud hvorfor toString i linie 56 (den nederste toString) bliver kørt i det hér program...

    import java.util.Vector;
   
    public class TestAccount{
        public static void main( String[] args ){
            Account account1 = new Account( 0.0 );
            account1.addAction( new Insert( 23.0 ) );
            account1.addAction( new Insert( 3.0 ) );
                        account1.addAction( new Withdraw( 3.0 ) );
            account1.addAction( new Insert( 10.0 ) );
            account1.addAction( new Insert( 15.0 ) );
            System.out.println( account1.toString() );   
            }
    }
   
    class Account{
        static int nextId = 0;
        int id;
        double total;
        Vector actions = new Vector();
       
        Account( double initialTotal ){
            total = initialTotal;
            id = nextId++;
        }
       
        void addAction( Action action ){
            action.workOn( this );
            actions.add( action );
        }
       
        public String toString(){
            String s = "[Account no " + id +"]";
            for( int n = 0; n < actions.size(); n++ ){
                s += "\n" + actions.get(n).toString();   
            }   
            return s;   
        }
    }
   
    interface Action{
        public void workOn( Account ba );
    }
   
    class Insert implements Action{
        private double amount;
        private double totalBeforeAction;
   
        Insert( double a ){
            this.amount = a;   
        }
       
        public void workOn( Account ba ){
            totalBeforeAction = ba.total;
            ba.total = ba.total + amount;
        }
       
        public String toString(){
            String s = "Inserted " + amount;
            s += ", new total is (" + totalBeforeAction;
            s += " + " + amount + ") = ";
            s += (totalBeforeAction + amount);
            return s;
        }
    }
Avatar billede jakoba Nybegynder
22. december 2003 - 04:01 #4
Ja Ja.
klassen CompositeFigure er en figur ligesom cirkel og trekant. så dens getArea metode skal også returnere et areal:

    public double getArea()
    {
        return area +adds -subtracts;
    }

så er der heller ingen grund til at lave adds og subtracts statisk de bruges jo kin i objektet selv.

så din main metode bliver vel noget i retning af:

    public static void main(String[] args)
        {
            CompositeFigure cf = new CompositeFigure();
            System.out.println( "totalArea fra ny = " + cf.getArea() );
            cf.addFigure();
            System.out.println( "totalArea efter add = " + cf.getArea() );
            cf.subtractFigure();
            System.out.println( "totalArea efter sugtract = " + cf.getArea() );
        }

men jeg tror nu meningen er at  addFigure og subtractFigure metoderne skal have et Figure objekt som parameter, og det er så det det bliver lagt til eller trukket fra.

mvh JakobA
Avatar billede jakoba Nybegynder
22. december 2003 - 04:10 #5
fordi sidste linie i metoden  TestAccount  siger accaouts toString skal køre:
          System.out.println( account1.toString() );
og Accounts tostring siger at actions tostring skal køre:
                s += "\n" + actions.get(n).toString();

mvh JakobA
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