n-ter Tag im Jahr (Felder)
Initialisieren Sie ein Feld mit den folgenden zwölf Werten: 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31. Kurz, jeder Wert bezeichnet die Anzahl Tage eines Monats. Schreiben Sie eine Methode tagNr(Tag, Monat): integer, die von einem Tag ausgibt, um den wievielten Tag im Jahr es sich handelt. Gehen Sie vorerst nicht auf Schaltjahre ein. Schreiben Sie eine weitere Methode tagNr(Tag, Monat, Jahr): integer, die berücksichtigt, ob es sich um ein Schaltjahr handelt. Der erste Tag im Jahr ist der 1. Januar. Verwenden Sie wiederum die Funktion aus Schaltjahre.
0 Kommentare
10 Lösung(en)
# Bestimmung des n-ten Tages
def tagNr(Tag,Monat):
tage_monat = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
nr = 0
for i in range(Monat-1):
nr = nr + tage_monat[i]
nr = nr + Tag
return nr
print tagNr(28,8)
Lösung von: Martin Guggisberg (Universität Basel / PH FHNW)
int tagImJahr(int jahr, int monat, int tag) {
int tageImMonat[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int monatsTage = 0; //Tage durch Monate vor aktuellem Datum
int aktMonatsIndex = 0; // januar
while (aktMonatsIndex < monat - 1) {
monatsTage = monatsTage + tageImMonat[aktMonatsIndex];
aktMonatsIndex = aktMonatsIndex + 1;
}
if (monat <= 2 && istSchaltJahr(jahr)) { // Jan. und feb. speziell
monatsTage =monatsTage - 1;
}
return monatsTage + tag;
}
boolean istSchaltJahr(int jahr) {
if(0 == jahr % 400)
return true;
if(0 == jahr % 100)
return false;
return 0 == jahr % 4;
}
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
# @autor Philipp Gressly Freimann
# 17. Feb. 2011 (Corinas Geburtstag)
#
# Aufgabe hackerboard.de + programmieraufgaben.ch
# Gegeben dd.mm.yyyy (ein Datum). Berechne die Position im Jahr:
# 1. Jan. = 1
# 31. Dez. = 365 (mit Ausnahmen)
#
# Es wird keine Prüfung gemacht, ob das Datum existiert!
# Hilfsfunktionen:
def nach15OktImJahr1582(d, m, y)
puts "greg #{d}. #{m}. #{y}"
if( 1582 != y) then return false end
if( 10 < m) then return true end
if( 10 > m) then return false end
return 15 <= d
end
def schaltJahr(y)
# julianisch:
if(y < 1582) then return 0 == y % 4 end
# gregorianisch:
return 0 == y % 400 ? true : (0 == y % 100 ? false : (0 == y % 4))
end
# Julianische Korrektur:
# Je Differenzen zum standard ägyptischen bürgerlichen
# Verwaltungsmonat mit je 30 Tagen:
# MONAT0, Jan, Feb, März, ..., Nov (Dez. unnötig)
diff30 = [-30,1,-2,1,0,1,0,1,1,0,1,0]
# Einlesen
print "DD.MM.YYYY eingeben: "
dd,mm,yy = STDIN.gets.scan(/(\d{2})\.(\d{2})\.(\d{4})/).flatten
dd = dd.to_i; mm = mm.to_i; yy = yy.to_i
if(schaltJahr(yy))
diff30[2] += 1 #Im Februar einen Tag dazuzählen
end
res = dd
# Rechne alle Monate mit 30 Tagen (+/- Korrektur) zum Datum dazu.
diff30[0..(mm.to_i-1)].each {|d| res += d + 30}
# 1582 Korrektur:
if(nach15OktImJahr1582(dd, mm, yy))
res = res - 10
end
#Ausgabe
puts "Der #{dd}. #{mm}. #{yy} ist der #{res}. Tag im Jahr."
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
using System;
namespace n_ter_Tag_im_Jahr {
class Program {
//Aufgabe
static int TagNr(int tag, int monat, int jahr = 1) {
int[] tageImMonat;
try {
tageImMonat = new int[] {
31,
DateTime.IsLeapYear(jahr) ? 29 : 28,
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
}
catch (ArgumentOutOfRangeException) {
return -1;
}
if (tag > tageImMonat[--monat] || tag < 1) return -1;
int tage = 0;
while (monat > 0)
tage += tageImMonat[--monat];
return tage + tag;
}
//Ausgabe
static void Main() {
Console.WriteLine(TagNr(1, 1));
Console.WriteLine(TagNr(1, 2));
Console.WriteLine(TagNr(31, 12, 2011));
Console.WriteLine(TagNr(31, 12, 2012));
Console.ReadKey(true);
}
}
}
Lösung von: Marcel Kapma ()
// Warum umständlich mit Schaltjahrabfragen und Anzahl von Tagen in einem Monat hantieren?
function nthDayInYear(d) {
return Math.ceil((d - new Date(d.getFullYear(), 0, 1)) / 864e+5);
}
console.log(nthDayInYear(new Date(Date.parse(prompt("Datum:")))));
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET 6.x | C# 10.x | VS-2022
// Variante 1 (mit C#-Funktion)
var date = DateTime.Now;
var dayOfYear1 = date.DayOfYear;
Console.WriteLine($"Tag des Jahres: {dayOfYear1}");
// Variante 2 (ohne C#-Funktion)
var (year, month, day) = (2022, 3, 23);
var isLeapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
var arrMonth = new int[] { 31, isLeapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// 2.1
var dayOfYear2 = arrMonth.Take(month - 1).Sum() + day;
Console.WriteLine($"Tag des Jahres: {dayOfYear2}");
// 2.2 (C# 8.x nötig)
var dayOfYear3 = arrMonth[..(month - 1)].Sum() + day;
Console.WriteLine($"Tag des Jahres: {dayOfYear3}");
// 2.3
var m = 0;
for (var i = 0; i < month - 1; i++) m += arrMonth[i];
var dayOfYear4 = m + day;
Console.WriteLine($"Tag des Jahres: {dayOfYear4}");
Lösung von: Jens Kelm (@JKooP)
// C++ 14 | VS-2022
#include <iostream>
int nth_day_of_year(int y, int m, int d) {
auto sum{ 0 };
auto ily{ y % 4 == 0 && y % 100 != 0 || y % 400 == 0 };
int mon[]{ 31, ily ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
for (auto i{ 0 }; i < m - 1; i++) sum += mon[i];
return sum + d;
}
int main() {
std::cout << nth_day_of_year(2022, 7, 7) << "\n";
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
#include <iostream>
#include <array>
#include <numeric>
constexpr auto nth_day_of_year(const auto& year_, const auto& month_, const auto& day_) {
const auto feb{ 28 + (year_ % 4 == 0 && year_ % 100 != 0 || year_ % 400 == 0) };
const std::array<int, 12> arr{ 31, feb , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return std::accumulate(arr.begin(), arr.end() - (13LL - month_), 0LL) + day_;
}
int main() {
std::cout << nth_day_of_year(2024, 7, 7) << "\n";
}
Lösung von: Jens Kelm (@JKooP)
' VBA
Public Function IsLeapyear(year_ As Integer)
IsLeapyear = IIf((year_ Mod 4 = 0 And year_ Mod 100 <> 0 Or year_ Mod 400 = 0), 1, 0)
End Function
Public Function NthDayOfYear(date_ As Date)
Dim sum As Integer
Dim arr()
arr = Array(31, 28 + IsLeapyear(Year(date_)), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
For i = 1 To Month(date_) - 1
sum = sum + arr(i)
Next i
NthDayOfYear = sum + Day(date_)
End Function
' oder:
Public Function NthDayOfYear(date_ As Date)
NthDayOfYear = DateDiff("y", DateSerial(Year(date_), 1, 1), date_) + 1
End Function
' oder kürzer:
Public Function NthDayOfYear(date_ As Date)
NthDayOfYear = DatePart("y", date_)
End Function
Lösung von: Jens Kelm (@JKooP)
#include <stdio.h>
#include <stdlib.h>
size_t accumulate(size_t *arr, size_t begin, size_t end, size_t val){
for(size_t i = begin; i < end; i++)
val += arr[i];
return val;
}
size_t nth_day_of_year(size_t year, size_t month, size_t day) {
size_t feb = 28 + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
size_t arr[] = { 31, feb , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return accumulate(arr, 0, 12 - (13 - month), 0) + day;
}
int main() {
printf("%i\n", nth_day_of_year(2024, 7, 7));
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
tagNr(1, 1) -> 1
tagNr(1, 2) -> 32
tagNr(31, 12, 2011) -> 365
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 2 |
Schwierigkeit: | k.A. |
Webcode: | gqsc-8u29 |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |