Avatar billede machholdt Nybegynder
26. april 2010 - 20:16 Der er 5 kommentarer og
1 løsning

Vedr. opgave i bog: Java - How to program, omkring alder ud fra kalender.

Hej eksperter..

Er løbet ind i nogle problemer som jeg ikke kan hitte ud af.

Mit program skal kunne beregne en maxpuls, samt det bedste træningspuls-interval ud fra alder. Alder givet ud fra 3 parametre, dag/måned/år. Indtastet separat i hver sit indtastningsvindue.

Jeg benytter så et testprogram hvor alle inputs'ne kommer fra. Det er umiddelbart ikke det der er problemet.

Problemet med programmet er at den ikke regner alderen ud. Og dermed regner den heller ikke alle de andre ting ud.

Håber på lidt hints, da jeg ikke har arbejdet med calendar "princippet" før i java.

På forhånd tak.


package JAVA.HTP8E;
import java.util.*;

public class HeartRates
{
        private String firstName1;
        private String lastName1;
        private int dayOfBirth1;
        private int monthOfBirth1;
        private int yearOfBirth1;
        private int age;
        private int maxHeart;
        private int lowerTargetHeart;
        private int upperTargetHeart;

// sout+tab = system.out.println("");
        public HeartRates ( String firstName2, String lastName2, int dayOfBirth2, int monthOfBirth2, int yearOfBirth2, int age2, int maxHeart2,
                int lowerTargetHeart2, int upperTargetHeart2  )
    {
        firstName1 = firstName2;
        lastName1 = lastName2;
        dayOfBirth1 = dayOfBirth2;
        monthOfBirth1 = monthOfBirth2;
        yearOfBirth1 = yearOfBirth2;
        age = age2;
        maxHeart = maxHeart2;
        lowerTargetHeart = lowerTargetHeart2;
        upperTargetHeart = upperTargetHeart2;
    }
//Fornavnet
        public void setFirstName( String fName)
    {
        firstName1 = fName;
    }
        public String getFirstName()
    {
        return firstName1;
    }
//Efternavnet
        public void setLastName( String lName)
    {
        lastName1 = lName;
    }
        public String getLastName()
    {
        return lastName1;
    }

//Fødselsdagen
        public void setDayOfBirth( int dob)
    {
            if (dob <= 0)
            {
                System.out.println("Wrong input, result may not be right.");
            }
            else
            dob = dayOfBirth1;
    }

        public int getDayOfBirth()
    {
        return dayOfBirth1;
    }
            public void setMonthOfBirth( int mob)
    {
            if (mob <= 0)
            {
                System.out.println("Wrong input, result may not be right.");
            }
            else
            mob = monthOfBirth1;
    }

        public int getMonthOfBirth()
    {
        return monthOfBirth1;
    }
            public void setYearOfBirth( int yob)
    {
            if (yob <= 0)
            {
                System.out.println("Wrong input, result may not be right.");
            }
            else
            yob = yearOfBirth1;
    }

        public int getYearOfBirth()
    {
        return yearOfBirth1;
    }
// Alderberegning

        public void setAge()
        {
            Calendar cal = new GregorianCalendar(yearOfBirth1, monthOfBirth1, dayOfBirth1);
            Calendar now = new GregorianCalendar();
            age = now.get(Calendar.YEAR) - cal.get(Calendar.YEAR);
            if((cal.get(Calendar.MONTH) > now.get(Calendar.MONTH))
            || (cal.get(Calendar.MONTH) == now.get(Calendar.MONTH)
            && cal.get(Calendar.DAY_OF_MONTH) > now.get(Calendar.DAY_OF_MONTH)))
            {
            age--;
            }
        }
        public int getAge()
        {
            return age;
        }
// Heart rate calculating.
        public int getMaxHeart()
        {
            maxHeart = (220-age);
            return maxHeart;
        }

        public int getLowerTargetHeartrate()
        {
            lowerTargetHeart = (int) (maxHeart * 0.5);
            return lowerTargetHeart;
        }
        public int getUpperTargetHeartrate()
        {
            upperTargetHeart = (int) (maxHeart * 0.85);
            return upperTargetHeart;
        }

// Vis beskeden
        public void displayMessage()
    {
        System.out.printf( "Name: %s %s\nAge: %s\nMaximum heartrate: %s\nTarget heartrate is between: %s - %s.\n\n",
                getFirstName(),getLastName(), getAge(), getMaxHeart(), getLowerTargetHeartrate(), getUpperTargetHeartrate()  );
    }
}
Avatar billede arne_v Ekspert
27. april 2010 - 03:24 #1
Det er meget svært at sige udfra den del af koden vi kan se.

Der er ikke noget main og setAge bliver ikke kaldt i den.
Avatar billede machholdt Nybegynder
27. april 2010 - 06:43 #2
OK. Testprogrammet kommer herunder:


package JAVA.HTP8E;

import javax.swing.JOptionPane;

public class HeartRatesTest
{
    public static void main( String args[] )
    {
        HeartRates medlem1 = new HeartRates ( "Claus", "Macoldt", 12, 10, 1982, 27, 193,
                0, 0 );

        medlem1.displayMessage();

        HeartRates medlem2 = new HeartRates ( "", "", 0, 0, 0, 0, 0, 0, 0 );

        String fnavn2 = JOptionPane.showInputDialog("Indtast fornavn på medlem ");
        String enavn2 = JOptionPane.showInputDialog("Indtast efternavn på medlem ");
        String dag2 = JOptionPane.showInputDialog("Indtast dato for fødselsdag ");
        String måned2 = JOptionPane.showInputDialog("Indtast måned for fødselsdag ");
        String år2 = JOptionPane.showInputDialog("Indtast år for fødselsdag ");

        int dag22 = Integer.parseInt( dag2 );
        int måned22 = Integer.parseInt( måned2 );
        int år22 = Integer.parseInt( år2 );

        medlem2.setFirstName(fnavn2);
        medlem2.setLastName(enavn2);
        medlem2.setDayOfBirth(dag22);
        medlem2.setMonthOfBirth(måned22);
        medlem2.setYearOfBirth(år22);
        medlem2.getAge();
       

        medlem2.displayMessage();


    }
}
Avatar billede odsgaard Praktikant
27. april 2010 - 09:14 #3
Hvis du kigger på dine setter-metoder i HeartRates-klassen vil du se, at du tildeler værdien forkert:

Du skriver:
public void setYearOfBirth( int yob)
{
yob = yearOfBirth1;
}

Hvilket betyder, at du tildeler parameteren værdien for yearOfBirth1 (som er 0).

Det rigtige er at skrive:
 
  yearOfBirth1 = yob;

Så virker det, hvis du husker at kalde setAge() fra din testklasse

/Brian
Avatar billede machholdt Nybegynder
27. april 2010 - 13:10 #4
Hold da op.

Nu virker det helt fint.

Dum fejl med tildeling af parameter værdien.

Og ja havde så heller ikke kaldet set.Age men istedet get.Age

Mange tak for hjælpen og læg svar for point.
Avatar billede arne_v Ekspert
27. april 2010 - 21:42 #5
Der er enkelte som foretraekker at erklaere en saadan setter som:

public void setYearOfBirth(final int yob)

Jeg synes generelt ikke om konstruktionen, men den havde fanget denne fejl.

Ioevrigt hvis du bruger en moderne IDE, saa kan du lade den generere getters og setters.

Jeg formoder at odsgaard smider et svar.
Avatar billede odsgaard Praktikant
28. april 2010 - 03:32 #6
Hej

De 'dumme' fejl kan nemt være dem der er sværest af finde :)

Hermed et svar :)

/Brian
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