ERLEDIGT
JA
JA
ANTWORTEN
7
7
ZUGRIFFE
576
576
EMPFEHLEN
-
Hallo Leute!...
Habe in Java einen Wochentagberechner geschrieben...
Nur er funktioniert einfach nicht und nach meheren Stunden Fehlersuche, zum Teil zusammen
mit meinem Arbeitskollegen (auch Azubi) ist mir echt Wirr und ich denke hier sind sicher welche die schnell sehen, was da schief läuft...
Hie mein Code:
Code java: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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
import java.util.Scanner; public class WochentagAusgeben { public static void main(String[] args) { int ReferenzJahr = 1584; Scanner sc = new Scanner(System.in); System.out.println("Geben Sie das gesuchte Jahr ein:"); int GesuchtesJahr = sc.nextInt(); System.out.println("Geben Sie den gesuchten Monat als Zahl ein:"); int GesuchterMonat = sc.nextInt(); System.out.println("Geben Sie den gesuchten Tag ein:"); int GesuchterTag = sc.nextInt(); int VergangeneTage = 0; boolean Schaltjahr = false; while (ReferenzJahr <= GesuchtesJahr) { if (ReferenzJahr % 4 == 0) { Schaltjahr = true; } if (ReferenzJahr % 100 == 0) { Schaltjahr = false; } if (ReferenzJahr % 400 == 0) { Schaltjahr = true; } if (Schaltjahr == true) { VergangeneTage = VergangeneTage + 366; } else { VergangeneTage = VergangeneTage + 365; } ReferenzJahr++; } int Februar = 28; if (Schaltjahr == true) { Februar = 29; VergangeneTage = VergangeneTage - 366; } else { VergangeneTage = VergangeneTage - 365; } switch (GesuchterMonat) { case 1: VergangeneTage = VergangeneTage + 0; break; case 2: VergangeneTage = VergangeneTage + 31; break; case 3: VergangeneTage = VergangeneTage + 31 + Februar; break; case 4: VergangeneTage = VergangeneTage + 31 + Februar + 31; break; case 5: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30; break; case 6: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31; break; case 7: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30; break; case 8: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31; break; case 9: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31; break; case 10: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30; break; case 11: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30 + 31; break; case 12: VergangeneTage = VergangeneTage + 31 + Februar + 31 + 30 + 31 + 30 +31 +31 + 30 + 31 + 30; break; default: System.out.println("Offenbar gab es einen Fehler bei der Berechnung! \n Vielleicht bei der Monatseingabe vertippt?"); break; } int Wochentag = (VergangeneTage + GesuchterTag - 1) % 7; switch (Wochentag) { case 0: System.out.println("Der gesuchte Tag ist ein Sonntag!"); break; case 1: System.out.println("Der gesuchte Tag ist ein Montag!"); break; case 2: System.out.println("Der gesuchte Tag ist ein Dienstag!"); break; case 3: System.out.println("Der gesuchte Tag ist ein Mittwoch!"); break; case 4: System.out.println("Der gesuchte Tag ist ein Donnerstag!"); break; case 5: System.out.println("Der gesuchte Tag ist ein Freitag!"); break; case 6: System.out.println("Der gesuchte Tag ist ein Samstag!"); break; default: System.out.println("Offenbar gab es einen Fehler bei der Berechnung!"); break; } } }
Sorry, wenn nicht sofort klar ist, was was ist, hatte eig. alles kommentiert, leider führt das hier zu totaler unleserlichkeit aufgrund der Zeilenumbrüche :/
Hoffe ihr könnt iwie helfen...
Danke!Geändert von sheel (23.01.12 um 23:09 Uhr) Grund: Codetags
-
Hi und Willkommen bei tutorials.de,
sehr hilfreich wäre vor dem Fehlersuchen das eigentliche Problem.
Falsches Ergebnis (was statt was), Exception (welche), ...?
Hast du mal mit dem Debugger eingegrenzt, wo was passiert?
Ich hab mal die Codetags auf die Sprache angepasst.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Danke, freue mich hier zu sein!
Stimmt, hätte echt mehr sagen müssen, sorry,
Also: Das Ergebnis stimmt einfach nicht. Meist liegt es so +- 2 Tage daneben.
Habe im debuger mal nachgesehen, was so passiert. Immerhin stimmt es, das bei 2012 Schaltjahr true ist. Ich denke das ich irgendwie was mit den Tagen falsch habe.
Als Referenzjahr bzw. Tag ist Sonntag der 1. Januar 1584 genannt. Dann lasse ich in der schleife immer wieder abfragen, ob das momentane jahr ein schaltjahr ist, wenn ja kommen 366 Tage dazu wenn nicht 365. Nach der schleife ziehe ich wiede rje nach Schaltjahr 366 bzw. 365 ab, weil in der schleife auch das geforderte Jahr dazugerechnet wurde, das tue ich deshalb, weil ich ja auch vom aktuellem Schaltjahr wissen will, ob es einschaltjahr ist.
Dadurch wird dann ja auch Februar entsprechend auf 29 oder 28 Tage gesetzt. Danach werden die vergangenen Tage der Monate addiert und die Tage, die eingegeben wurden ( -1 weil der eingegebene tag selbst ja noch nicht vergangen ist).
Die summe des ganzen also der vergangenen Tage dann %7 ... ist es 0 muss es wieder ein Sonntag sein, 1 ein montag etc...
Soweit die Theorie, leider ist irgendwo ein ganz blöder Fehler drinne.
Z.B.: der 11.02.1964 muss ein Dienstag werden. Es kommt Montag raus.
Der 01.01.2012 ist angeblich ein Freitag!
Hoffe die Informationen helfen besser!
Danke.
-
Konnte zwar ein Problem finden, war aber anscheinend nicht alles, geht noch immer nicht.
(In der while-Jahr<=-Schleife muss Schaltjahr wieder auf false gesetzt werden.)
Alternative: Warum nicht die Wochentagsformel von Gauß?Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
24.01.12 08:37 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Ich habe es spaßeshalber mal etwas vereinfacht. Scheint zu funktionieren:
PS: Übrigens schreibt man in Java nur Klassennamen groß. Variablennamen sollten in mixed Case mit Kleinbuchstaben anfangen - siehe z.B. http://java.about.com/od/javasyntax/...onventions.htmCode java: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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
import java.util.Scanner; public class Weekday { private static boolean istTeilbar(int x, int teiler) { return (x % teiler == 0); } private static boolean istSchaltjahr(int jahr) { return (istTeilbar(jahr, 400) || istTeilbar(jahr, 4) && ! istTeilbar(jahr, 100)); } public static void main(String[] args) { int ReferenzJahr = 1584; // Beginn gregorianischer Kalender. 1. 1. 1584 war ein Sonntag. Scanner sc = new Scanner(System.in); System.out.println("Geben Sie das gesuchte Jahr ein:"); int GesuchtesJahr = sc.nextInt(); System.out.println("Geben Sie den gesuchten Monat als Zahl ein:"); int GesuchterMonat = sc.nextInt(); System.out.println("Geben Sie den gesuchten Tag ein:"); int GesuchterTag = sc.nextInt(); int VergangeneTage = 0; boolean Schaltjahr = false; while (ReferenzJahr < GesuchtesJahr) { Schaltjahr = istSchaltjahr(ReferenzJahr); if (Schaltjahr) { VergangeneTage = VergangeneTage + 366; } else { VergangeneTage = VergangeneTage + 365; } ReferenzJahr++; } int Februar = istSchaltjahr(GesuchtesJahr) ? 29 : 28; switch (GesuchterMonat) { case 12: VergangeneTage += 30; case 11: VergangeneTage += 31; case 10: VergangeneTage += 30; case 9: VergangeneTage += 31; case 8: VergangeneTage += 31; case 7: VergangeneTage += 30; case 6: VergangeneTage += 31; case 5: VergangeneTage += 30; case 4: VergangeneTage += 31; case 3: VergangeneTage += Februar; case 2: VergangeneTage += 31; case 1: break; default: System.out.println("Offenbar gab es einen Fehler bei der Berechnung! \n Vielleicht bei der Monatseingabe vertippt?"); } int Wochentag = (VergangeneTage + GesuchterTag - 1) % 7; String wochentag[] = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" }; System.out.printf("Der gesuchte Tag ist ein %s!\n", wochentag[Wochentag]); } }
GrußGeändert von deepthroat (24.01.12 um 08:54 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
24.01.12 13:49 #6Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.
-
Hallo alle zusammen!
Erst einmal danke für die schnelle und kompetente Hilfe!
Hätte nicht gedacht, dass so schnell Leute antworten... und vor allem:
Das man hier nicht wie in diversen anderen Foren direkt "fertig" gemacht wird, wenn man mal einen einfachheren Fehler nicht findet!
Das Problem schein jetzt gelöst zu sein! Es war scheinbar wirklich nur die while schleife in der bei jedem Durchgang, das Schaltjahr wieder auf false gesetzt werden muss!
Denn nun kommen die richtigen Tage raus, an den Daten, an denen sonst immer das Flasche raus kam!
Die anderen Lösungen haben mir zusätzlich auch noch weitere unbekannte Lösungswege gezeigt.
Leider konnte ich keine der anderen Formeln benutzen, da es sich um eine fest definierte Schulaufgabe handelte, bei der genau diese benutzt werden sollte...
Ich danke euch allen nochmal!
Und zu den großen Variabelennamen: Ich versuch mich zu bessern! Ich komme aus einem Betrieb der eig. nur mit C++ und Javascript arbeitet und bei uns ist es Sitte die Variabelen groß zu schreibne, dass habe ich mir inzwischen schon angewöhnt. Aber ich hoffe auf besserung!
In diesem Sinne! Danke und bis zur nächsten Herausforderung!
-
Zur Vereinfachung und Kontrolle der Daten habe ich ein einfaches Java Programm entwickelt, welches anhang des gesetzten Datums den Wochentag liefert.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
import java.text.DateFormat; import java.util.Calendar; public class WochentagBeispiel { public static int getDay(int y, int m, int d) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, y); cal.set(Calendar.MONTH, m); cal.set(Calendar.DATE, d); DateFormat df = DateFormat.getDateInstance(DateFormat.FULL); // Die folgende Ausgabe dient nur zur Validierung System.out.println(df.format(cal.getTime())); return cal.get(Calendar.DAY_OF_WEEK); } public static void main(String[] args) { // Achtung Monate beginnen mit 0 (zero based) d.h. Jan = 0, Feb = 1 etc. System.out.println("Tag der Woche (1 = Sonntag, 7 = Samstag) von 4.11.2009: " + getDay(2009, 10, 4) ); } }Geändert von j2se (24.01.12 um 22:42 Uhr)
Ähnliche Themen
-
kurze bitte; da ich kein IE hab
Von Fix&Foxi im Forum CSSAntworten: 7Letzter Beitrag: 06.06.11, 23:06 -
Bitte um schnelle Hilfe in Java!
Von AngeloBa im Forum JavaAntworten: 2Letzter Beitrag: 06.05.07, 12:43 -
Bitte um Hilfe Java Programm!
Von spy72 im Forum JavaAntworten: 2Letzter Beitrag: 16.01.07, 09:03 -
Hilfe Um Bitte Zu Blöd Für Java
Von SirWayne im Forum JavaAntworten: 1Letzter Beitrag: 01.10.06, 00:04 -
Ladebalken - kurze, simple Frage/Bitte
Von Comenius im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 31.08.06, 19:15





Zitieren


Login





