Zweimal Vollmond im Monate

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zweimal Vollmond im Monate

    Hallo, ich muss Planet "A", der sich genau wie die Erde ist. Tage,
    Monate, Schaltjahr sind genauso wie bei uns, die Kalender sind gleich.
    Aber ist der Mond schon etwas schneller und braucht exakt 29 Tage für
    einen Umlauf. Am 1.Januar 2013 sei dort Vollmond. N = ersten N Monate(in
    jeweils einer Zeile) ausigbt, in denen es 2x Vollmond gibt.



    Dies sollte das Ergebnis:

    Aufruf & Ausgabe:

    $ java 2FullMoon 2

    2013, January

    2014, March



    ich habe versucht die tage jeweils getrennt fuer jahre, monate und den

    mondzyklus zu zaehlen. man muss dabei auf schaltjahre bei den jahren

    und beim monat februar achten. ich setze die tagesnummer wieder auf

    1 zurueck, wenn der entsprechende zyklus um ist.



    hierbei muss ich irgendwo fehler gemacht haben. Villeicht kann mir ja einer helfen, dankbar wäre ich jedenfalls dafür.

    Quellcode

    1. public class 2FullMoon {
    2. public static boolean schaltjahr ( int jahr ) {
    3. if ( jahr % 4 == 0 ) {
    4. if ( (jahr % 100 == 0) && (jahr % 400 != 0) ) {
    5. return false;
    6. }
    7. return true;
    8. }
    9. return false;
    10. }
    11. public static void main ( String args [] ) {
    12. int num;
    13. int jahr = 2013;
    14. int d; //day
    15. int dm = 1; //Tage Monate
    16. int vm = 0; //vollmond
    17. int mon; //Monate
    18. int m; //
    19. int dy = 1; // tag-Jahr
    20. int n; //Anzahl der Vollmonde in einem Monat
    21. num = 2;
    22. for ( d = 1 , m = 0, mon = 1, n = 0; true; d++, dm++, dy++) { //Schaltjahr
    23. if ( (dy > 1) && (dy % 365 == 1) && ! schaltjahr( jahr ) ) {
    24. jahr++;
    25. dy = 1;
    26. }
    27. if ( (dy > 1) && (dy % 366 == 1) && schaltjahr( jahr ) ) { //keine Schaltjahr
    28. jahr++;
    29. dy = 1;
    30. }
    31. if ( (dm > 1) && (dm == 32) ) {
    32. switch ( mon ) {
    33. case 1: //January 31.
    34. case 3: //March 31.
    35. case 5: //May 31.
    36. case 7: //July 31.
    37. case 8: //August 31.
    38. case 10: //October 31.
    39. mon ++;
    40. break;
    41. case 12: //December 31.
    42. mon = 1;
    43. dm =1;
    44. break;
    45. }
    46. }
    47. if ( (dm > 1) && (dm == 31) ) {
    48. switch ( mon ) {
    49. case 4: //April 30.
    50. case 6: //June 30.
    51. case 9: //September 30.
    52. case 11: //November 30.
    53. mon ++;
    54. dm =1;
    55. break;
    56. }
    57. }
    58. if ( (dm > 1) && (dm % 28 == 1) && (mon == 2) && ! schaltjahr( jahr ) ) {
    59. mon ++; //Schaltjahr
    60. }
    61. if ( (dm > 1) && (dm % 29 == 1) && (mon == 2) && schaltjahr( jahr ) ) {
    62. mon ++; //keine Schaltjahr
    63. }
    64. if ( d % 29 == 1 ) {
    65. vm ++;
    66. if ( m == mon ) {
    67. n ++;
    68. if ( n <= num ) {
    69. System.out.print( jahr );
    70. switch ( mon ) {
    71. case 1:
    72. System.out.println( ", Januar" );
    73. break;
    74. case 2:
    75. System.out.println( ", Februar" );
    76. break;
    77. case 3:
    78. System.out.println( ", Maerz" );
    79. break;
    80. case 4:
    81. System.out.println( ", April" );
    82. break;
    83. case 5:
    84. System.out.println( ", Mai" );
    85. break;
    86. case 6:
    87. System.out.println( ", Juni" );
    88. break;
    89. case 7:
    90. System.out.println( ", Juli" );
    91. break;
    92. case 8:
    93. System.out.println( ", August" );
    94. break;
    95. case 9:
    96. System.out.println( ", September" );
    97. break;
    98. case 10:
    99. System.out.println( ", Oktober" );
    100. break;
    101. case 11:
    102. System.out.println( ", November" );
    103. break;
    104. case 12:
    105. System.out.println( ", Dezember" );
    106. break;
    107. }
    108. }
    109. }
    110. m = mon;
    111. } // end for
    112. } // End of main
    113. } // End of class
    114. }
    Alles anzeigen
  • Warum nutzt du nicht die Klasse GregorianCalendar? Die ist bei Java mit dabei und nimmt die den ganzen Monats- und Schaltjahrkram ab.
    docs.oracle.com/javase/6/docs/…il/GregorianCalendar.html
    Hier eine deutsche Beschreibung:
    openbook.galileocomputing.de/j…4013d1faae60bd2e671a3ef7d

    Pass bei den Zahlen auf. Den MONTH gibt man von 0-11 an während DAY_OF_WEEK 1-7 als Werte nimmt. Also immer schön in die Doku schauen.
  • Quellcode

    1. import java.text.SimpleDateFormat;
    2. import java.util.Calendar;
    3. public class 2malVollMond
    4. {
    5. public static void main(String[] args) {
    6. Calendar cal = Calendar.getInstance();
    7. cal.set(2013, 0, 1);
    8. SimpleDateFormat format = new SimpleDateFormat("yyyy, MMMMM");
    9. while((cal.get(Calendar.YEAR)) < 2020){
    10. int today = cal.get(Calendar.DATE);
    11. int maxmonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    12. if (maxmonth - today - 29 >=0){
    13. System.out.println(format.format(cal.getTime()));
    14. }
    15. // System.out.println("today: " + today + " maxmonth: " + maxmonth + "\t " + cal.getTime());
    16. cal.add(Calendar.DAY_OF_MONTH, +29);
    17. }
    18. }
    19. }
    Alles anzeigen

    run:
    2013, Januar
    2014, Oktober
    2016, Juni
    2018, Januar
    2018, März
    2019, Oktober


    Meine Aufgabestellung
    Das ERgebnis soll raus kommen:
    2013, Januar
    2014, Maerz
    ...
    ...
    hmm...
  • Quellcode

    1. Calendar cal = Calendar.getInstance();
    2. cal.clear();
    3. // Stunden, Minuten, Sekunden und Millisekunden auf 0
    4. cal.set(2013, 0, 1);
    5. SimpleDateFormat format = new SimpleDateFormat("yyyy, MMMMM");
    6. while(cal.get(Calendar.YEAR) < 2020) {
    7. Date oldDate = cal.getTime();
    8. Date newDate = new Date(oldDate.getTime()+2505600000L);
    9. // Gib einfach "29 Tage in Millisekunden" bei Google ein. Das L hinten macht einen long-Wert anstatt nur int.
    10. Calendar newCal = Calendar.getInstance();
    11. // Einfach eine zweite Instanz für den nächsten Mond
    12. newCal.setTime(newDate);
    13. if (cal.get(Calendar.MONTH) == newCal.get(Calendar.MONTH)) {
    14. System.out.println(format.format(cal.getTime()));
    15. }
    16. cal = newCal;
    17. }
    Alles anzeigen


    Ungetestet. Schau mal ob es dich weiter bringt.

    Edit:
    Wenn du mit getTimeInMillis() und setTimeInMillis() arbeitest, kannst du dir die Date()-Objekte sparen.