Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Sonntage (Schleifen)

Die folgenden Informationen sind gegeben:

- Der 1 Januar 1900 war ein Montag

- 30 Tage haben folgende Monate:

September, April, Juni und November.

Die restlichen Monate haben 31 Tage, abgesehen

von Februar, welcher 28 Tage und beim Schaltjahr 29 Tage hat.

Wieviele Sonntage fallen auf den ersten des Monats zwischen 1900 und 2000 auf(1 Jan 1901 bis 31 Dez. 2000)?

1 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (1)

Oshgnacknak 21. Juli 2018 19:18   reply report
Ist da nicht ein Unterschied zwischem 'zwischen 1900 und 2000' und '(1 Jan 1901 bis 31 Dez. 2000)'? Kann einer mal die richte anzahl (oder wenigsten einen hascode dieser) an Sonntagen angeben?

13 Lösung(en)

#include <stdio.h>
#include <stdlib.h>

#define true 1==1
#define false !true


int day(int month, int year){

        int x, y, c;

        switch(month) {
                case 1:
                case 5:
                        x = 0; break;
                case 8:
                        x = 1; break;
                case 3:
                case 11:
                        x = 2; break;
                case 6:
                case 2:
                        x = 3; break;
                case 9:
                case 12:
                        x = 4; break;
                case 4:
                case 7:
                        x = 5; break;
                case 10:
                        x = 6; break;
        }

        y = month == 1 || month == 2 ? (year + 99) % 100 : year % 100;
        c = month != 1 && month != 2 ? year / 100 : (year % 100 == 0 ? year / 100 - 1 : year/100);

        return (1 + x + y + y/4 + c/4 -2*c) % 7;
}

int main(int argc, char *argv[]){

        int count = 0;

        for (int j=1901; j<=2000; j++){
                for (int m=1; m<=12; m++){
                        if(day(m, j) == 0){
                                printf("01.%02d.%d\n", m, j);
                                count++;
                        }
                }
        }

        printf("%d Sonntage fallen auf den ersten des Monats zwischen 01.01.1901 und 31.12.2000\n", count);

        return 0;
}
                

Lösung von: André Trobisch ()

import datetime

def sonntage_1901_2001():
    sonntage = 0
    for jahr in range(1901, 2001):
        for monat in range(1, 13):
            tag = datetime.date(jahr, monat, 1)
            if tag.weekday() == 6:
                sonntage += 1
    return sonntage   

print(sonntage_1901_2001()) --> 171
                

Lösung von: Houssein Fofana ()

'15.3.2017 - PowerBASIC 10

''mit Schleifen seit 1.1.1900 anstelle von integrierten Datumsfunktionen...


#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG

    DIM zwDatum AS STRING
    DIM zwJahr AS INTEGER
    DIM zwMonat AS INTEGER
    DIM zwTag AS INTEGER
    DIM i AS LONG
    DIM Sonntage AS INTEGER

    zwTag = 1
    zwMonat = 1
    zwJahr = 1900
    Sonntage = 0
    i = 1

    DIM Schaltjahr AS INTEGER

    DO UNTIL zwDatum = "20001231"
        INCR i

        'Jahre durchgehen
        INCR zwTag
                IF zwTag > DaysInMonth (zwMonat, zwJahr) THEN
                INCR zwMonat
                zwTag = 1
                IF zwMonat = 13 THEN
                    INCR zwJahr
                    zwMonat = 1
                END IF
        END IF

        zwDatum = FORMAT$(zwJahr) & FORMAT$(zwMonat,"00") & FORMAT$(zwTag,"00")

        'Sonntage am 1. des Monats seit 01.01.1901
        IF zwJahr > 1900 AND _
           zwTag = 1 AND _
          i MOD 7 = 0 _
          THEN INCR Sonntage

    LOOP

    MSGBOX STR$(Sonntage) & " Sonntage",,EXE.NAME$

END FUNCTION

'-----------------------------------------

FUNCTION DaysInMonth(D_Month AS INTEGER, Year AS INTEGER) AS INTEGER

   LOCAL Days AS INTEGER

   SELECT CASE D_Month
      CASE 1, 3, 5, 7, 8, 10, 12
         Days = 31
      CASE 4, 6, 9, 11
         Days = 30
      CASE 2
         Days = 28
         IF Year MOD 4 = 0 THEN
            IF Year MOD 100 = 0 THEN
               IF Year MOD 400 = 0 THEN Days = 29
            ELSE
               Days = 29
            END IF
         END IF
   END SELECT
   FUNCTION = Days

END FUNCTION

                

Lösung von: Markus Sägesser (keine)

package Aufgaben.Sonntage;

public class Sundays {

	public static void main(String[] args) 
	{
		// Zählvariable für Wochentage, Steuervariable für eine Schleife und Zählvariable für Anzahl Sonntage
		int wochentag = 0, tagmodifier = 0, anzahlSonntage = 0;
		
		// iteriere über alle Jahre zwischen 1900 und 2000
		for(int jahr = 1900; jahr < 2000; jahr++)
		{
			// iteriere über alle Monate des jeweiligen Jahres
			for(int monat = 0; monat < 12; monat++)
			{
				// setze die Steuervariable zur Anpassung der Tage im Monat für die innere Schleife, basierend auf dem aktuellen Monat
				switch (monat)
				{
				//30-tägige Monate: April, Juni, September und November
				case 3: 
				case 5:
				case 8:
				case 10: tagmodifier = 1; break;
				
				//Februar: 29 Tage im Schaltjahr, 28 sonst
				case 1: tagmodifier = (jahr % 4 == 0) ? 2: 3; break;
				
				// alle anderen Monate: modifier zurücksetzen
				default: tagmodifier = 0; break;
				}
				
				// iteriere über alle Tage des aktuellen Monats
				for(int tag = 0; tag < 31-tagmodifier; tag++ )
				{					
					// wenn der Wochentag ein Sonntag ist und der Tag der erste des Monats ist... 
					if(wochentag % 7 == 6 && tag == 0)
					{
						//...zähle einen Sonntag drauf
						anzahlSonntage++;
					}
					// zähle den Wochentag für die nächste Iteration der inneren Schleife hoch
					wochentag++;
				}
			}
			
			
		}

		System.out.println("Anzahl Sonntage zwischen 1. Januar 1900 und 31. Dezember 2000: " + anzahlSonntage);
	}

}

                

Lösung von: Name nicht veröffentlicht

'28.05.2017 - Powerbasic 10

'Mir war langweilig, daher noch Version 2 mit integrierten Datumsfunktionen

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG

    DIM Jahr AS INTEGER
    DIM Monat AS INTEGER
    DIM Pruef AS IPOWERTIME
    LET Pruef = CLASS "PowerTime"
    DIM Sonntage AS INTEGER


    FOR Jahr = 1901 TO 2000
        FOR Monat = 1 TO 12
            Pruef.NewDate(Jahr, Monat, 1)
            IF Pruef.DayOfWeek = 0  THEN INCR Sonntage
        NEXT Monat
    NEXT Jahr

    MSGBOX STR$(Sonntage) & " Sonntage",,EXE.NAME$

END FUNCTION

                

Lösung von: Markus Sägesser (keine)

using System;

namespace Sonntage
{
    class Program
    {
        static void Main()
        {
            int amountOfRequestedSundays = 0;

            // Define range. (Single line initialization is also possible.)
            DateTime startDate = new DateTime(1901, 01, 01);
            DateTime endDate = new DateTime(2000, 12, 31);
            
            // Iterate through timespan.
            while (startDate <= endDate)
            {
                // Check for first of month and day of week.
                if (startDate.Day == 1 && startDate.DayOfWeek == DayOfWeek.Sunday)
                {
                    // Increase counter if we have a hit.
                    amountOfRequestedSundays++;
                }

                // Go to the next day.
                startDate = startDate.AddDays(1);
            }

            Console.WriteLine("Anzahl der Sonntage: {0}", amountOfRequestedSundays);
            // 171
        }
    }
}
                

Lösung von: Manu Fx ()

'23.02.2018 - Powerbasic 10

''Die Sonntage beschäftigen mich mal immer wieder - diese Lösung benutzt Zellers Kongruenz zur Berechnung der Wochentage


#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG

    DIM Jahr AS INTEGER
    DIM Monat AS INTEGER
    DIM Sonntage AS INTEGER


    FOR Jahr = 1901 TO 2000
        FOR Monat = 1 TO 12
            IF gregZeller(Jahr, Monat, 1) = 6 THEN INCR Sonntage
        NEXT Monat
    NEXT Jahr


    MSGBOX STR$(Sonntage) & " Sonntage",,EXE.NAME$

END FUNCTION

'--------------------------------------------------
FUNCTION gregZeller(BYVAL y AS INTEGER, BYVAL m AS INTEGER, BYVAL d AS INTEGER) AS INTEGER
' gibt 0 für Mon bis 6 für Son zurück

IF m < 3 THEN
    INCR m
    INCR d
    DECR y
END IF

FUNCTION = ((13*m+3)\5+d+y+y\4-y\100+y\400) MOD 7    '-> "\" anstelle von "/" -> Ganzzahldivision

END FUNCTION          
                

Lösung von: Markus Sägesser (keine)


def isLeapYear(year):
	if not (year % 400 or year % 100 or year % 4):
		return True
	if not (year % 4 or year % 100):
		return False
	if not year % 4:
		return True
	return False

monthsWith30 = {9, 4, 6, 11}

sundays = 0

day = 1
weekday = 0

month = 1

year = 1900

while True:
	if month == 12 and day == 31:
		year += 1
		if year == 2001:
			break

	if month == 2:
		if isLeapYear(year):
			monthLenght = 29
		else:
			monthLenght = 28
	elif month in monthsWith30:
		monthLenght = 30
	else:
		monthLenght = 31

	if day > monthLenght:
		day = 0
		month = 1 + (month % 12)

	print (f"{day:02}:{month:02}:{year:04}, {weekday}")

	if weekday == 6 and day == 1:
		sundays += 1

	day += 1
	weekday = (weekday + 1) % 7


print (sundays)
                

Lösung von: Osh Gnacknak ()

let sundays = 0;

for (let y = 1900; y < 2000; y++)
  for (let m = 0; m < 11; m++)
    if (new Date(y, m, 1).getDay() == 0) sundays++;

console.log(sundays);
                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

// NET Core 3.x; C# 8.x

using System;

namespace CS_Aufgabe_Sonntage
{
    class Program
    {
        static void Main(string[] args)
        {
            var sDate = new DateTime(1901, 01, 01);
            var eDate = new DateTime(2000, 12, 31);
            var counter = 0;

            // erster Sonntag ab Startdatum => schnellere Schleife (Faktor 6)
            var fDate = sDate.AddDays(7 * (Math.Sign((int)sDate.DayOfWeek) - 1) - (int)sDate.DayOfWeek);

            while (fDate < eDate)
            {
                if (fDate.Day == 1) counter++;
                fDate = fDate.AddDays(7);
            }

            Console.WriteLine($"Anzahl Sonntage: {counter}");
        }
    }
}
                

Lösung von: Jens Kelm (@JKooP)

// C++ 20
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;

auto get_sundays_on_first(date begin, date end) {
    const auto sgn = []<typename T>(T val) { return (T(0) < val) - (val < T(0)); }; // C++ 20!
    auto counter{ 0 };
    constexpr days add_seven{ 7 };
    const days first_day{ 7 * (sgn(begin.day_of_week().as_number()) - 1) - begin.day_of_week().as_number() };
    begin += first_day;

    while (begin < end) {
        if (begin.day() == 1) counter++;
        begin += add_seven;
    }
    return counter;
}

int main() {
    const auto s{ get_sundays_on_first({1901, 1, 1}, {2000, 12, 31}) };
    std::cout << "Anzahl Sonntage: " << s << "\n";
}
                

Lösung von: Jens Kelm (@JKooP)

// C++ 20 | VS-2022

#include <iostream>
#include <chrono>
#include <format>

using namespace std::chrono;
using ymwd = year_month_weekday;
using ymd = year_month_day;

constexpr auto get_sundays_1st(const ymd& begin_, const ymd& end_) {
    const ymwd ymwd_begin{ Sunday[1] / begin_.month() / begin_.year() };
    const auto sd_end{ sys_days{ end_} };
    auto sd_begin = sys_days{ ymwd_begin };
    std::vector<ymd>out;

    while (sd_begin <= sd_end) {
        ymd ymd_date{ sd_begin };
        if (ymd_date.day() == day{ 1 })
            out.push_back(ymd_date);
        sd_begin += days(7);
    }
    return out;
}

const auto& operator<<(std::ostream& os_, const ymd& ymd_) {
    static auto i{ 0 };
    os_ << std::format("{:02}: {}, {}.{:02}.{}\n",
        ++i, ymwd{ ymd_ }.weekday(), ymd_.day(), unsigned(ymd_.month()), ymd_.year());
    return os_;
}

int main() {
    constexpr ymd begin{ 2018y / 1 / 1 };
    constexpr ymd end{ 2023y / 12 / 31 };
    const auto sundays{ get_sundays_1st(begin, end) };
    std::cout << std::format("Anzahl Sonntage: {}\n", sundays.size());
    for (const auto& sunday : sundays)
        std::cout << sunday;
}
                

Lösung von: Jens Kelm (@JKooP)

// C++ 20 | VS-2022
// extrem schnell, da nur die 1. Sonntage im Monat geprüft werden

#include <iostream>
#include <chrono>
#include <format>

using namespace std::chrono;
using ymd = year_month_day;
using ymwd = year_month_weekday;

struct span {
    int begin, end;
};

constexpr auto get_sundays_1st(const span& span_) {
    std::vector<ymd>out;
    for (auto y{ span_.begin }; y <= span_.end; ++y) {
        for (auto m{ 1 }; m <= 12; ++m) {
            const ymwd ymwd_date{ Sunday[1] / m / y };
            const ymd ymd_date{ ymwd_date };
            if (ymd_date.day() == day{ 1 })
                out.push_back(ymd_date);
        }
    }
    return out;
}

const auto& operator<<(std::ostream& os_, const ymd& ymd_) {
    static auto i{ 0 };
    os_ << std::format("{:02}: {}, {}.{:02}.{}\n",
        ++i, ymwd{ ymd_ }.weekday(), ymd_.day(), unsigned(ymd_.month()), ymd_.year());
    return os_;
}

int main() {
    constexpr span sp{ 2018, 2023 };
    const auto sundays{ get_sundays_1st(sp) };
    std::cout << std::format("Anzahl Sonntage: {}\n", sundays.size());
    for (const auto& sunday : sundays)
        std::cout << sunday;
}
                

Lösung von: Jens Kelm (@JKooP)

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.25
Schwierigkeit: Leicht
Webcode: juck-x0i7
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen