Entwickler-Ecke
C# - Die Sprache - DateTime
Geniuzz - Fr 14.09.07 09:28
Titel: DateTime
Moin,
ich soll ein kleines Programm schreiben, dass vom gesamten Jahr 2007 jeden ersten Dienstag im Monat heraus findet!
Über ein paar Infos, wie ich überhaupt anfangen kann wäre ich sehr froh.
Also irgendwie mit DateTime und schleifen..? oder
Greez
JüTho - Fr 14.09.07 10:08
Schleifen hast Du richtig erkannt. Fang doch erst einmal mit Pseudo-Code an, der die Aufgabenstellung einfach strukturiert übersetzt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| für jeden Monat von ... bis prüfe die ersten Tage von ... bis handelt es sich um einen Dienstag? ja => in Zwischenspeicher eintragen, dann Abbruch in diesem Monat, weiter mit dem nächsten Monat nein => nächsten Tag prüfen Ende Ende // Ausgabe des Zwischenspeichers für jeden Monat von ... bis Schreibe eine Zeile mit dem Inhalt des Zwischenspeichers |
Damit merkst Du außerdem: der Zwischenspeicher, der benötigt wird, muss am Anfang erstellt werden. Wichtige Überlegung dabei: in welchem Bereich "Tage von/bis" liegt wohl der erste Sonntag/Montag/Dienstag usw.?
Optimierung: Wenn Du weißt, welcher Wochentag der Monatserste ist, kannst Du einfach ausrechnen, welches der erste Dienstag ist. Das erspart 6/7 aller Prüfungen.
DateTime hast Du richtig erkannt. Schau selbst in die SDK-Doku: zum einen musst Du Dir einen (für Deinen Zweck!) passenden Konstruktor aussuchen; außerdem musst Du nachschauen, welche Methode Dir den Wochentag liefert.
Viel Erfolg! Jürgen
PS. Natürlich gibt es andere Möglichkeiten. Mir ging es vor allem darum zu zeigen, wie Du aus Deiner Aufgabenstellung möglichst direkt zu Code kommst.
Geniuzz - Fr 14.09.07 16:08
Danke,
ich habe es hinbekommen... :)
Hier nun der Code:
C#-Quelltext
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:
| using System; using System.Collections.Generic; using System.Text;
namespace DateTimeTester { class Program {
static void Main(string[] args) { string[] myArr = new string[20];
Console.Write("Geben Sie das Startdatum "); Console.Write("im Format tt.mm.jjjj ein: "); string strDate = Convert.ToString(Console.ReadLine()); strDate = strDate.Replace('.', '/'); DateTime newDate = Convert.ToDateTime(strDate);
Console.Write("Geben Sie das Enddatum "); Console.Write("im Format tt.mm.jjjj ein: "); string endDate = Convert.ToString(Console.ReadLine()); endDate = endDate.Replace('.', '/'); DateTime lastDate = Convert.ToDateTime(endDate);
int start = newDate.Month; int ende = lastDate.Month;
for (int Monate = start; Monate < ende; Monate++) { int x = DateTime.DaysInMonth(newDate.Year, Monate);
for (int y = 1; y <= x; y++) { DateTime g = new DateTime(newDate.Year, Monate, y); if (g.DayOfWeek.ToString() == "Tuesday") { myArr[Monate] = g.ToLongDateString(); } } } foreach (string tag in myArr) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine(tag); } Console.ReadLine(); } } } |
MfG
und vielen dank
Moderiert von
UGrohne: Quote- durch C#-Tags ersetzt
JüTho - Fr 14.09.07 17:14
Hallo,
nach meiner Einschätzung (keine genaue Prüfung, nur Lesen) enthält Dein Code einen gravierenden Fehler (der einen meiner Vorschläge missachtet) und mehrere Punkte, die (teilweise stark) verbessert werden können. Bitte lass mich/uns wissen, wofür und wie lange Du Dich mit C# befassen willst/musst, d.h. ob es Sinn macht, Dir "zukunftsweisende" Tipps zu geben.
Gruß Jürgen
Geniuzz - Mo 17.09.07 17:41
Hallo,
ja ich mache seit dem 01.08 eine Ausbildung zum Fachinformatiker/Anwendungsentwicklung, wir Arbeiten mir c#...
Es wäre klasse wenn irh mir zukunftsweisende Tipps geben könntet!
Vielen Dank
Christian S. - Mo 17.09.07 19:25
Hallo,
bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den
Richtlinien [
http://www.entwickler-ecke.de/richtlinien.html]:
1.2 Beiträge: |
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...] |
Einfach oben bei Deinem ersten Beitrag auf

oder

klicken und den Titel ändern. Danke Dir!
Viele Grüße,
Christian
JüTho - Mo 17.09.07 21:11
OK, dann fange ich einmal an.
Ich hatte gehofft, dass Du den
gravierenden Fehler selbst suchst und findest, aber bitte:
Geniuzz hat folgendes geschrieben: |
ich soll ein kleines Programm schreiben, dass vom gesamten Jahr 2007 jeden ersten Dienstag im Monat heraus findet! |
Nach dieser Aufstellung sollte klar sein, dass Du für jeden Monat genau ein Datum suchst; dieses muss innerhalb der ersten 7 Tage liegen (DaysInMonth ist also überflüssig, sondern der Schlusswert der zweiten Schleife lautet 7); insgesamt gibt es also
12 Ergebnisse. Es gibt keinen Grund, das Array ausgerechnet auf 20 Werte auszurichten.
Grundsätzliche Empfehlung: Gehe in die
SDK-Doku und suche nach passenden Stichworten. Für jede Eigenschaft, Methode oder Ereignis werden die Parameter und Datentypen aufgeführt. Beispielsweise liefert
Console.ReadLine() einen String zurück; ein zusätzliches Convert.ToString ist also überflüssig.
Benutze immer den
passenden Datentyp und vermeide unnötige Konvertierungen. Konkret: Ausgabe-Array für DateTime, newDate und lastDate (hast Du schon richtig vorgesehen, nur die Namen sind nicht einheitlich), DayOfWeek als Enum-Member vergleichen (nicht als String).
Was innerhalb einer
Schleife mehrfach zugewiesen wird, kann bereits außerhalb deklariert werden - hier "int x" und Console.ForegroundColor. (Dann braucht NET nur eine Initialisierung insgesamt statt eine in jedem Durchlauf; das spart bei int natürlich nicht nennenswert.)
Arrays und Listen: Du hast ja selbst schon gemerkt, dass Arrays wegen der festen Größe unpraktisch sind. Unter NET 1.1 steht für variable Arrays die
ArrayList-Klasse zur Verfügung. Unter NET 2.0 sind meistens generische Listen
List<T> zu empfehlen.
Für
Konvertierungen, die auch "schief" gehen können, sind - soweit vorhanden - Methoden mit
TryParse/Parse/ParseExact vorzuziehen, andernfalls try-catch-Konstruktionen.
Dein
Versuch mit String.Replace führt sehr oft nicht weiter, weil Du dann bestimmte Schreibweisen in die Prüfung aufnehmen musst. Andererseits schreibst Du bereits bei der Eingabe die deutsche Art vor, kannst das also auch beim Convert voraussetzen. Für die Konvertierung String => DateTime gibt es übrigens auch die
XmlConvert.ToDateTime-Methode(String, String), bei der das Format genau angegeben werden kann.
Grundsätzlich sind
englischsprachige Bezeichner zu empfehlen. Ich bin zwar auch ein Befürworter der eigenen Sprache; aber deutsche Bezeichner führen sehr schnell zu einem grausamen Mischmasch. Also doch lieber konsequent Englisch nutzen!
Damit ergibt sich etwa folgende Version:
C#-Quelltext
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:
| List<DateTime> myArr = new List<DateTime>();
Console.Write("Geben Sie das Startdatum "); Console.Write("im Format tt.mm.jjjj ein: "); string strDate = Console.ReadLine(); IFormatProvider culture = new CultureInfo("de-DE"); DateTime firstDate = DateTime.ParseExact(strDate, "d", culture);
Console.Write("Geben Sie das Enddatum "); Console.Write("im Format tt.mm.jjjj ein: "); string endDate = Console.ReadLine(); DateTime lastDate = DateTime.ParseExact(endDate, "d", culture);
int start = firstDate.Month; int end = lastDate.Month; DateTime currentDate; for (int month = start; month < ende; month++) { for (int y = 1; y <= 7; y++) { currentDate = new DateTime(newDate.Year, month, y); if (currentDate.DayOfWeek == DayOfWeek.Tuesday) { myArr.Add(currentDate); break; } } } Console.ForegroundColor = ConsoleColor.Blue; foreach(DateTime day in myArr) { Console.WriteLine(day.ToLongDateString()); } Console.ReadKey(); |
Wenn Dir etwas unklar ist: zuerst nachlesen in
OpenBook C# [
http://www.galileocomputing.de/openbook/csharp/] und
OpenBook Visual C# [
http://www.galileocomputing.de/openbook/visual_csharp/] sowie in der SDK-Doku, dann nachfragen.
Gruß und viel Erfolg! Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!