| 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. |
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, ...
![]() |
| | #1 (permalink) |
| Registriert seit: 02.10.01 ![]() Likes: 0 | 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 |
| | |
| | #2 (permalink) |
| Registriert seit: 27.03.04 ![]() Likes: 0 | 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! |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Registriert seit: 27.01.05 ![]() Likes: 0 | 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;
} ![]() mfg tcr |
| | |
| | #4 (permalink) |
| Member of Honour ![]() Registriert seit: 03.10.01 ![]() Likes: 1 | 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. |
| | |
| | #5 (permalink) |
| Registriert seit: 27.01.05 ![]() Likes: 0 | Meinst du ich habe abschrieben? mfg tcr |
| | |
| | #6 (permalink) |
| Member of Honour ![]() Registriert seit: 03.10.01 ![]() Likes: 1 | 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 |
| | |
| | #7 (permalink) |
| Registriert seit: 27.01.05 ![]() Likes: 0 | Oh, dann sorry. Das wusste ich nicht, aber jetzt weiß ich's. ![]() mfg tcr |
| | |
| | #8 (permalink) |
| Registriert seit: 05.01.05 ![]() Likes: 0 | 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^^ |
| | |
| | #9 (permalink) |
| Member of Honour ![]() Registriert seit: 03.10.01 ![]() Likes: 1 | 1. was soll 86'400 für ein wert sein? 2. wenn du zwei daten voneinander subtrahierst, vergisst du nicht die schaltjahre? |
| | |
| | #10 (permalink) |
| Registriert seit: 05.04.04 ![]() Likes: 0 | 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. |
| | |
| | #11 (permalink) |
| Registriert seit: 05.01.05 ![]() Likes: 0 | 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: ![]() MfG Zemy |
| | |
| | #12 (permalink) | |
| Registriert seit: 05.04.04 ![]() Likes: 0 | Zitat:
| |
| | |
| | #13 (permalink) |
| Registriert seit: 05.01.05 ![]() Likes: 0 | *honk* stimmt. Ist ja +1h in D^^ |
| | |
| | #14 (permalink) |
| Registriert seit: 21.04.08 ![]() Likes: 0 | 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));
}
} 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);
}
} 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 ] |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |