Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Wochentagsberechnung

Diskussion: Wochentagsberechnung im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Ich hab mal wieder ne neue Programmieraufgabe, diesmal kommt sie von Svenyboy: Aufgabe ist es ein Programm zu schreiben, ...

Antwort
Alt 27.03.04, 15:36   #1 (permalink)
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard Wochentagsberechnung

Anzeige

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

Nornagest ist offline   Mit Zitat antworten
Alt 29.03.04, 02:50   #2 (permalink)
 
Registriert seit: 27.03.04
1000sassa Leistung: Facit NTK
Likes: 0
Standard RE: Wochentagsberechnung

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!
1000sassa ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 12.02.05, 17:03   #3 (permalink)
 
Registriert seit: 27.01.05
MrNiceGuy Leistung: Facit NTK
Likes: 0
Standard

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

mfg
tcr
MrNiceGuy ist offline   Mit Zitat antworten
Alt 12.02.05, 18:11   #4 (permalink)
Member of Honour
 
Registriert seit: 03.10.01
blueflash Leistung: Facit NTK
Likes: 1
Standard

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.
blueflash ist offline   Mit Zitat antworten
Alt 13.02.05, 10:29   #5 (permalink)
 
Registriert seit: 27.01.05
MrNiceGuy Leistung: Facit NTK
Likes: 0
Standard

Meinst du ich habe abschrieben?

mfg
tcr
MrNiceGuy ist offline   Mit Zitat antworten
Alt 13.02.05, 12:23   #6 (permalink)
Member of Honour
 
Registriert seit: 03.10.01
blueflash Leistung: Facit NTK
Likes: 1
Standard

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
blueflash ist offline   Mit Zitat antworten
Alt 13.02.05, 16:01   #7 (permalink)
 
Registriert seit: 27.01.05
MrNiceGuy Leistung: Facit NTK
Likes: 0
Standard

Oh, dann sorry.
Das wusste ich nicht, aber jetzt weiß ich's.

mfg
tcr
MrNiceGuy ist offline   Mit Zitat antworten
Alt 14.02.05, 18:54   #8 (permalink)
 
Registriert seit: 05.01.05
Zemy Leistung: Facit NTK
Likes: 0
Standard

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 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^^
Zemy ist offline   Mit Zitat antworten
Alt 14.02.05, 19:08   #9 (permalink)
Member of Honour
 
Registriert seit: 03.10.01
blueflash Leistung: Facit NTK
Likes: 1
Standard

1. was soll 86'400 für ein wert sein?

2. wenn du zwei daten voneinander subtrahierst, vergisst du nicht die schaltjahre?
blueflash ist offline   Mit Zitat antworten
Alt 15.02.05, 11:41   #10 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

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.
Der Meister ist offline   Mit Zitat antworten
Alt 15.02.05, 13:25   #11 (permalink)
 
Registriert seit: 05.01.05
Zemy Leistung: Facit NTK
Likes: 0
Standard

deshalb 86'400, weil mans einfach besser lesen kann. Im "richtigen" Quellcode währe es natürlich nicht aufgetaucht 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-Code:
<?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

MfG Zemy
Zemy ist offline   Mit Zitat antworten
Alt 15.02.05, 14:20   #12 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

Zitat:
(wieso zeigt PHP bei mir "Thursday 01st of January 1970 01:00:00 AM" an? müsste es nicht 0:00:00 morgens sein?)
könnte an der zeitzoneneinstellung liegen, oder? der timestamp 0 bezieht sich ja auf den 1.1.1970 umd 0:00 UTC...
Der Meister ist offline   Mit Zitat antworten
Alt 15.02.05, 16:49   #13 (permalink)
 
Registriert seit: 05.01.05
Zemy Leistung: Facit NTK
Likes: 0
Standard

*honk* stimmt. Ist ja +1h in D^^
Zemy ist offline   Mit Zitat antworten
Alt 21.05.08, 03:26   #14 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

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 ]
Ook! ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Wochentagsberechnung
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61