Wochentagsberechnung

Ich hab mal wieder ne neue Programmieraufgabe, diesmal kommt sie von Svenyboy:

Aufgabe ist es ein Programm zu schreiben, dass zu einem beliebigen eingegebenen Datum den Wochentag berechnet.

Ihr wisst schonw as ich meine :)

Sollte nicht aalzuschwer sein.

Viel Spaß dabei!

mfg
Nornagest
 
http://www.humer.info - wenn Javascript genehm ist. Einfach aus dem Quelltext rauskopieren, mit Sekundenanzeige "x Sekunden seit Datum" in der Statuszeile - frag mich aber nicht, wo ich das mal her hatte... - und hey - die FLIEGE iss mir ganz alleine!
 
Hallo, da hier noch nich so viel stand, habe ich einfach mal was geschrieben:

Code:
#include <stdio.h>
#include <time.h>

char *wday[] = {"Sunday",
                           "Monday",
                           "Tuesday",
                           "Wednesday",
                           "Thursday",
                           "Friday",
                           "Saturday",
                           "unknown day"
                           };

int main()
{
   struct tm time_check;
   int year, month, day;

/*input the date*/
   printf("year: ");
   scanf("%d", &year);
   printf("month: ");
   scanf("%d", &month);
   printf("day: ");
   scanf("%d", &day);

/*fill our structure*/
   time_check.tm_year = year - 1900;
   time_check.tm_mon = month -1;
   time_check.tm_mday = day;

   time_check.tm_hour = 0;
   time_check.tm_min = 0;
   time_check.tm_sec = 1;
   time_check.tm_isdst = -1;

/*get the day-nr.*/
   if (mktime(&time_check) == -1)
      time_check.tm_wday = 7;

   printf("This day was a %s\n", wday[time_check.tm_wday]);
 
   return 0;

}

getestet unter SuSE Linux 9.1 Professional, Slackware 10.0, Knoppix 3.3 BETA & irgendeine Ubuntu-Version :D

mfg
tcr
 
Um hier mal eine echte Lösung, die nirgendwo abgeschireben wurde:

Als erstes muss man den Wochentag eines bestimmten Datums in der Vergangenheit kennen (am besten ein Sonntag).
Dann zählt man, wie viele Tage bis zum gesuchten Datum vergangen sind. (Wichtig: Schaltjahre, Anzahl der Tage in einem Monat).
Jetzt diese Zahl mod 7 und dann:
0 = Sonntag,
1 = Montag,
usw.
 
Nein, aber du hast ne standardfunktion benutzt, hier geht es aber um einen eigenen algorithmus.

Ich hab das ganze mal in Opal gecodet. Wird natürlich nicht jeder kennen, aber der sinn sollte verständlich sein.

Code:
--Schaltjahr?
FUN leapYear : nat -> bool
DEF leapYear(n) ==
IF n % 4 = 0 THEN true
IF n % 100 = 0 THEN false
IF n % 400 = 0 THEN true
ELSE false

FUN leapDay : date -> nat
DEF leapDay(d)==IF leapYear? (year(d)) THEN 1 ELSE 0 FI

-- Tage im Monat
FUN daysOfMonth : date -> nat
DEF daysOfMonth(d)==
IF month(d) = 2 THEN 28 + leapDay(d)
IF month(d) < 8 THEN 30 + month(d) % 2
ELSE 31 - month(d) % 2 FI

-- Tage, die seit 0 vergangen sind
FUN daysOfLord : date -> nat
DEF daysOfLord(d)==
IF d > 1 THEN 1 + daysOfLord(date(day(d) - 1,month(d),year(d)))
IF m > 1 THEN daysOfMonth(date(day(d),month(d) - 1,year(d)) +
daysOfLord(date(day(d), month(d) - 1, year(d)))
IF y > 1 THEN 365 + leapDay(date(day(d), month(d), year(d) - 1)) +
daysOfLord(date(day(d), month(d), year(d) - 1))
ELSE 0 FI

-- Tage zwischen zwei Daten
FUN daysBetween: date ** date -> nat
DEF daysBetween(d1,d2)==
IF daysOfLord(d1) - daysOfLord(d2) > 0 THEN daysOfLord(d1) -
daysOfLord(d2)
ELSE daysOfLord(d2) - daysOfLord(d1) FI

-- der erste Januar 1950 war ein Sonntag
FUN dayOfWeek : date -> nat
DEF dayOfWeek(d) == daysBetween(d, date(1,1,1950)) % 7
 
währe es nicht so einfacher

Wochentag := ((timestamp - TimestampT0) div 86'400) mod 7

TimestampT0 ist ein fixes Datum mit bekannten Wochentag (am besten 1.1.1970) und das Ergebnis der Operation selber Wochentag, Wochentag+1,Wochentag +2,... ist doch einfacher :D Das Problem ist blos der Timestamp. Entweder wirds kompliziert den für nen beliebiges Datum zu bekommen oder man benutzt wieder Die Standardfunktionen... Trotzdem past es auf eine Zeile^^
 
zu 1.: ein tag hat 86400 sekunden... der ' sollte aber da nicht wirklich drin sein... ist selbst für pseudocode kein allzugutes trennzeichen ;)
zu 2.: nein, sofern die im timestamp berücksichtigt sind. time(NULL); liefert z.b. genau das was man braucht, nämlich die anzahl der sekunden die seit dem 1.1.1970 um 0:00 vergangen sind. und da müssten die schaltjahre eigentlich mit berücksichtigt sein.
als TimestampT0 würde ich dann eben 0 nehmen. dann müsste man nur noch wissen, welcher wochentag der 1.1.1970 war und das problem ist gelöst.
 
deshalb 86'400, weil mans einfach besser lesen kann. Im "richtigen" Quellcode währe es natürlich nicht aufgetaucht :D Der 1.1.1970 war ein Donnerstag. (wieso zeigt PHP bei mir "Thursday 01st of January 1970 01:00:00 AM" an?
müsste es nicht 0:00:00 morgens sein?) Ein laufendes PHP-Programm könnte dann so aussehen:
PHP:
<?php
$wday=array("Donnerstag","Freitag","Samstag","Sonnstag","Montag","Dienstag","Mittwoch");
echo $wday[(Time() / 86400) % 7];
?>
Es zeigt sogar Dienstag an^^ echo date("l"); währe trotzdem üblicher wenn auch Englisch :D

MfG Zemy
 
Hallo!

Meine Java Lösung

Main.java
Code:
public class Main {

	public static void main(String[] args) {	
		System.out.println(new Weeklist().getDayname(((System.currentTimeMillis() / 1000) / 86400) % 7));
	}

}

Weeklist.java
Code:
public class Weeklist {

	private ArrayList<String> days = null;
	
	public Weeklist() {
		this.days = new ArrayList<String>();
		this.addDays();
	}
	
	private void addDays() {
		days.add("Donnerstag");
		days.add("Freitag");
		days.add("Samstag");
		days.add("Sonntag");
		days.add("Montag");
		days.add("Dienstag");
		days.add("Mittwoch");
	}
	
	public String getDayname(long idx) {
		return days.get((int)idx);
	}
	
}

Gruß
Felix

EDIT
Um auch Groovy noch zu präsentieren:

Code:
days = [ "Donnerstag", "Freitag", "Samstag", "Sonntag", "Montag", "Dienstag", "Mittwoch" ]
time = System.currentTimeMillis() / 1000
println days[ (int)(time / 86400) % 7 ]
 
Zurück
Oben