Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:12 Der er 51 kommentarer og
1 løsning

Hjælp til programmering af skudårskode

Hejsa

Hvordan laver jeg en kode, som hvis tallet er fx. 1400,skal den dividerer med 400 for at finde ud af, om året er et skudår, og hvis det er 2003 skal den bare dividerer med 4? Jeg vil kun have lidt til inspiration, så jeg kan programmerer videre selv. Skal lige siges, at den skal laves i en class, hvor jeg fra en anden class, kan hente den koden.

Man kan lave den med en substring og en if-sætning, så vidt jeg har fundet ud af, men en der kan hjælpe?
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:18 #1
du skal da bruge modulus ( % ) og ikke divider...

er år % 400 == 0 så er det ikke et skudår
er år % 4 == 0 så er det et skudår med mindre ovenstående er sandt.

ved ikke om der er flere regler
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:21 #2
hov, reglen med 400 er vist ikke helt rigtig i mit eksempel men du skal stadig bruge %
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:22 #3
ja, men når jeg mener dividerer, så mener jeg også %... Men jeg skal lave et program, som kan finde ud af, om tallet er et århundrede tal, som kan gøres ved at tjekke, om årstallet har 00 til sidst, men hvordan gør jeg det? :|
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:23 #4
det gør du med % 100 så
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:24 #5
int aar = 2003;

if( aar % 400 == 0 )
  // skudår
else if( aar % 100 == 0 )
  // ikke skudår
else if( aar % 4 == 0 )
  // skudår
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:25 #6
if( aar % 400 == 0 )
  // skudår
else if( aar % 100 == 0 )
  // ikke skudår
else if( aar % 4 == 0 )
  // skudår
else
  // ikke skudår
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:26 #7
er EnEllerAndenvariabel % 400 == 0
er EnEllerAndenvariablen % 4 == 0

men så skal jeg skrive:

public int aarstal(int aar)
{
  er aar % 400 == 0
  er aar % 4 == 0
  return aar;
}

eller hvad?
Avatar billede repsak Nybegynder
25. oktober 2003 - 17:26 #8
ja modulus 4 er korrekt :-)

(2003 % 4 == 0) giver false
(2000 % 4 == 0) giver true
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:27 #9
Okay, tænkte nok det skulle være noget i stil med det der. Tjekker det lige!
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:28 #10
Er testet og virker

int aar = 1904;

if( aar % 400 == 0 )
  System.out.println( "Skudår 400" );
else if( aar % 100 == 0 )
  System.out.println( "Ikke skudår 100" );
else if( aar % 4 == 0 )
  System.out.println( "Skudår 4" );
else
  System.out.println( "Ikke skudår" );
Avatar billede repsak Nybegynder
25. oktober 2003 - 17:32 #11
forstår ikke hvad 400 har med skudår at gøre???
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:33 #12
100 år er ikke skudår med mindre 400 går op i året...derfor er 2000 skudår men 1900 er ikke
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:34 #13
public int skudaar(int aar)
    {
        if( aar % 400 == 0 )
        {
        System.out.println( "Skudår 400" );
        }
        else if( aar % 100 == 0 )
        {
          System.out.println( "Ikke skudår 100" );
          }
        else if( aar % 4 == 0 )
        {
          System.out.println( "Skudår 4" );
        }
        else
          {
          System.out.println( "Ikke skudår" );
          }
      }

med det får jeg fejlen: C:\Programmer\Xinox Software\JCreator LE\MyProjects\Opgave2.java:48: missing return statement      }
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:35 #14
skriv public void istedet for public int
Avatar billede repsak Nybegynder
25. oktober 2003 - 17:35 #15
??? hvorfor er år 1900 ikke et skudår :-S
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:36 #16
nej 1900 er ikke et skudår! riversen: hvorfor publid void?
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:36 #17
ja, det skrev jeg jo lige repsak
Avatar billede repsak Nybegynder
25. oktober 2003 - 17:37 #18
måske

public static boolean skudaar(int aar){
        if( aar % 400 == 0 ) return true;
        else if( aar % 100 == 0 ) rerugn false;
        else if( aar % 4 == 0 ) return true;
        else return false;
      }
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 17:37 #19
Reglen for skudår:
  går 4 op i årstallet er det et skudår, med mindre 100 går op, for
  så er det ikke, med mindre 400 går op, for så er det alligevel
Avatar billede repsak Nybegynder
25. oktober 2003 - 17:38 #20
"100 år er ikke skudår med mindre 400 går op i året...derfor er 2000 skudår men 1900 er ikke"
Det fatter jeg ikke noget af... Hvad er det for en regel? :-)

void betyder at metoden ikke skal returnere noget
Avatar billede repsak Nybegynder
25. oktober 2003 - 17:39 #21
erikjacobsen -> ok, den variant med 100 kendte jeg godt nok ikke
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:40 #22
Nu har jeg lavet den public void, men så fucker det i den class, som jeg skal hente det her kode indtil!
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:42 #23
public class Opgave2kontrol
{
    public static void main(String args[])
    {       
        Opgave2 k = new Opgave2();
        System.out.println("Vi er i aar " + k.skudaar(2003));
        System.out.println("Vi er i maaned " + k.maaned(8));
        System.out.println("Maaned " + k.maaned(8) + " indeholder " + k.dpm(8) + " dage");
        System.out.println("Idag er det den " + k.dage(10) + ". dag i maaned " + k.maaned(8));
        System.out.println("Datoen er: " + k.dage(10) + "/" + k.maaned(8) + "/" + k.skudaar(2003));
    }
}
       
   
er min kode i den anden class
Avatar billede riversen Nybegynder
25. oktober 2003 - 17:45 #24
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 17:46 #25
Du er undskyldt, repsac. Excel plejer at tro at 1900 er et skudår.
Den fejl har været der lige siden den kom frem, og er der vist stadig.
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:47 #26
I stedet for at diskuttere, så hjælp mig :D!
Avatar billede ttn- Nybegynder
25. oktober 2003 - 17:58 #27
Har nu mine to koder:
public class Opgave2
{
    //Laver en public integer
    //Og derinde er der en array
    //Som viser "månedens tal dato"
    public int maaned(int maan)
    {
        int[] MaanedDato = { 0, 01, 02, 03, 04, 05, 06, 07, 8, 9, 10, 11, 12 };
        return MaanedDato[maan];
    }
    //laver igen en public integer
    //Og derinde er der også en array
    //Som viser hvor mange dage
    //Der er på i den pågældende måned
    public int dpm(int mon)
    {
        int[] DagePerMaaneder = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
        return DagePerMaaneder[mon];
    }
    //Laver igen igen en public integer
    //Og derinde er der igen igen(:)) en array
    //Som indeholder de antal dage, som der højst kan være i en måned
    public int dage(int dag)
    {
        int[] AntalDage = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 };
        return AntalDage[dag];
    }
    //En public void, som ser om int aar er et skudaar
    public void skudaar(int aar)
    {
        if( aar % 400 == 0 )
        {
        System.out.println(aar + " er et skudaar!");
        }
        else if( aar % 100 == 0 )
        {
          System.out.println(aar + " er ikke et skudaar!");
          }
        else if( aar % 4 == 0 )
        {
          System.out.println(aar + " er et skudaar!");
        }
        else
          {
          System.out.println(aar + " er ikke et skudaar!");
          }
      }
}


og

public class Opgave2kontrol
{
    public static void main(String args[])
    {       
        Opgave2 k = new Opgave2();
        System.out.println("Vi er i aar " + k.skudaar(2003));
        System.out.println("Vi er i maaned " + k.maaned(8));
        System.out.println("Maaned " + k.maaned(8) + " indeholder " + k.dpm(8) + " dage");
        System.out.println("Idag er det den " + k.dage(10) + ". dag i maaned " + k.maaned(8));
        System.out.println("Datoen er: " + k.dage(10) + "/" + k.maaned(8) + "/" + k.skudaar(2003));
    }
}
       
   
får denne fejl når jeg compiler sidste nævnte:
--------------------Configuration: j2sdk1.4.2_01 <Default>--------------------
C:\Programmer\Xinox Software\JCreator LE\MyProjects\Opgave2kontrol.java:6: 'void' type not allowed here
        System.out.println("Vi er i aar " + k.skudaar(2003));
                                  ^
C:\Programmer\Xinox Software\JCreator LE\MyProjects\Opgave2kontrol.java:10: 'void' type not allowed here
        System.out.println("Datoen er: " + k.dage(10) + "/" + k.maaned(8) + "/" + k.skudaar(2003));
                                                                                  ^
2 errors
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 18:00 #28
System.out.println("Vi er i aar ");
k.skudaar(2003);
Avatar billede ttn- Nybegynder
25. oktober 2003 - 18:03 #29
Thx, nu virker det.

Andet problem:

    public int maaned(int maan)
    {
        int[] MaanedDato = { 0, 01, 02, 03, 04, 05, 06, 07, 8, 9, 10, 11, 12 };
        return MaanedDato[maan];
    }
når jeg skriver 08 og 09, så skriver den at int'en bliver for stor? Hvorfor det og hvad kan jeg gøre ved det?
Avatar billede ttn- Nybegynder
25. oktober 2003 - 18:04 #30
nå ja: Hvordan får jeg den til at udskrive i min anden class, om år 2003 er et skudår?
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 18:06 #31
int[] MaanedDato = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 18:07 #32
Eller

    public String maaned(int maan)
    {
        String[] MaanedDato = { 0, "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" };
        return MaanedDato[maan];
    }
Avatar billede ttn- Nybegynder
25. oktober 2003 - 18:07 #33
jo, men første måned hedder jo rigtigt 01, anden måned 02 osv. derfor skal 8 og 9 hedde 08 og 09!
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 18:07 #34
Faktisk:

String[] MaanedDato = { "", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" };
Avatar billede ttn- Nybegynder
25. oktober 2003 - 18:08 #35
Sådan! Nu udskriver den også, om det er et skudår! Tak!
Avatar billede erikjacobsen Ekspert
25. oktober 2003 - 18:08 #36
Du kan ikke bestemme at en int skal have foranstillede nuller. Det er bare en int.

0777 betyder faktisk tallet 777 i det oktale talsystem (8-talssystemet).
Det er sådan en lidt nørdet ting .... ;)  Da cifferet 8 ikke findes i
8-talssystemet, giver 08 en fejl.
Avatar billede arne_v Ekspert
25. oktober 2003 - 18:12 #37
Et par forklaringer:

julianske kalender - skudår hvis 4 gåt op i
gregorianske kalender - skudår hvis 4 går op i, hvis 100 går op i dog kun hvis 400 går op i

De katolske lande skiftede fra juliansk til gregoriansk i 1582, de
protestantiske lande i 1600 og 1700 tallet. Rusland i 1917.

Tal der starter med 0 opfattes som værende i det oktale tal system.
08 og 09 er derfor ikke valide fordi man tæller ... 06 07 010 011 ... !
Avatar billede arne_v Ekspert
25. oktober 2003 - 18:18 #38
Og jeg formoder at du selv laver alle de berening fordi opgaven
siger at du skal.

Java har klasser til at checke om et år er skudår og den slags.
Avatar billede ttn- Nybegynder
25. oktober 2003 - 23:12 #39
Hvad klasse er det? Jeg er ikke så vild til Java endnu, så er slet ikke inde i alle klasser osv. endnu. Kan du forklare det?
Avatar billede arne_v Ekspert
25. oktober 2003 - 23:32 #40
GregorianCalendar

Eksempel:

import java.util.GregorianCalendar;

public class LeapYear {
    private static GregorianCalendar cal = new GregorianCalendar();
    public static boolean isLeapYear(int y) {
        return cal.isLeapYear(y);
    }
    public static void main(String[] args) {
        System.out.println("1999 leapyear : " + isLeapYear(1999));
        System.out.println("2000 leapyear : " + isLeapYear(2000));
        System.out.println("1900 leapyear : " + isLeapYear(1900));
    }
}
Avatar billede arne_v Ekspert
25. oktober 2003 - 23:33 #41
Men hvis I har fået opgave selv at kode logikken, så er det nok ikke
godt at bruge den.
Avatar billede ttn- Nybegynder
25. oktober 2003 - 23:36 #42
Nej, skal lave det selv, men vil bare lige se. Takker for koden.
Kan du hjælpe mig med, at hvis det er skudår, så skal februar måned plusses med en? Min kode er den samme, som jeg har skrevet før
Avatar billede arne_v Ekspert
25. oktober 2003 - 23:48 #43
Noget i retning af:

public int dpm(int mon, int aar)
    {
        int[] DagePerMaaneder = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
        int res = DagePerMaaneder[mon];
        if((mon == 2) && skudaar(aar)) res++;
        return res;
    }
Avatar billede ttn- Nybegynder
25. oktober 2003 - 23:52 #44
Hey Arne!

Med det får jeg fejlen:
C:\Programmer\Xinox Software\JCreator LE\MyProjects\Opgave2.java:19: 'void' type not allowed here
        if((mon == 2) && skudaar(aar)) res++;
          ^
1 error
Avatar billede arne_v Ekspert
25. oktober 2003 - 23:55 #45
Det er fordi din skudaar metode er void - jeg har forudsat at det var
en boolean.
Avatar billede ttn- Nybegynder
25. oktober 2003 - 23:56 #46
så skal jeg skrive public boolean skudaar ?
Avatar billede arne_v Ekspert
26. oktober 2003 - 00:00 #47
Det synes jeg ville give mening.

Og så lade den returnere om det er et skudår.
Avatar billede arne_v Ekspert
26. oktober 2003 - 00:02 #48
Og the standard Java way:

import java.util.GregorianCalendar;

public class LeapYear {
    private static GregorianCalendar cal = new GregorianCalendar();
    public static boolean isLeapYear(int y) {
        return cal.isLeapYear(y);
    }
    public static int daysPerMonth(int month, int year) {
        cal.set(GregorianCalendar.YEAR, year);
        cal.set(GregorianCalendar.MONTH, month);
        return cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
    }
    public static void main(String[] args) {
        System.out.println("1999 leapyear : " + isLeapYear(1999));
        System.out.println("2000 leapyear : " + isLeapYear(2000));
        System.out.println("1900 leapyear : " + isLeapYear(1900));
        System.out.println("December 1999 days : " + daysPerMonth(GregorianCalendar.DECEMBER, 1999));
        System.out.println("February 2000 days : " + daysPerMonth(GregorianCalendar.FEBRUARY, 2001));
        System.out.println("February 2001 days : " + daysPerMonth(GregorianCalendar.FEBRUARY, 2000));
    }
}
Avatar billede arne_v Ekspert
26. oktober 2003 - 00:03 #49
Og med rettet slag fejl:

import java.util.GregorianCalendar;

public class LeapYear {
    private static GregorianCalendar cal = new GregorianCalendar();
    public static boolean isLeapYear(int y) {
        return cal.isLeapYear(y);
    }
    public static int daysPerMonth(int month, int year) {
        cal.set(GregorianCalendar.YEAR, year);
        cal.set(GregorianCalendar.MONTH, month);
        return cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
    }
    public static void main(String[] args) {
        System.out.println("1999 leapyear : " + isLeapYear(1999));
        System.out.println("2000 leapyear : " + isLeapYear(2000));
        System.out.println("1900 leapyear : " + isLeapYear(1900));
        System.out.println("December 1999 days : " + daysPerMonth(GregorianCalendar.DECEMBER, 1999));
        System.out.println("February 2000 days : " + daysPerMonth(GregorianCalendar.FEBRUARY, 2000));
        System.out.println("February 2001 days : " + daysPerMonth(GregorianCalendar.FEBRUARY, 2001));
    }
}
Avatar billede ttn- Nybegynder
26. oktober 2003 - 00:12 #50
Giv mig venligst et svar, Arne :)
Avatar billede arne_v Ekspert
26. oktober 2003 - 00:14 #51
Det kan jeg godt.

Men glem nu ikke dem der har hjulpet dig med det egentlige problem
(modulus).
Avatar billede ttn- Nybegynder
26. oktober 2003 - 00:18 #52
Nej, men du har hjulpet mig med andre problemer. Takker mange gange.
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