Avatar billede viciodk Praktikant
30. november 2003 - 08:45 Der er 15 kommentarer og
1 løsning

Java-kalender

Jeg prøver at lave et program med min egen algoritne til at undersøge hvilken ugedag en bestemt dato er. Men jeg får nogle fejl med denne kode:

Gregor.java
-----------

class Gregor
{
    int year;
    int month;
    int day;

    Gregor(int year, int month, int day)
    {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    final int[][] monthLengths = {{31,28,31,30,31,30,31,31,30,31,30,31},
                                      {31,29,31,30,31,30,31,31,30,31,30,31}};

    while(year > 400)
    {
        year -= 400;
    }

    int leapYear(int year)
    {
        int leapYear = 0;

        if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
        {
            leapYear = 1;
        }

        return leapYear;
    }

    int daysSince1_jan_0(int year, int month, int day)
    {
        int days_PrevYears = 0; // ikke lavet endnu
        int days_PrevMonths = 0;

        for(int j = 0; j < month-1; j++)
        {
            days_PrevMonths += monthLengths[1][j];
        }

        int days = day + days_PrevMonths + days_PrevYears;

        return days;
    }

    static public String dayOfWeek(int year, int month, int day) //throws Exception (ikke lavet endnu)
    {
        String[] weekDays = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

        return (weekDays[daysSince1_jan_0(int year, int month, int day) % 7]);
    }
}




GregorTest.java
---------------

class GregorTest
{
    public static void main(String[] args)
    {
        Gregor gregor = new Gregor(1,1,1);
        System.out.println(gregor.dayOfWeek(2003,11,25));
        System.out.println(gregor.dayOfWeek(2003,11,26));
    }
}



Jeg får fejlen:
---------------

C:\Documents and Settings\Administrator\Skrivebord>javac GregorTest.java
.\Gregor.java:17: illegal start of type
        while(year > 400)
        ^
.\Gregor.java:55: <identifier> expected
}
^
GregorTest.java:6: cannot resolve symbol
symbol  : method dayOfWeek (int,int,int)
location: class Gregor
                System.out.println(gregor.dayOfWeek(2003,11,25));
                                        ^
GregorTest.java:7: cannot resolve symbol
symbol  : method dayOfWeek (int,int,int)
location: class Gregor
                System.out.println(gregor.dayOfWeek(2003,11,26));
                                        ^
4 errors


Udover forslag til hvad der kan være galt vil jeg også gerne høre hvordan min GregorTest helt præcis skal se ud. Jeg forstår ikke helt hvorfor man skal skrive:
Gregor gregor = new Gregor(1,1,1);
.. og først derefter kan få fat i de metoder der ligger i Gregor-klassen.
Avatar billede erikjacobsen Ekspert
30. november 2003 - 09:07 #1
Du skal ændre

Gregor(int year, int month, int day)
    {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    final int[][] monthLengths = {{31,28,31,30,31,30,31,31,30,31,30,31},
                                      {31,29,31,30,31,30,31,31,30,31,30,31}};

    while(year > 400)
    {
        year -= 400;
    }

til

Gregor(int year, int month, int day)
    {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    final int[][] monthLengths = {{31,28,31,30,31,30,31,31,30,31,30,31},
                                      {31,29,31,30,31,30,31,31,30,31,30,31};

    while(year > 400)
    {
        year -= 400;
    }
}

Jeg har flyttet en højrekrølleparentes.
Avatar billede erikjacobsen Ekspert
30. november 2003 - 09:10 #2
Vrøvl Erik .. det er vist for tidligt på dagen.

Det er bare din while-løkke: hvor skal den være henne? I konstruktoren?
Men det er ikke nogen god idé.

Når du har ikke-statiske metoder skal du oprette et objekt for at kunne
få adgang til metoderne.
Avatar billede viciodk Praktikant
30. november 2003 - 10:02 #3
Den eneste metode i Gregor.java som jeg skal bruge i GregorTest.java er static public String dayOfWeek(int year, int month, int day)

De andre skal kun eksistere inden i Gregor.java, så de skal vel ikke være statiske?

Jeg er også selv lidt i tvivl om jeg har placeret while-løkken rigtigt. Den skal bare undersøge om årstallet er større end 400, for hvis den 1. januar år 1 er en mandag, så er den 1. januar i årene 401, 801, 1201 .. også mandage. Hvor synes du jeg skal placere while-løkken. Havde også selv tænkt på at placere den i constuctoren, men det er måske ikke nogen god ide?
Avatar billede arne_v Ekspert
30. november 2003 - 10:11 #4
Erik har ret i at compile fejlen skyldes at du kalder en ikek static metode
(daysSince1_jan_0) far en static metode (dayOfWeek).

Men du mangler vel noget i din algoritme !?!?

Du antager at dayinyear % 7 kan bruges til at udregne ugenemmer med.

Det kan det ikke !

Fordi året starter ikke altid med et ugeskift.
Avatar billede viciodk Praktikant
30. november 2003 - 10:25 #5
arne_v -> Min algoritme skal virke på den måde at den optæller antallet af dage siden den 1. januar år 1 (ja okay, metoden skulle ikke have heddet daysSince1_jan_0, men i stedet daysSince1_jan_1). Hvis dette tal % 7 giver 1 må det være en mandag (idet 1. januar i år 1 var en mandag), 2 giver en tirsdag osv. (jeg har endnu ikke skrevet den del af programmet der optæller antallet tidligere års antal dage, men det gør jeg når jeg lige har fået afskaffet fejlene).
Avatar billede viciodk Praktikant
30. november 2003 - 10:30 #6
Det fjernede to fejl at gøre de andre metoder statiske. :)

Hvordan skal jeg skrive while-løkken? Skal den også pakkes statisk ind på en eller anden måde, så den kan køres direkte?
Avatar billede arne_v Ekspert
30. november 2003 - 10:33 #7
Avatar billede viciodk Praktikant
30. november 2003 - 10:51 #8
arne_v -> Den algoritme får jeg nok lidt svært ved at forsvare for min lærer, ellers tak :)
Avatar billede arne_v Ekspert
30. november 2003 - 11:04 #9
Så må du vel have langt en løkke ind i daysSince1_jan_1 hvor du tæller
days_PrevYears op (+365 hvis ikke skud år, +366 hvis skudår).
Avatar billede viciodk Praktikant
30. november 2003 - 11:09 #10
Jeps, det er det jeg skal bruge leapYear() og monthLengths[][] til. :)

Problemet er bare at jeg har nogle fejl som gerne vil af med først:

C:\Documents and Settings\Administrator\Skrivebord>javac GregorTest.java
.\Gregor.java:17: illegal start of type
        while(year > 400)
        ^
.\Gregor.java:55: <identifier> expected
}
^
GregorTest.java:6: cannot resolve symbol
symbol  : method dayOfWeek (int,int,int)
location: class Gregor
                System.out.println(gregor.dayOfWeek(2003,11,25));
                                        ^
GregorTest.java:7: cannot resolve symbol
symbol  : method dayOfWeek (int,int,int)
location: class Gregor
                System.out.println(gregor.dayOfWeek(2003,11,26));
                                        ^
4 errors
Avatar billede arne_v Ekspert
30. november 2003 - 11:24 #11
Den første fejl skyldes at du har lavet while løkken udenfor en metode.
Avatar billede arne_v Ekspert
30. november 2003 - 11:25 #12
Og den anden fejl skylde den første fejl.

Løkken skal ind i daysSince1_jan_1 metoden.

Og måske ændres lidt.
Avatar billede arne_v Ekspert
11. december 2003 - 21:00 #13
Lukke tid ?
Avatar billede arne_v Ekspert
26. december 2003 - 16:57 #14
??
Avatar billede viciodk Praktikant
28. december 2003 - 23:26 #15
Jeps :) Smid et svar. Tak for hjælpen
Avatar billede arne_v Ekspert
28. december 2003 - 23:37 #16
svar
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