simpler Kalender

trekker99

Mitglied
Hallo Leute,
zerbrechen uns gerade den Kopf mit dieser Übung:

Schreibe ein Programm, das für einen Monat den Kalender ausgibt.
Die Darstellung soll ich einer Art Matrix erfolgen in der die erste Zeile MO|DI|MI|DO|FR|SA|SO (ähnlich dem Aufbau des Windows-Kalenders rechts unten im Menü).
Wenn beispielsweise der erste des Monats ein Mittwoch ist, dann müssen Montag und Dienstag freigelassen werden. Mittwoch soll dann 1 ausgegeben werden, Donnerstag 2,...
Alles wird mit einem | getrennt

ist sicher ganz simpel, kommen aber nicht drauf.. geht bestimmt mit verschachtelten Schleifen.. ab wie?? ^^

Schonmal danke für die Hilfe! :)
 
K

kneitzel

Gast
Die erste Frage bei sowas sind immer die Daten: Kommt Ihr an die Daten heran?
Also 1 -> Mittwoch, 2 -> Donnerstag, ....
Dann wann Ende ist (also z.B. Monat hat 30 Tage ...

Wenn ihr die Daten habt, dann ist nur die Frage, wie ihr diese ausgebt. Und dazu einfach einmal überlegen, wie ihr es mit Stift und Papier macht.
- Ihr müsst am Anfang bis zu der richtigen Stelle gehen ... dann gebt Zahl für Zahl aus ...
- Hin und wieder baut ihr einen Zeilenumbruch ein ...

Da sehe ich also nicht einmal verschachtelte Schleifen ...
 

trekker99

Mitglied
Danke für die Antwort!
Wir stehen noch ziemlich am Anfang beim Programmieren..

Es hapert generell am nicht wissen wie man am besten anfangen soll :/

Es kommt danach noch eine Erweiterung wenn der 1. Teil erledigt ist:

Optionale Erweiterung: Frage den User
  • welcher Monat
  • welcher Starttag (=an welchem Wochentag ist der 1. im Monat)
  • in welchem Jahr ausgegeben werden soll.
 
K

kneitzel

Gast
Der Ablauf ist unter dem Strich wirklich immer gleich:

Ein erster wichtiger Schritt ist immer erst das Verständnis vom Model. Man muss die damit verbundenen Probleme / Aufgaben verstanden haben.

Hier geht es relativ einfach um das Datum und die damit zusammenhängenden Dinge. Die Erweiterung ist etwas unverständlich - Monat / Jahr reichen ja aus, um den Starttag zu ermitteln. Aber daraus folgere ich, dass Du im ersten Schritt gewisse Dinge einfach voraussetzt - in der Erweiterung fragst Du die Daten dann ab.

Somit gehen wir einmal davon aus, dass Monat, Starttag und Jahr vorgegeben sind. Das können wir im Code einfach als Variablen nehmen, die wir mit einem Wert initialisieren. Dazu müssen wir uns aber überlegen, wie diese Daten gespeichert werden könnten. Habt Ihr da irgendwelche Ideen?

Das ist so der erste Schritt ...

Danach kommt dann erst der nächste Schritt - das kann hier z.B. sein, fehlende Informationen zu ermitteln. Wie viele Tage hat ein Monat, von dem wir Monat und Jahr kennen? Also z.B. März 2020 hat wie viele Tage? Und was ist mit Februar 2020? und Februar 2021? ...

Wenn ihr alle Daten habt, dann erst kann man sich über die Darstellung unterhalten.
Und da habt ihr dann gewisse Daten die ihr darstellen wollt. Wie schreibt ihr die Daten denn auf ein Leeren Zettel? Wie geht ihr da vor?
Wenn ihr euch bewusst macht, wie ihr die Daten zu Papier bringt, findet ihr auch einen Weg, das im Programm hin zu kriegen.
Wenn ihr einen ersten Entwurf habt (z.B. malt ihr eine Tabelle mit Strichen um dann die Tabelle zu füllen), dann optimiert ihr das - statt die ganze Tabelle zu Zeichen und dann zu füllen, macht ihr es Zeile für Zeile fertig. Damit habt ihr dann etwas, das ihr in ein Programm umsetzen könnt...

Aber das war jetzt schon viel zu viel ... Bitte erst einmal nur auf den ersten Schritt achten: Wie speichert ihr die (notwendigen) Daten?
 

trekker99

Mitglied
Danke für deine ausführliche Antwort kneitzel!

Wenn man jetzt mal bei der Grundaufgabe bleibt und das Optionale außen vor lässt geht es ja im Grund nur noch darum:

1) Ausgabe für einen Monatsraster erstellen
2) Wenn z.B. der 1. ein Mittwoch ist, dann Montag und Dienstag frei lassen

Da wird noch nichts bzgl. Anzahl der Tage oder so gesagt.

Mein Ansatz war das in einem Array in Verbindung mit einer for-Schleife zu lösen.
Thematisch sind wir auch noch nicht weiter bisher, wie gesagt, stehen noch am Anfang.

Ausgabe soll also ca. so aussehen (aber ohne Tabelle!):

MODIMIDOFRSASO
12345
6789101112
usw...

lieg ich da sehr verkehrt?? 😅
 
K

kneitzel

Gast
Also wenn Du den Kalender ausgeben willst, dann musst Du doch wissen, bis wohin gezählt werden soll, oder nicht?

Wie gibst Du sowas denn aus? Ich will nichts hören von for Schleife oder so ... Was für Bereiche siehst Du so? Was musst Du denn bei der Ausgabe alles machen? Kannst Du da einfache Schritte angeben?

Also an einem Werktag:
- Stehe ich auf
- Mache mich fertig
- frühstücke
- ...

Wie das "frühstücke" aussieht, kommt später ... Und ob ich da in einer Schleife etwas mache ist dabei erst einmal egal. Und wenn da Wiederholungen sind, ist es auch egal, wie die umgesetzt werden ... for Schleife, while Schleife, Rekursion, ... Alles erst einmal egal. Vergiss die Implementierungsebene!

Und so Unterteilungen musst Du auch machen. Wie machst Du das, was Du da skizziert hast? Ich würde generell nie versuchen, alles auf einmal zu machen. Dabei ist es egal, ob Du Top Down oder Bottom Up vorgehst. Top Down ist aber evtl. einfacher.

Bei Top Down hast Du eine komplexe Aufgabe ... Und diese beschreibst Du mit High Level Dingen. Und die unterteilst Du dann immer weiter...

Bottom Up wäre der umgedrehte Weg: Das ist die LEGO Bauanleitung: Du fängst unten an und baust irgendwelche Komponenten. Und diese kommen zusammen oder werden erweitert ... und am Ende hast Du dann auch ganz komplexe Dinge fertig bekommen. Das setzt aber voraus, dass man genau weiss, was man braucht. So ein komplexes Wissen fehlt hier aber erst einmal ....
 

123neu

Bekanntes Mitglied
@trekker99 Meinst du das so?

Java:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Kal {

    public void print(int m, int y) throws ParseException {
        System.out.println("|Mo||Di||Mi||Do||Fr||Sa||So|");
        System.out.println("|--------------------------|");
        SimpleDateFormat df1 = new SimpleDateFormat("dd MM yyyy");
        int day = 1;
        int wd = -1;
        while (true) {
            Date d = df1.parse(day + " " + m + " " + y);
            Calendar c = Calendar.getInstance();
            c.setTime(d);
            if (c.get(Calendar.MONTH) + 1 != m) {
                break;
            }
            wd = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;
            if (day == 1) {
                for (int i = 0; i < wd; i++) {
                    System.out.print("|  |");
                }
            }
            System.out.print(String.format("|%02d|", day));
            if (wd == 6) {
                System.out.println();
            }
            day++;
        }
        for (int i = wd + 1; i < 7; i++) {
            System.out.print("|  |");
        }
        System.out.println();
        System.out.println();
    }

    public static void main(String[] args) throws ParseException {
        for (int i = 1; i <= 12; i++) {
            new Kal().print(i, 2021);
        }
    }

}

Die Ausgabe ist dann in etwa so:

Java:
|Mo||Di||Mi||Do||Fr||Sa||So|
|--------------------------|
|  ||  ||  ||01||02||03||04|
|05||06||07||08||09||10||11|
|12||13||14||15||16||17||18|
|19||20||21||22||23||24||25|
|26||27||28||29||30||  ||  |
 
K

kneitzel

Gast
@123neu Wahnsinn, Du hast diese Anfänger-Aufgabe lösen können. Zwar wie immer null Plan von Clean Code aber immerhin ... Aber immerhin - selbst so eine Lösung hätte ich Dir gar nicht zugetraut!

@trekker99 Ich würde an Deiner Stelle diese Lösung erst einmal ignorieren.
a) eine fertige Lösung zu nehmen und als eigene Leistung abzugeben ist Betrug. Und dank Google und Co und etwas Sachverstand merkt es der Lehrer oder Dozent mit großer Sicherheit... alleine weil Komponenten verwendet wurden, die euch garantiert noch nicht gezeigt wurden.
b) Lernst Du nichts dabei, diese Lösung zu übernehmen. Das ist ein absolutes Anfänger-Niveau und wenn Du da gewisse Grundlagen nicht verstehst, dann wird es für Dich immer schwerer.

Aber wenn Du Dich an der Lösung orientieren willst:
- Die Klasse Calendar brauchst Du nicht für diese Aufgabe. Die Aufgabe dürfte absichtlich so gehalten sein, dass man dies nicht braucht. (Und wenn Calendar, dann würde ich auf die alte Date API verzichten - vor allem der Weg erst ein Datum String aufzubauen um den dann zu parsen. Calendar bietet einen builder, mit dem man so eine Calendar Instanz erstellen kann... Aber wie gesagt: Das solltest Du ignorieren ...)

Daher würde ich mir an Deiner Stelle wirklich raten, die Schritte von Anfang an durchzuführen. Und das fängt damit an, dass man sich Gedanken zu den Datentypen macht. Da wir ja jetzt eine Möglichkeit sehen, kann man den Schritt fast abhaken:
Der Tag ist eine einfache ganze Zahl -> int (mit 1..31)
Das Jahr ebenso (4-Stellige Jahreszahl)
Wochentag muss man aufpassen - das kann man auch in einen int stecken, aber man muss gut bedenken, was welcher Wert bedeutet:
- Fängt man bei 0 oder 1 an?
- Fängt man bei Sonntag oder bei Montag an zu zählen
Aber einmal für sich definiert, hat man da auch eine eindeutige Speicherung.

Wenn Du das hast, dann kann man die Aufgabe unterteilen. Das kann man auch etwas an der Lösung erkennen (aber nur etwas ... )

Die Schritte, die ich sehe, sind z.B.:
- Überschrift der Tabelle schreiben.
- Leere Felder (am Anfang) schreiben
- Dann die Zahlen schreiben ...
- Leere Felder (am Ende) schreiben

Damit hast Du eine klare Gliederung. Und diese kannst Du 1:1 übernehmen:
Java:
public static printCalendar() {
    // Wir nehmen hier erst einmal die Daten, die wir uns schon überlegt haben:
    int month = 1;
    int year = 2021;
    int numberDays = 31;
    int firstDay = 5; // 1: Montag, 5: Freitag
    
    printHeader();
    writeEmptyFields();
    writeNumberFields();
    writeEmptyFields();
}

Dann machst Du erst einmal paar leere Methoden mit den Namen und schaust, ob Du die so schreiben kannst ...

printHeader sollte dann einfach sein...

writeEmptyFields wirst Du dann merken: Ups, mir fehlt eine Angabe. Wie viele leere Felder musst Du denn schreiben?
==> Das musst Du also ergänzen. Die Methode bekommt damit einen Parameter: count.
a) Was ist da für ein Wert? Überleg Dir einfach: wenn da firstDay 1 (Montag) ist: Wie viele leere Felder gibt es? Und was bei Dienstag? Mittwoch? ... Dann hast Du den Parameter schnell.

Und in der Methode? Schleife und printEmptyField() -> Also ruhig mehrere kleine Methoden machen. Aber Du kannst das natürlich auch an der Stelle direkt machen so Dir das schon klar ist... Wie weit Du das treibst hängt immer davon ab, was für eine Komplexität du durchschauen kannst (Am Anfang) und später, was aus Sicht von Clean Code Sinn macht ...)

Bei writeNumberFields() wirst Du wieder paar Parameter brauchen ...
Und dann wirst Du feststellen: für den letzten Schritt brauchst Du noch etwas aus der vorherigen Methode - da kannst Du dann den Wert zurück geben... Oder die Alternative ist, dass Du Dir das berechnest. (Du hast firstDay und numberDays - daraus lässt sich ja bestimmt etwas machen :) )

Kannst Du dem etwas folgen? Das wäre ein Vorgehen, das ich Dir von Anfang an raten würde, denn so kannst Du die Komplexität aufteilen und beherrschen (Teile und Herrsche - ein wichtiges Prinzip in der Informatik - sowohl bei diversen Algorithmen selbst z.B. Quicksort aber auch bei Clean Code).
 

123neu

Bekanntes Mitglied
Aber immerhin - selbst so eine Lösung hätte ich Dir gar nicht zugetraut!
Naja auf einen schlechten Lösungsversuch von dir braucht hier glaube ich keiner warten...

Calendar bietet einen builder, mit dem man so eine Calendar Instanz erstellen kann... Aber wie gesagt: Das solltest Du ignorieren ...
Den man nicht verwenden sollte... Informiere dich doch einfach mal, bevor du etwas schreibst. :(

die Komplexität aufteilen und beherrschen (Teile und Herrsche
Eine simple triviale Schleife brauche ich nicht weiter aufteilen... Hoffe du machst keine Reviews... falls doch, würde ich dich entlassen.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Naja auf einen schlechten Lösungsversuch von dir braucht hier glaube ich keiner warten...
Genau, denn ich setze Anfängern nicht einfach Code vor sondern versuche statt dessen, etwas zu erläutern. Etwas das du trotz vieler Hinweise bis Heute nicht verstanden hast ...

Und Argumente, wieso das Parsen eines Dates und dann das Setzen besser ist, hast du (wie immer) nicht ... Und nein - die erwartet hier auch niemand, denn wir kennen Dich ja schon lange genug ...
 

trekker99

Mitglied
@kneitzel Recht herzlichen Dank für dein Bemühen und deinen guten Willen! Ich weiß das wirklich sehr zu schätzen!
Hatte heute morgen eine Eingebung und das Probleme dann grundsätzlich gelöst. Meinung der Trainerin dazu war, dass der Ansatz schon gut, aber die Umsetzung noch nicht optimal ist. Trotzdem besser als alles was ich gestern fabriziert habe :D

@123neu Auch dir vielen Dank für deine Lösung! Dein Ergebnis ist perfekt, aber die Umsetzung verstehe ich leider (noch) nicht. Dazu steh ich noch zu sehr am Anfang. Da werde ich in ein paar Tagen oder Wochen wieder einen Blick drauf werfen!

Werde euch bestimmt bald wieder belästigen - bis dahin erst mal alles Gute! :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Q simpler Taschenrechner Java Basics - Anfänger-Themen 34
N Simpler cast? Java Basics - Anfänger-Themen 9
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
S Fehler bei simpler additions GUI Java Basics - Anfänger-Themen 2
Z Sehr simpler Taschenrechner - Hilfe! Java Basics - Anfänger-Themen 10
D Simpler Taschenrechner Java Basics - Anfänger-Themen 6
P ganz simpler algorithmus Java Basics - Anfänger-Themen 3
W [PROJEKT] Simpler grafischer Taschenrechner Java Basics - Anfänger-Themen 8
F Simpler DrawLine - Befehl!? Java Basics - Anfänger-Themen 9
L Simpler FTP Dateiupload Java Basics - Anfänger-Themen 4
F Datentypen Ganz simpler Taschenrechner mit switch Java Basics - Anfänger-Themen 10
J Simpler DNS Client Java Basics - Anfänger-Themen 20
F simpler Taschenrechner (blutiger Anfänger) Java Basics - Anfänger-Themen 7
G Datenbank VS simpler Datenstruktur Java Basics - Anfänger-Themen 3
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
F MS365 Kalender lesen Java Basics - Anfänger-Themen 5
sserio Gregorianischer Kalender und dessen Tage. Java Basics - Anfänger-Themen 14
G Kalender Jahreszahlen Java Basics - Anfänger-Themen 6
A Kalender programmieren, ich finde meinen Fehler nicht. Java Basics - Anfänger-Themen 9
J Gerorianischer Kalender wechselt am Freitag die Woche Warum Java Basics - Anfänger-Themen 2
N Kalender - Tag addieren gibt 31. Juni zurück Java Basics - Anfänger-Themen 3
S Hinweis zu Fehler im Kalender-Code - Aufgabe 5.3 aus Grundkurs Programmieren in Java 7. Auflage Java Basics - Anfänger-Themen 4
I c++ sexagesimal kalender Java Basics - Anfänger-Themen 5
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
C Kalender in Applet einfügen Java Basics - Anfänger-Themen 0
U Neu Julianischer Kalender Java Basics - Anfänger-Themen 2
T Kalender irrt sich Java Basics - Anfänger-Themen 8
M Kalender reloaded Java Basics - Anfänger-Themen 7
L Kalender Java Frame Java Basics - Anfänger-Themen 7
M Kalender mit Terminen Java Basics - Anfänger-Themen 24
F Problem mit selbstprogrammierten Kalender (als Übung) Java Basics - Anfänger-Themen 4
J Arrays (Kalender) Fehler im Programm Java Basics - Anfänger-Themen 2
P Date oder Kalender? Was soll man verwenden? Java Basics - Anfänger-Themen 2
K Erste Schritte Kalender selber erstellen? Java Basics - Anfänger-Themen 3
A JKomponente für Kalender Java Basics - Anfänger-Themen 5
R Kalender speichert keine Zeit Java Basics - Anfänger-Themen 2
L einfachen kalender Programmieren HA! Java Basics - Anfänger-Themen 76
M Kalender Java Basics - Anfänger-Themen 15
E Methoden zusammenfassen/Kalender erstellen Java Basics - Anfänger-Themen 13
T Einfacher Kalender Java Basics - Anfänger-Themen 17
G Kalender Bean in Netbean einbinden Java Basics - Anfänger-Themen 3
F Termine in einen kalender eintragen. Java Basics - Anfänger-Themen 11
G Kalender Von String zu boolean -- NullpointerException Java Basics - Anfänger-Themen 2
S Wie Termine/Notizen in Outlook Kalender einfügen ? Java Basics - Anfänger-Themen 3
D Gibt es einen vordefinierten Kalender in java? Java Basics - Anfänger-Themen 8
H Java Kalender systemabhängig programmieren? Java Basics - Anfänger-Themen 3
B Kalender -> Termine eintragen Java Basics - Anfänger-Themen 1
W Java Kalender Java Basics - Anfänger-Themen 6
B Kalender und Wochentagswechsel Java Basics - Anfänger-Themen 6
G The serializable class Kalender does not declare a static fi Java Basics - Anfänger-Themen 5
A Kalender mit Objekten belegen Java Basics - Anfänger-Themen 3
A kalender Java Basics - Anfänger-Themen 26
J Wie drucke ich eine Komponente wie Kalender auf dem Drucker Java Basics - Anfänger-Themen 3
G Kalender ? Java Basics - Anfänger-Themen 6
S kalender machen Java Basics - Anfänger-Themen 40
G kalender Java Basics - Anfänger-Themen 15
P Kalender Programmieren Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben