Avatar billede ladbye Nybegynder
01. november 2005 - 16:31 Der er 16 kommentarer og
1 løsning

Problemer med kalender i BlueJ

Hej,

Sidder og er igang med at lave en kalender i programmet BlueJ og er stødt på problemer. Kalender virker indtil videre således at den skifter når man bruger funktionen takeADayOff og virker mht. antal dage og antal måneder, således at den skifter tilbage til januar efter 31. december.

Nu er problemet at jeg skal have implementeret årstal ind i kalenderen, således at årstallet skifter og sådan at der samtidig bliver taget hensyn til om det er skudår - og om der er 28, 29, 30 eller 31 dage i måneden.

Jeg har lavet to classes, som kan ses nedenunder og har indsat koden til at beregne antal dage i måneden og om det er skudår eller ej. Jeg sidder dog fast i den del, hvor jeg skal få metoderne implementeret i hinanden, således at kalender kommer til at fungere mht. årstal osv.

(det er med vilje at jeg ikke får vist årstallet i min print fuktion, ønsker kun dag og måned. Har kun årstallet med til at beregne det korrekte antal dage i måneden)

Håber der er nogen der kan hjælpe mig på vej!

Class "CalenderDisplay"
--------------------------------------
public class CalenderDisplay
{
    private Display day;
    private Display month;
    private Display year;
    private String displayString;
   
    public CalenderDisplay()
    {
        day = new Display(31);
        month = new Display(12);
        year = new Display(0);
        updateDisplay();
    }

    public CalenderDisplay(int days, int months, int years)
    {
        day = new Display(31);
        month = new Display(12);
        year = new Display(0);
        setDate(days, months, years);
    }
   
    public int daysInMonth( int month, int year)
    {
        if( month == 1 || month == 3 || month == 5 ||
            month == 7 || month == 8 || month == 10 ||
            month == 12 )
        {
            return 31;
        }
        else if( month == 4 || month == 6 ||
            month == 9 || month == 11)
        {
            return 30;
        }
        else if ( isLeapYear( year ) )
        {
            return 29;
        }
        else
        {
            return 28;
        }
    }
   
    public boolean isLeapYear( int year )
    {
        if( year % 400 == 0 )
        {
            return true;
        }
        if( year % 100 == 0 )
        {
            return false;
        }if( year % 4 == 0 )
        {
            return true;
        }
            return false;
    }

    public void takeADayOff()
    {
        day.increment();
        if(day.getValue() == 1) {
            month.increment();
            if(month.getValue() == 1 ) {
            year.increment();
            }
        }
        updateDisplay();
    }

    public void setDate(int days, int months, int years)
    {
        day.setValue(days);
        month.setValue(months);
        year.setValue(years);
        updateDisplay();
    }

    public String getDate()
    {
        return displayString;
    }

    private void updateDisplay()
    {
        displayString = day.getDisplayValue() + "/" +
                        month.getDisplayValue();
    }
}

Class "Display"
--------------------------------------
public class Display
{
    private int limit;
    private int value;

    public Display(int maxLimit)
    {
        if((maxLimit >=1) || (maxLimit <=31))
            limit = maxLimit;
            value = 1;
    }

    public int getValue()
    {
        return value;
    }

    public String getDisplayValue()
    {
        if(value < 10)
            return "0" + value;
        else
            return "" + value;
    }

    public void setValue(int replacementValue)
    {
        if((replacementValue >= 1) && (replacementValue <= 31))
            value = replacementValue;
    }

    public void increment()
    {
        if(value < limit)
            value = (value + 1);
        else
            value = 1;
    }
}
Avatar billede arne_v Ekspert
01. november 2005 - 16:44 #1
du er klar over at Java kommer med nogle klasser java.util.Calendar og
java.util.GregorianCalendar som kan alt det ?
Avatar billede arne_v Ekspert
01. november 2005 - 16:52 #2
hvad er det som ikke virker ?

    public static void main(String[] args) {
        CalenderDisplay cd = new CalenderDisplay(31,12,2004);
        cd.updateDisplay();
        System.out.println(cd.getDate());
        cd.takeADayOff();
        cd.updateDisplay();
        System.out.println(cd.getDate());
    }

giver

31/12
01/01

hvilket vel er rigtigt
Avatar billede ladbye Nybegynder
01. november 2005 - 17:02 #3
Kendte ikke til de klasser, men det laves i led med en opgave som vi arbejder på i min udd. og derfor er der visse retningslinjer.

Og ja, den skifter dato - men når den beregner maxlimit for måned, skal den finde ud af hvor mange dage der er i måneden og hvis det er skudår, er det jo anderledes for februar. Det er implementeringen af årstallet der ikke virker.
Avatar billede arne_v Ekspert
01. november 2005 - 17:08 #4
new Display(0)

skal vel være

new Display(9999)

for year
Avatar billede arne_v Ekspert
01. november 2005 - 17:09 #5
if((replacementValue >= 1) && (replacementValue <= 31))

skal vel rettes fra 31 til at bruge limit
Avatar billede arne_v Ekspert
01. november 2005 - 17:10 #6
if((maxLimit >=1) || (maxLimit <=31))

virker men er nok tiltænkt noget andet
Avatar billede ladbye Nybegynder
01. november 2005 - 17:35 #7
Det har du ret i - lige det virker, hvis jeg skriver:

if((replacementValue >= 1) && (replacementValue <= limit))

Før satte den årstallet til 1, hvis jeg skrev tal over 31 i year. Men desværre står jeg stadig med problemet med, at når jeg bestemmer limit skal den tage daysInMonth i betragning og det kan jeg bare ikke få den til.
Avatar billede arne_v Ekspert
01. november 2005 - 17:39 #8
day = new Display(31);

->

day = new Display(daysInMonth(month,year));

måske ?
Avatar billede ladbye Nybegynder
01. november 2005 - 17:43 #9
Hvis jeg prøver at compile den, kommer den med følgende fejl i linjen:

daysInMonth(int,int) in CalenderDisplay cannot be applied to (Display,Display)
Avatar billede arne_v Ekspert
01. november 2005 - 17:45 #10
day = new Display(daysInMonth(month.getValue(),year.getValue()));
Avatar billede ladbye Nybegynder
01. november 2005 - 17:50 #11
CalenderDisplay vil nu godt compiles, men når jeg prøver at oprette et object melder den fejl i den linje - nullpointerexecption.

Er det fordi den ikke når at afvikle daysInMonth før jeg henter info derfra?
Avatar billede arne_v Ekspert
01. november 2005 - 17:53 #12
ja - du skal jo nok sætte year og month inden du sætter day

:-)
Avatar billede ladbye Nybegynder
01. november 2005 - 18:04 #13
Det kunne den godt compile, men den vil stadig ikke rette sig efter det. Hvis jeg f.eks. prøvede med datoen 28/2-2005, kunne jeg gå helt op til 31/2 inden den skiftede til 1/3. Kan ikke se hvorfor den ikke kan finde ud af det med måneden.
Avatar billede arne_v Ekspert
01. november 2005 - 18:29 #14
public CalenderDisplay(int days, int months, int years)
    {
        day = new Display(daysInMonth(months,years));
        month = new Display(12);
        year = new Display(9999);
        setDate(days, months, years);
    }
Avatar billede arne_v Ekspert
01. november 2005 - 18:29 #15
CalenderDisplay cd = new CalenderDisplay(31,12,2004);
        cd.updateDisplay();
        System.out.println(cd.getDate());
        cd.takeADayOff();
        cd.updateDisplay();
        System.out.println(cd.getDate());
        CalenderDisplay cd2 = new CalenderDisplay(28,2,2005);
        cd2.updateDisplay();
        System.out.println(cd2.getDate());
        cd2.takeADayOff();
        cd2.updateDisplay();
        System.out.println(cd2.getDate());

31/12/2004
01/01/2005
28/02/2005
01/03/2005
Avatar billede ladbye Nybegynder
01. november 2005 - 18:51 #16
Det var satans - så virker det sgu'.

Du skal have tak for hjælpen. Hvis du lige ligger et svar, så skal du få dine point.
Avatar billede arne_v Ekspert
01. november 2005 - 19:08 #17
kommer her
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